/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.context.notification; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import org.mule.tck.junit4.AbstractMuleTestCase; import org.mule.tck.size.SmallTest; import org.junit.Before; import org.junit.Test; @SmallTest public class NotificationManagerTestCase extends AbstractMuleTestCase { protected Listener1 listener1; protected Listener2 listener2; protected ServerNotificationManager manager; @Before public void setUpListeners() { listener1 = new Listener1(); listener2 = new Listener2(); manager = new ServerNotificationManager(); } protected void registerDefaultEvents() throws ClassNotFoundException { manager.addInterfaceToType(Listener1.class, SubEvent1.class); manager.addInterfaceToType(Listener2.class, Event2.class); } @Test public void testNoListenersMeansNoEvents() throws ClassNotFoundException { registerDefaultEvents(); assertNoEventsEnabled(); } protected void assertNoEventsEnabled() { assertFalse(manager.isNotificationEnabled(Event1.class)); assertFalse(manager.isNotificationEnabled(SubEvent1.class)); assertFalse(manager.isNotificationEnabled(SubSubEvent1.class)); assertFalse(manager.isNotificationEnabled(Event2.class)); assertFalse(manager.isNotificationEnabled(SubEvent2.class)); assertFalse(manager.isNotificationEnabled(Event3.class)); } protected void registerDefaultListeners() { manager.addListenerSubscription(listener1, "id1"); manager.addListener(listener2); } @Test public void testAssociationOfInterfacesAndEvents() throws ClassNotFoundException { registerDefaultEvents(); registerDefaultListeners(); assertStandardEventsEnabled(); } protected void assertStandardEventsEnabled() { assertTrue("via subclass", manager.isNotificationEnabled(Event1.class)); assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class)); assertTrue("via superclass", manager.isNotificationEnabled(SubSubEvent1.class)); assertTrue("direct", manager.isNotificationEnabled(Event2.class)); assertTrue("via superclass", manager.isNotificationEnabled(SubEvent2.class)); assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class)); } @Test public void testDynamicResponseToDisablingEvents() throws ClassNotFoundException { registerDefaultEvents(); registerDefaultListeners(); assertStandardEventsEnabled(); // now disable event 2 manager.disableType(Event2.class); assertTrue("via subclass", manager.isNotificationEnabled(Event1.class)); assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class)); assertFalse("disabled", manager.isNotificationEnabled(Event2.class)); assertFalse("no listener", manager.isNotificationEnabled(SubEvent2.class)); assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class)); // the subclass should be blocked too manager.addInterfaceToType(Listener2.class, SubEvent2.class); assertTrue("via subclass", manager.isNotificationEnabled(Event1.class)); assertTrue("direct", manager.isNotificationEnabled(SubEvent1.class)); assertFalse("disabled", manager.isNotificationEnabled(Event2.class)); assertFalse("disabled", manager.isNotificationEnabled(SubEvent2.class)); assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class)); } @Test public void testDynamicResponseToDisablingInterfaces() throws ClassNotFoundException { registerDefaultEvents(); registerDefaultListeners(); assertStandardEventsEnabled(); // now disable listener 1 manager.disableInterface(Listener1.class); assertFalse("via subclass, but no listener", manager.isNotificationEnabled(Event1.class)); assertFalse("disabled", manager.isNotificationEnabled(SubEvent1.class)); assertFalse("via superclass, but no listener", manager.isNotificationEnabled(SubSubEvent1.class)); assertTrue("direct", manager.isNotificationEnabled(Event2.class)); assertTrue("via superclass", manager.isNotificationEnabled(SubEvent2.class)); assertFalse("not specified at all", manager.isNotificationEnabled(Event3.class)); } /** * A new policy should only be generated when the configuration changes */ @Test public void testPolicyCaching() throws ClassNotFoundException { registerDefaultEvents(); registerDefaultListeners(); Policy policy = manager.getPolicy(); assertStandardEventsEnabled(); assertSame(policy, manager.getPolicy()); manager.disableType(Event2.class); assertNotSame(policy, manager.getPolicy()); } @Test public void testDynamicManagerDecisions() throws ClassNotFoundException { registerDefaultEvents(); registerDefaultListeners(); manager.setNotificationDynamic(true); OptimisedNotificationHandler decision = new OptimisedNotificationHandler(manager, Event2.class); assertTrue(decision.isNotificationEnabled(Event2.class)); manager.disableType(Event2.class); assertFalse(decision.isNotificationEnabled(Event2.class)); } /** * When the manager is not dynamic (the default), decisions should not change */ @Test public void testNonDynamicManagerDecisions() throws ClassNotFoundException { registerDefaultEvents(); registerDefaultListeners(); OptimisedNotificationHandler decision = new OptimisedNotificationHandler(manager, Event2.class); assertTrue(decision.isNotificationEnabled(Event2.class)); manager.disableType(Event2.class); assertTrue(decision.isNotificationEnabled(Event2.class)); } @Test public void testNotification() throws ClassNotFoundException { registerDefaultEvents(); registerDefaultListeners(); assertNoListenersNotified(); manager.notifyListeners(new Event1(), (listener, nfn) -> listener.onNotification(nfn)); assertNoListenersNotified(); manager.notifyListeners(new SubEvent1(), (listener, nfn) -> listener.onNotification(nfn)); assertNoListenersNotified(); manager.notifyListeners(new Event1("id1"), (listener, nfn) -> listener.onNotification(nfn)); assertNoListenersNotified(); manager.notifyListeners(new SubSubEvent1("id1"), (listener, nfn) -> listener.onNotification(nfn)); assertTrue(listener1.isNotified()); assertFalse(listener2.isNotified()); manager.notifyListeners(new Event2(), (listener, nfn) -> listener.onNotification(nfn)); assertTrue(listener1.isNotified()); assertTrue(listener2.isNotified()); } protected void assertNoListenersNotified() { assertFalse(listener1.isNotified()); assertFalse(listener2.isNotified()); } }