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
25
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);
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);
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 }