View Javadoc

1   /*
2    * $Id: NotificationManagerTestCase.java 20321 2010-11-24 15:21:24Z dfeist $
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.AbstractMuleTestCase;
14  
15  public class NotificationManagerTestCase extends AbstractMuleTestCase
16  {
17  
18      protected Listener1 listener1;
19      protected Listener2 listener2;
20      protected ServerNotificationManager manager;
21  
22      protected void doSetUp() throws Exception
23      {
24          listener1 = new Listener1();
25          listener2 = new Listener2();
26          manager = new ServerNotificationManager();
27      }
28  
29      protected void registerDefaultEvents() throws ClassNotFoundException
30      {
31          manager.addInterfaceToType(Listener1.class, SubEvent1.class);
32          manager.addInterfaceToType(Listener2.class, Event2.class);
33      }
34  
35      public void testNoListenersMeansNoEvents() throws ClassNotFoundException
36      {
37          registerDefaultEvents();
38          assertNoEventsEnabled();
39      }
40  
41      protected void assertNoEventsEnabled()
42      {
43          assertFalse(manager.isNotificationEnabled(Event1.class));
44          assertFalse(manager.isNotificationEnabled(SubEvent1.class));
45          assertFalse(manager.isNotificationEnabled(SubSubEvent1.class));
46          assertFalse(manager.isNotificationEnabled(Event2.class));
47          assertFalse(manager.isNotificationEnabled(SubEvent2.class));
48          assertFalse(manager.isNotificationEnabled(Event3.class));
49      }
50  
51      protected void registerDefaultListeners()
52      {
53          manager.addListenerSubscription(listener1, "id1");
54          manager.addListener(listener2);
55      }
56  
57      public void testAssociationOfInterfacesAndEvents() throws ClassNotFoundException
58      {
59          registerDefaultEvents();
60          registerDefaultListeners();
61          assertStandardEventsEnabled();
62      }
63  
64      protected void assertStandardEventsEnabled()
65      {
66          assertTrue("via subclass", manager.isNotificationEnabled(Event1.class));
67          assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class));
68          assertTrue("via superclass", manager.isNotificationEnabled(SubSubEvent1.class));
69          assertTrue("direct", manager.isNotificationEnabled(Event2.class));
70          assertTrue("via superclass", manager.isNotificationEnabled(SubEvent2.class));
71          assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class));
72      }
73  
74      public void testDynamicResponseToDisablingEvents() throws ClassNotFoundException
75      {
76          registerDefaultEvents();
77          registerDefaultListeners();
78          assertStandardEventsEnabled();
79          // now disable event 2
80          manager.disableType(Event2.class);
81          assertTrue("via subclass", manager.isNotificationEnabled(Event1.class));
82          assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class));
83          assertFalse("disabled", manager.isNotificationEnabled(Event2.class));
84          assertFalse("no listener", manager.isNotificationEnabled(SubEvent2.class));
85          assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class));
86          // the subclass should be blocked too
87          manager.addInterfaceToType(Listener2.class, SubEvent2.class);
88          assertTrue("via subclass", manager.isNotificationEnabled(Event1.class));
89          assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class));
90          assertFalse("disabled", manager.isNotificationEnabled(Event2.class));
91          assertFalse("disabled", manager.isNotificationEnabled(SubEvent2.class));
92          assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class));
93      }
94  
95      public void testDynamicResponseToDisablingInterfaces() throws ClassNotFoundException
96      {
97          registerDefaultEvents();
98          registerDefaultListeners();
99          assertStandardEventsEnabled();
100         // now disable listener 1
101         manager.disableInterface(Listener1.class);
102         assertFalse("via subclass, but no listener", manager.isNotificationEnabled(Event1.class));
103         assertFalse("disabled", manager.isNotificationEnabled(SubEvent1.class));
104         assertFalse("via superclass, but no listener", manager.isNotificationEnabled(SubSubEvent1.class));
105         assertTrue("direct", manager.isNotificationEnabled(Event2.class));
106         assertTrue("via superclass", manager.isNotificationEnabled(SubEvent2.class));
107         assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class));
108     }
109 
110     /**
111      * A new policy should only be generated when the configuration changes
112      */
113     public void testPolicyCaching() throws ClassNotFoundException
114     {
115         registerDefaultEvents();
116         registerDefaultListeners();
117         Policy policy = manager.getPolicy();
118         assertStandardEventsEnabled();
119         assertSame(policy, manager.getPolicy());
120         manager.disableType(Event2.class);
121         assertNotSame(policy, manager.getPolicy());
122     }
123 
124     public void testDynamicManagerDecisions() throws ClassNotFoundException
125     {
126         registerDefaultEvents();
127         registerDefaultListeners();
128         manager.setNotificationDynamic(true);
129         OptimisedNotificationHandler decision = new OptimisedNotificationHandler(manager, Event2.class);
130         assertTrue(decision.isNotificationEnabled(Event2.class));
131         manager.disableType(Event2.class);
132         assertFalse(decision.isNotificationEnabled(Event2.class));
133     }
134 
135     /**
136      * When the manager is not dynamic (the default), decisions should not change
137      */
138     public void testNonDynamicManagerDecisions() throws ClassNotFoundException
139     {
140         registerDefaultEvents();
141         registerDefaultListeners();
142         OptimisedNotificationHandler decision = new OptimisedNotificationHandler(manager, Event2.class);
143         assertTrue(decision.isNotificationEnabled(Event2.class));
144         manager.disableType(Event2.class);
145         assertTrue(decision.isNotificationEnabled(Event2.class));
146     }
147 
148     public void testNotification() throws ClassNotFoundException
149     {
150         registerDefaultEvents();
151         registerDefaultListeners();
152         assertNoListenersNotified();
153         manager.notifyListeners(new Event1());
154         assertNoListenersNotified();
155         manager.notifyListeners(new SubEvent1());
156         assertNoListenersNotified();
157         manager.notifyListeners(new Event1("id1"));
158         assertNoListenersNotified();
159         manager.notifyListeners(new SubSubEvent1("id1"));
160         assertTrue(listener1.isNotified());
161         assertFalse(listener2.isNotified());
162         manager.notifyListeners(new Event2());
163         assertTrue(listener1.isNotified());
164         assertTrue(listener2.isNotified());
165     }
166 
167     protected void assertNoListenersNotified()
168     {
169         assertFalse(listener1.isNotified());
170         assertFalse(listener2.isNotified());
171     }
172 
173 }