View Javadoc

1   package com.atlassian.event.internal;
2   
3   import com.atlassian.event.Event;
4   import com.atlassian.event.EventListener;
5   import com.atlassian.event.EventManager;
6   import com.atlassian.event.api.EventPublisher;
7   import com.atlassian.event.legacy.LegacyEventManager;
8   import org.junit.After;
9   import org.junit.Before;
10  import org.junit.Test;
11  
12  import static com.atlassian.event.internal._TestEvent.TestInterface;
13  import static com.atlassian.event.internal._TestEvent.TestInterfacedEvent;
14  import static com.atlassian.event.internal._TestEvent.TestSubEvent;
15  import static com.atlassian.event.internal._TestEvent.TestSubSubEvent;
16  import static org.mockito.Matchers.any;
17  import static org.mockito.Mockito.mock;
18  import static org.mockito.Mockito.never;
19  import static org.mockito.Mockito.times;
20  import static org.mockito.Mockito.verify;
21  import static org.mockito.Mockito.when;
22  
23  /**
24   * <strong>Note:</strong> This is more of a (small) integration test as we use a concrete {@link com.atlassian.event.legacy.LegacyListenerHandler}
25   * at runtime here (and not a stub/mock). It essentially ensure that we get the same behavior at the legacy event manager.
26   */
27  @SuppressWarnings("deprecation")
28  public abstract class AbstractEventPublisherLegacyCompatibilityTest {
29      private EventManager eventManager;
30      private EventPublisher eventPublisher;
31  
32      @Before
33      public final void setUp() {
34          eventPublisher = getEventPublisher();
35          eventManager = new LegacyEventManager(eventPublisher);
36      }
37  
38      abstract EventPublisher getEventPublisher();
39  
40      @After
41      public final void tearDown() throws Exception {
42          eventManager = null;
43          eventPublisher = null;
44      }
45  
46      @Test(expected = NullPointerException.class)
47      public final void testPublishNullEvent() {
48          eventManager.publishEvent(null);
49      }
50  
51      @Test
52      public final void testRegisterListener() {
53          final Event event = new _TestEvent(this);
54          final EventListener listener = getListener(_TestEvent.class);
55  
56          eventManager.registerListener("key", listener);
57  
58          verifyEventReceived(event, listener);
59      }
60  
61      @Test
62      public final void testListenerWithoutMatchingEventClass() {
63          final Event event = getEvent();
64          final EventListener listener = getListener(_TestEvent.class);
65  
66          eventManager.registerListener("key1", listener);
67          eventManager.publishEvent(event);
68  
69          verify(listener, never()).handleEvent(event);
70      }
71  
72      @Test
73      public final void testUnregisterListener() {
74          final Event event = new _TestEvent(this);
75          final EventListener listener = getListener(_TestEvent.class);
76  
77          eventManager.registerListener("key", listener);
78          eventManager.publishEvent(event);
79          eventPublisher.publish(event);
80  
81          verify(listener, times(2)).handleEvent(event);
82  
83          eventManager.unregisterListener("key");
84          eventManager.publishEvent(event);
85          eventPublisher.publish(event);
86  
87          verify(listener, times(2)).handleEvent(event); // i.e it's no called again
88      }
89  
90      @Test
91      public final void testListensForEverything() {
92          final Event event = new _TestEvent(this);
93          final EventListener listener = getListener();
94  
95          eventManager.registerListener("key", listener);
96          verifyEventReceived(event, listener);
97      }
98  
99      @Test
100     public final void testListensForEverythingDoesNotReceiveNonEventClasses() {
101         final EventListener listener = getListener();
102 
103         eventManager.registerListener("key", listener);
104         eventPublisher.publish("Cheese");
105 
106         verify(listener, never()).handleEvent(any(Event.class));
107     }
108 
109     @Test
110     public final void testRemoveNonExistentListener() {
111         final EventListener listener = getListener(Event.class);
112 
113         eventManager.registerListener("key", listener);
114         eventManager.unregisterListener("this.key.is.not.registered");
115     }
116 
117     @Test
118     public final void testDuplicateKeysForListeners() {
119         final String key = "key1";
120         final Event event = new _TestEvent(this);
121         final EventListener listener1 = getListener(_TestEvent.class);
122         final EventListener listener2 = getListener(_TestEvent.class);
123 
124         eventManager.registerListener(key, listener1);
125         eventManager.registerListener(key, listener2);
126 
127         eventManager.publishEvent(event);
128         eventPublisher.publish(event);
129 
130         verify(listener1, never()).handleEvent(event);
131         verify(listener2, times(2)).handleEvent(event);
132 
133         eventManager.unregisterListener(key);
134         eventManager.publishEvent(event);
135         eventPublisher.publish(event);
136 
137         verify(listener1, never()).handleEvent(event);
138         verify(listener2, times(2)).handleEvent(event); // i.e. it's not been called again
139     }
140 
141     @Test(expected = NullPointerException.class)
142     public final void testAddValidKeyWithNullListener() {
143         eventManager.registerListener("key1", null);
144     }
145 
146     @Test
147     public final void testInterfacesHandled() throws Exception {
148         final Event event = new TestInterfacedEvent(this);
149         final EventListener listener = getListener(TestInterface.class);
150 
151         eventManager.registerListener("key1", listener);
152         verifyEventReceived(event, listener);
153     }
154 
155     @Test
156     public final void testChildrenHandled() throws Exception {
157         final Event event = new TestSubEvent(this);
158         final EventListener listener = getListener(_TestEvent.class);
159 
160         eventManager.registerListener("key1", listener);
161         verifyEventReceived(event, listener);
162     }
163 
164     @Test
165     public final void testGrandChildrenHandled() throws Exception {
166         final Event event = new TestSubSubEvent(this);
167         final EventListener listener = getListener(_TestEvent.class);
168 
169         eventManager.registerListener("key1", listener);
170         verifyEventReceived(event, listener);
171     }
172 
173     @Test
174     public final void testOneEventForTwoHandledClasses() {
175         final Event event = new TestSubSubEvent(this);
176         final EventListener listener = getListener(_TestEvent.class, TestSubEvent.class);
177 
178         eventManager.registerListener("key1", listener);
179         eventManager.publishEvent(event);
180 
181         verify(listener, times(1)).handleEvent(event);
182     }
183 
184     private void verifyEventReceived(final Event event, final EventListener listener) {
185         eventManager.publishEvent(event);
186         eventPublisher.publish(event);
187         verify(listener, times(2)).handleEvent(event);
188     }
189 
190     protected Event getEvent() {
191         return new Event(this) {
192         };
193     }
194 
195     protected EventListener getListener(final Class<?>... classes) {
196         final EventListener listener = mock(EventListener.class);
197         when(listener.getHandledEventClasses()).thenReturn(classes);
198         return listener;
199     }
200 
201 }