/atlassian-plugins-core/src/test/java/com/atlassian/plugin/event/impl/TestDefaultPluginEventManager.java

https://bitbucket.org/purewind/atlassian-plugins · Java · 181 lines · 150 code · 26 blank · 5 comment · 0 complexity · 3067f8df164f6e44886787513f5e7909 MD5 · raw file

  1. package com.atlassian.plugin.event.impl;
  2. import com.atlassian.event.api.EventListener;
  3. import com.atlassian.event.api.EventPublisher;
  4. import com.atlassian.plugin.event.PluginEventListener;
  5. import org.junit.After;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import org.junit.runner.RunWith;
  9. import org.mockito.Mock;
  10. import org.mockito.runners.MockitoJUnitRunner;
  11. import java.lang.reflect.Method;
  12. import static org.hamcrest.core.IsNull.notNullValue;
  13. import static org.junit.Assert.assertEquals;
  14. import static org.junit.Assert.assertThat;
  15. import static org.junit.Assert.fail;
  16. import static org.mockito.Matchers.anyObject;
  17. import static org.mockito.Matchers.anyString;
  18. import static org.mockito.Mockito.mock;
  19. import static org.mockito.Mockito.never;
  20. import static org.mockito.Mockito.times;
  21. import static org.mockito.Mockito.verify;
  22. @RunWith(MockitoJUnitRunner.class)
  23. public class TestDefaultPluginEventManager {
  24. private final Object someObject = new Object();
  25. private final String someString = "string";
  26. @Mock
  27. private MethodTestListener methodTestListener;
  28. private DefaultPluginEventManager defaultPluginEventManager;
  29. @Before
  30. public void createDefaultPluginEventManager() {
  31. defaultPluginEventManager = new DefaultPluginEventManager();
  32. assertThat(defaultPluginEventManager.getEventPublisher(), notNullValue(EventPublisher.class));
  33. }
  34. @After
  35. public void discardDefaultPluginEventManager() {
  36. defaultPluginEventManager = null;
  37. }
  38. @Test
  39. public void broadcastCallsListenerChannelForType() {
  40. defaultPluginEventManager.register(methodTestListener);
  41. defaultPluginEventManager.broadcast(someObject);
  42. verify(methodTestListener).channel(someObject);
  43. verify(methodTestListener, never()).channel(anyString());
  44. }
  45. @Test
  46. public void broadcastCallsListenerChannelForSupertype() {
  47. final Integer someInteger = 0;
  48. defaultPluginEventManager.register(methodTestListener);
  49. defaultPluginEventManager.broadcast(someInteger);
  50. verify(methodTestListener).channel(someInteger);
  51. verify(methodTestListener, never()).channel(anyString());
  52. }
  53. @Test
  54. public void broadcastCallsListenerChannelForTypeAndSupertype() {
  55. defaultPluginEventManager.register(methodTestListener);
  56. defaultPluginEventManager.broadcast(someString);
  57. // The cast ensures we verify both overloads are called
  58. verify(methodTestListener).channel((Object) someString);
  59. verify(methodTestListener).channel(someString);
  60. }
  61. @Test
  62. public void listenerCalledOnceEvenIfRegisteredTwice() {
  63. defaultPluginEventManager.register(methodTestListener);
  64. defaultPluginEventManager.register(methodTestListener);
  65. defaultPluginEventManager.broadcast(someObject);
  66. verify(methodTestListener).channel(someObject);
  67. verify(methodTestListener, never()).channel(anyString());
  68. }
  69. @Test
  70. public void registerUnmatchingListenerThrows() {
  71. BadListener badListener = mock(BadListener.class);
  72. try {
  73. defaultPluginEventManager.register(badListener);
  74. fail();
  75. } catch (IllegalArgumentException ex) {
  76. // test passed
  77. }
  78. verify(badListener, never()).someMethod();
  79. }
  80. @Test
  81. public void customSelectorMatchesAndOverridesDefault() {
  82. ListenerMethodSelector onEventSelector = new ListenerMethodSelector() {
  83. public boolean isListenerMethod(Method method) {
  84. return "onEvent".equals(method.getName());
  85. }
  86. };
  87. defaultPluginEventManager = new DefaultPluginEventManager(onEventSelector);
  88. defaultPluginEventManager.register(methodTestListener);
  89. defaultPluginEventManager.broadcast(someString);
  90. verify(methodTestListener).onEvent(someString);
  91. verify(methodTestListener, never()).channel(anyObject());
  92. verify(methodTestListener, never()).channel(anyString());
  93. }
  94. @Test
  95. public void overlappingSelectorsBothMatch() {
  96. ListenerMethodSelector firstSelector = new MethodNameListenerMethodSelector();
  97. ListenerMethodSelector secondSelector = new MethodNameListenerMethodSelector();
  98. defaultPluginEventManager = new DefaultPluginEventManager(firstSelector, secondSelector);
  99. defaultPluginEventManager.register(methodTestListener);
  100. defaultPluginEventManager.broadcast(someObject);
  101. verify(methodTestListener, times(2)).channel(someObject);
  102. }
  103. @Test
  104. public void broadcastCallsAnnotatedMethods() {
  105. // I don't believe this can be done with mocks, because the stub
  106. // is not annotated, and i don't see a way of getting it annotated.
  107. AnnotationTestListener listener = new AnnotationTestListener();
  108. defaultPluginEventManager.register(listener);
  109. defaultPluginEventManager.broadcast(someObject);
  110. assertEquals(1, listener.eventListenerCalled);
  111. assertEquals(1, listener.pluginEventListenerCalled);
  112. }
  113. @Test
  114. public void unregisterStopsBroadcastSendingEvents() {
  115. defaultPluginEventManager.register(methodTestListener);
  116. defaultPluginEventManager.broadcast(someObject);
  117. verify(methodTestListener).channel(someObject);
  118. defaultPluginEventManager.unregister(methodTestListener);
  119. defaultPluginEventManager.broadcast(someObject);
  120. // This checks it was called once, i.e. first broadcast
  121. verify(methodTestListener).channel(someObject);
  122. }
  123. @Test(expected = IllegalArgumentException.class)
  124. public void registerNullThrows() {
  125. defaultPluginEventManager.register(null);
  126. }
  127. @Test(expected = IllegalArgumentException.class)
  128. public void unregisterNullThrows() {
  129. defaultPluginEventManager.unregister(null);
  130. }
  131. public static class AnnotationTestListener {
  132. int pluginEventListenerCalled = 0;
  133. int eventListenerCalled = 0;
  134. @PluginEventListener
  135. public void doEventOld(Object obj) {
  136. ++pluginEventListenerCalled;
  137. }
  138. @EventListener
  139. public void doEventNew(Object obj) {
  140. ++eventListenerCalled;
  141. }
  142. }
  143. public static class MethodTestListener {
  144. public void channel(Object object) {
  145. }
  146. public void channel(String string) {
  147. }
  148. public void onEvent(String string) {
  149. }
  150. }
  151. public static class BadListener {
  152. public void someMethod() {
  153. }
  154. }
  155. }