View Javadoc

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