View Javadoc

1   package com.atlassian.event.internal;
2   
3   import com.atlassian.event.api.EventListener;
4   import com.atlassian.event.api.EventPublisher;
5   import com.google.common.collect.Lists;
6   import org.junit.After;
7   import org.junit.Before;
8   import org.junit.Test;
9   
10  import java.util.List;
11  
12  import static junit.framework.Assert.assertEquals;
13  import static junit.framework.Assert.assertSame;
14  import static org.junit.Assert.assertTrue;
15  
16  public abstract class AbstractEventPublisherAnnotatedListenerMethodTest {
17      private EventPublisher eventPublisher;
18  
19      @Before
20      public final void setUp() {
21          eventPublisher = getEventPublisherForTest();
22      }
23  
24      abstract EventPublisher getEventPublisherForTest();
25  
26      @After
27      public final void tearDown() throws Exception {
28          eventPublisher = null;
29      }
30  
31      @Test(expected = NullPointerException.class)
32      public final void testPublishNullEvent() {
33          eventPublisher.publish(null);
34      }
35  
36      @Test
37      public final void testRegisterListener() {
38          final Object event = new _TestEvent(this);
39          final TestListener listener = new TestListener();
40  
41          eventPublisher.register(listener);
42          eventPublisher.publish(event);
43  
44          assertEquals(1, listener.testEvents.size());
45          assertSame(event, listener.testEvents.get(0));
46      }
47  
48      @Test
49      public final void testListenerWithoutMatchingEventClass() {
50          final TestListener listener = new TestListener();
51  
52          eventPublisher.register(listener);
53          eventPublisher.publish(new Object());
54  
55          assertTrue(listener.testEvents.isEmpty());
56      }
57  
58      @Test
59      public final void testUnRegisterListener() {
60          final Object event = new _TestEvent(this);
61          final TestListener listener = new TestListener();
62  
63          eventPublisher.register(listener);
64          eventPublisher.publish(event);
65  
66          assertEquals(1, listener.testEvents.size());
67          assertSame(event, listener.testEvents.get(0));
68  
69          eventPublisher.unregister(listener);
70          eventPublisher.publish(event);
71  
72          assertEquals(1, listener.testEvents.size()); // not called anymore
73      }
74  
75      @Test
76      public final void testUnRegisterAll() {
77          final Object event = new _TestEvent(this);
78          final TestListener listener = new TestListener();
79  
80          eventPublisher.register(listener);
81          eventPublisher.publish(event);
82  
83          assertEquals(1, listener.testEvents.size());
84          assertSame(event, listener.testEvents.get(0));
85  
86          eventPublisher.unregisterAll();
87          eventPublisher.publish(event);
88  
89          assertEquals(1, listener.testEvents.size()); // not called anymore
90      }
91  
92      @Test
93      public final void testInterfacesHandled() throws Exception {
94          final Object event = new AnInterface() {
95          };
96          final TestListener listener = new TestListener();
97  
98          eventPublisher.register(listener);
99          eventPublisher.publish(event);
100 
101         assertEquals(1, listener.testInterfaceEvents.size());
102         assertSame(event, listener.testInterfaceEvents.get(0));
103     }
104 
105     @Test
106     public final void testChildrenHandled() throws Exception {
107         final Object event = new SubTestEvent(this);
108         final TestListener listener = new TestListener();
109 
110         eventPublisher.register(listener);
111         eventPublisher.publish(event);
112 
113         assertEquals(1, listener.testEvents.size());
114         assertSame(event, listener.testEvents.get(0));
115     }
116 
117     @Test
118     public final void testAllHandlersInvokedWhenExceptionEncountered() throws Exception {
119         final Object event = new SubTestEvent(this);
120         final TestListener listenerBefore = new TestListener();
121         final TestListenerThatThrowsException listenerThatThrowsException = new TestListenerThatThrowsException();
122         final TestListener listenerAfter = new TestListener();
123 
124         eventPublisher.register(listenerBefore);
125         eventPublisher.register(listenerThatThrowsException);
126         eventPublisher.register(listenerAfter);
127         eventPublisher.publish(event);
128 
129         assertEquals(1, listenerBefore.testEvents.size());
130         assertEquals(1, listenerThatThrowsException.testEvents.size());
131         assertEquals(1, listenerAfter.testEvents.size());
132     }
133 
134     private static class TestListener {
135         protected final List<Object> testEvents = Lists.newArrayList();
136         protected final List<Object> testInterfaceEvents = Lists.newArrayList();
137 
138         @SuppressWarnings("unused")
139         @EventListener
140         public void onEvent(final _TestEvent event) {
141             testEvents.add(event);
142         }
143 
144         @SuppressWarnings("unused")
145         @EventListener
146         public void onInterface(final AnInterface event) {
147             testInterfaceEvents.add(event);
148         }
149     }
150 
151     private static class TestListenerThatThrowsException extends TestListener {
152         @SuppressWarnings("unused")
153         @EventListener
154         @Override
155         public void onEvent(final _TestEvent event) {
156             super.onEvent(event);
157             throw new RuntimeException("event exception");
158         }
159 
160         @SuppressWarnings("unused")
161         @EventListener
162         @Override
163         public void onInterface(final AnInterface event) {
164             super.onInterface(event);
165             throw new RuntimeException("event interface exception");
166         }
167     }
168 
169     private static interface AnInterface {
170     }
171 
172     private static class SubTestEvent extends _TestEvent {
173         public SubTestEvent(final Object src) {
174             super(src);
175         }
176     }
177 }