View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.context.notification;
8   
9   import org.mule.tck.junit4.AbstractMuleTestCase;
10  
11  import org.junit.Before;
12  import org.junit.Test;
13  
14  import static org.junit.Assert.assertFalse;
15  import static org.junit.Assert.assertNotSame;
16  import static org.junit.Assert.assertSame;
17  import static org.junit.Assert.assertTrue;
18  
19  public class NotificationManagerTestCase extends AbstractMuleTestCase
20  {
21  
22      protected Listener1 listener1;
23      protected Listener2 listener2;
24      protected ServerNotificationManager manager;
25  
26      @Before
27      public void setUpListeners()
28      {
29          listener1 = new Listener1();
30          listener2 = new Listener2();
31          manager = new ServerNotificationManager();
32      }
33  
34      protected void registerDefaultEvents() throws ClassNotFoundException
35      {
36          manager.addInterfaceToType(Listener1.class, SubEvent1.class);
37          manager.addInterfaceToType(Listener2.class, Event2.class);
38      }
39  
40      @Test
41      public void testNoListenersMeansNoEvents() throws ClassNotFoundException
42      {
43          registerDefaultEvents();
44          assertNoEventsEnabled();
45      }
46  
47      protected void assertNoEventsEnabled()
48      {
49          assertFalse(manager.isNotificationEnabled(Event1.class));
50          assertFalse(manager.isNotificationEnabled(SubEvent1.class));
51          assertFalse(manager.isNotificationEnabled(SubSubEvent1.class));
52          assertFalse(manager.isNotificationEnabled(Event2.class));
53          assertFalse(manager.isNotificationEnabled(SubEvent2.class));
54          assertFalse(manager.isNotificationEnabled(Event3.class));
55      }
56  
57      protected void registerDefaultListeners()
58      {
59          manager.addListenerSubscription(listener1, "id1");
60          manager.addListener(listener2);
61      }
62  
63      @Test
64      public void testAssociationOfInterfacesAndEvents() throws ClassNotFoundException
65      {
66          registerDefaultEvents();
67          registerDefaultListeners();
68          assertStandardEventsEnabled();
69      }
70  
71      protected void assertStandardEventsEnabled()
72      {
73          assertTrue("via subclass", manager.isNotificationEnabled(Event1.class));
74          assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class));
75          assertTrue("via superclass", manager.isNotificationEnabled(SubSubEvent1.class));
76          assertTrue("direct", manager.isNotificationEnabled(Event2.class));
77          assertTrue("via superclass", manager.isNotificationEnabled(SubEvent2.class));
78          assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class));
79      }
80  
81      @Test
82      public void testDynamicResponseToDisablingEvents() throws ClassNotFoundException
83      {
84          registerDefaultEvents();
85          registerDefaultListeners();
86          assertStandardEventsEnabled();
87          // now disable event 2
88          manager.disableType(Event2.class);
89          assertTrue("via subclass", manager.isNotificationEnabled(Event1.class));
90          assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class));
91          assertFalse("disabled", manager.isNotificationEnabled(Event2.class));
92          assertFalse("no listener", manager.isNotificationEnabled(SubEvent2.class));
93          assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class));
94          // the subclass should be blocked too
95          manager.addInterfaceToType(Listener2.class, SubEvent2.class);
96          assertTrue("via subclass", manager.isNotificationEnabled(Event1.class));
97          assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class));
98          assertFalse("disabled", manager.isNotificationEnabled(Event2.class));
99          assertFalse("disabled", manager.isNotificationEnabled(SubEvent2.class));
100         assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class));
101     }
102 
103     @Test
104     public void testDynamicResponseToDisablingInterfaces() throws ClassNotFoundException
105     {
106         registerDefaultEvents();
107         registerDefaultListeners();
108         assertStandardEventsEnabled();
109         // now disable listener 1
110         manager.disableInterface(Listener1.class);
111         assertFalse("via subclass, but no listener", manager.isNotificationEnabled(Event1.class));
112         assertFalse("disabled", manager.isNotificationEnabled(SubEvent1.class));
113         assertFalse("via superclass, but no listener", manager.isNotificationEnabled(SubSubEvent1.class));
114         assertTrue("direct", manager.isNotificationEnabled(Event2.class));
115         assertTrue("via superclass", manager.isNotificationEnabled(SubEvent2.class));
116         assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class));
117     }
118 
119     /**
120      * A new policy should only be generated when the configuration changes
121      */
122     @Test
123     public void testPolicyCaching() throws ClassNotFoundException
124     {
125         registerDefaultEvents();
126         registerDefaultListeners();
127         Policy policy = manager.getPolicy();
128         assertStandardEventsEnabled();
129         assertSame(policy, manager.getPolicy());
130         manager.disableType(Event2.class);
131         assertNotSame(policy, manager.getPolicy());
132     }
133 
134     @Test
135     public void testDynamicManagerDecisions() throws ClassNotFoundException
136     {
137         registerDefaultEvents();
138         registerDefaultListeners();
139         manager.setNotificationDynamic(true);
140         OptimisedNotificationHandler decision = new OptimisedNotificationHandler(manager, Event2.class);
141         assertTrue(decision.isNotificationEnabled(Event2.class));
142         manager.disableType(Event2.class);
143         assertFalse(decision.isNotificationEnabled(Event2.class));
144     }
145 
146     /**
147      * When the manager is not dynamic (the default), decisions should not change
148      */
149     @Test
150     public void testNonDynamicManagerDecisions() throws ClassNotFoundException
151     {
152         registerDefaultEvents();
153         registerDefaultListeners();
154         OptimisedNotificationHandler decision = new OptimisedNotificationHandler(manager, Event2.class);
155         assertTrue(decision.isNotificationEnabled(Event2.class));
156         manager.disableType(Event2.class);
157         assertTrue(decision.isNotificationEnabled(Event2.class));
158     }
159 
160     @Test
161     public void testNotification() throws ClassNotFoundException
162     {
163         registerDefaultEvents();
164         registerDefaultListeners();
165         assertNoListenersNotified();
166         manager.notifyListeners(new Event1());
167         assertNoListenersNotified();
168         manager.notifyListeners(new SubEvent1());
169         assertNoListenersNotified();
170         manager.notifyListeners(new Event1("id1"));
171         assertNoListenersNotified();
172         manager.notifyListeners(new SubSubEvent1("id1"));
173         assertTrue(listener1.isNotified());
174         assertFalse(listener2.isNotified());
175         manager.notifyListeners(new Event2());
176         assertTrue(listener1.isNotified());
177         assertTrue(listener2.isNotified());
178     }
179 
180     protected void assertNoListenersNotified()
181     {
182         assertFalse(listener1.isNotified());
183         assertFalse(listener2.isNotified());
184     }
185 
186 }