diff --git a/pom.xml b/pom.xml index b0b6241..f58d6d8 100644 --- a/pom.xml +++ b/pom.xml @@ -148,6 +148,10 @@ maven-surefire-plugin false + + + AllTests.java + diff --git a/src/test/java/net/engio/mbassy/AllTests.java b/src/test/java/net/engio/mbassy/AllTests.java index 00c586e..9d36099 100644 --- a/src/test/java/net/engio/mbassy/AllTests.java +++ b/src/test/java/net/engio/mbassy/AllTests.java @@ -1,6 +1,5 @@ package net.engio.mbassy; -import net.engio.mbassy.bus.ListenerSubscriptionTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -19,9 +18,8 @@ import org.junit.runners.Suite; SyncBusTest.SyncMessageBusTest.class, FilterTest.class, MetadataReaderTest.class, - ListenerSubscriptionTest.class, MethodDispatchTest.class, - DeadEventTest.class, + DeadMessageTest.class, SynchronizedHandlerTest.class, SubscriptionManagerTest.class }) diff --git a/src/test/java/net/engio/mbassy/DeadEventTest.java b/src/test/java/net/engio/mbassy/DeadEventTest.java deleted file mode 100644 index 5f84127..0000000 --- a/src/test/java/net/engio/mbassy/DeadEventTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package net.engio.mbassy; - -import net.engio.mbassy.bus.BusConfiguration; -import net.engio.mbassy.bus.MBassador; -import net.engio.mbassy.common.WeakConcurrentSet; -import net.engio.mbassy.common.DeadMessage; -import net.engio.mbassy.common.MessageBusTest; -import net.engio.mbassy.listener.Handler; -import org.junit.Test; - -/** - * Verify correct behaviour in case of message publications that do not have any matching subscriptions - * - * @author bennidi - * Date: 1/18/13 - */ -public class DeadEventTest extends MessageBusTest{ - - - @Test - public void testDeadEvent(){ - MBassador bus = getBus(BusConfiguration.Default()); - DeadEventHandler deadEventHandler = new DeadEventHandler(); - bus.subscribe(deadEventHandler); - assertEquals(0, deadEventHandler.getDeadEventCount()); - bus.post(new Object()).now(); - assertEquals(1, deadEventHandler.getDeadEventCount()); - bus.post(323).now(); - assertEquals(2, deadEventHandler.getDeadEventCount()); - bus.publish("fkdfdk"); - assertEquals(3, deadEventHandler.getDeadEventCount()); - } - - public class DeadEventHandler{ - - private WeakConcurrentSet deadEvents = new WeakConcurrentSet(); - - @Handler - public void handle(DeadMessage message){ - deadEvents.add(message); - } - - - public int getDeadEventCount(){ - return deadEvents.size(); - } - - } - -} diff --git a/src/test/java/net/engio/mbassy/DeadMessageTest.java b/src/test/java/net/engio/mbassy/DeadMessageTest.java new file mode 100644 index 0000000..9a9ddc2 --- /dev/null +++ b/src/test/java/net/engio/mbassy/DeadMessageTest.java @@ -0,0 +1,71 @@ +package net.engio.mbassy; + +import net.engio.mbassy.bus.BusConfiguration; +import net.engio.mbassy.bus.MBassador; +import net.engio.mbassy.common.*; +import net.engio.mbassy.listener.Handler; +import net.engio.mbassy.listeners.IMessageListener; +import net.engio.mbassy.common.ListenerFactory; +import net.engio.mbassy.listeners.MessagesListener; +import org.junit.Test; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Verify correct behaviour in case of message publications that do not have any matching subscriptions + * + * @author bennidi + * Date: 1/18/13 + */ +public class DeadMessageTest extends MessageBusTest{ + + + @Test + public void testDeadMessage(){ + final MBassador bus = getBus(BusConfiguration.Default()); + ListenerFactory listeners = new ListenerFactory() + .create(InstancesPerListener, IMessageListener.DefaultListener.class) + .create(InstancesPerListener, IMessageListener.AsyncListener.class) + .create(InstancesPerListener, IMessageListener.DisabledListener.class) + .create(InstancesPerListener, MessagesListener.DefaultListener.class) + .create(InstancesPerListener, MessagesListener.AsyncListener.class) + .create(InstancesPerListener, MessagesListener.DisabledListener.class) + .create(InstancesPerListener, DeadMessagHandler.class) + .create(InstancesPerListener, Object.class); + + + ConcurrentExecutor.runConcurrent(TestUtil.subscriber(bus, listeners), ConcurrentUnits); + + Runnable publishUnhandledMessage = new Runnable() { + @Override + public void run() { + for(int i=0; i < IterationsPerThread; i++){ + int variation = i % 3; + switch (variation){ + case 0:bus.publish(new Object());break; + case 1:bus.publish(i);break; + case 2:bus.publish(String.valueOf(i));break; + } + } + + } + }; + + ConcurrentExecutor.runConcurrent(publishUnhandledMessage, ConcurrentUnits); + + assertEquals(InstancesPerListener * IterationsPerThread * ConcurrentUnits, DeadMessagHandler.deadMessages.get()); + } + + public static class DeadMessagHandler { + + private static final AtomicInteger deadMessages = new AtomicInteger(0); + + + @Handler + public void handle(DeadMessage message){ + deadMessages.incrementAndGet(); + } + + } + +} diff --git a/src/test/java/net/engio/mbassy/FilterTest.java b/src/test/java/net/engio/mbassy/FilterTest.java index 43630d8..4ca70bb 100644 --- a/src/test/java/net/engio/mbassy/FilterTest.java +++ b/src/test/java/net/engio/mbassy/FilterTest.java @@ -9,7 +9,7 @@ import net.engio.mbassy.common.TestUtil; import net.engio.mbassy.messages.SubTestMessage; import net.engio.mbassy.messages.TestMessage; import net.engio.mbassy.listener.*; -import net.engio.mbassy.listeners.ListenerFactory; +import net.engio.mbassy.common.ListenerFactory; import org.junit.Test; import java.util.List; diff --git a/src/test/java/net/engio/mbassy/MBassadorTest.java b/src/test/java/net/engio/mbassy/MBassadorTest.java index 4ab45cf..09fb113 100644 --- a/src/test/java/net/engio/mbassy/MBassadorTest.java +++ b/src/test/java/net/engio/mbassy/MBassadorTest.java @@ -7,7 +7,7 @@ import net.engio.mbassy.common.MessageBusTest; import net.engio.mbassy.common.TestUtil; import net.engio.mbassy.listeners.ExceptionThrowingListener; import net.engio.mbassy.listeners.IMessageListener; -import net.engio.mbassy.listeners.ListenerFactory; +import net.engio.mbassy.common.ListenerFactory; import net.engio.mbassy.listeners.MessagesListener; import net.engio.mbassy.messages.MessageTypes; import net.engio.mbassy.messages.MultipartMessage; diff --git a/src/test/java/net/engio/mbassy/SubscriptionManagerTest.java b/src/test/java/net/engio/mbassy/SubscriptionManagerTest.java index 205e4d3..ada8dfb 100644 --- a/src/test/java/net/engio/mbassy/SubscriptionManagerTest.java +++ b/src/test/java/net/engio/mbassy/SubscriptionManagerTest.java @@ -1,9 +1,6 @@ package net.engio.mbassy; -import net.engio.mbassy.common.AssertSupport; -import net.engio.mbassy.common.ConcurrentExecutor; -import net.engio.mbassy.common.SubscriptionValidator; -import net.engio.mbassy.common.TestUtil; +import net.engio.mbassy.common.*; import net.engio.mbassy.listener.MetadataReader; import net.engio.mbassy.listeners.*; import net.engio.mbassy.messages.*; diff --git a/src/test/java/net/engio/mbassy/SyncBusTest.java b/src/test/java/net/engio/mbassy/SyncBusTest.java index 28df663..2563a4c 100644 --- a/src/test/java/net/engio/mbassy/SyncBusTest.java +++ b/src/test/java/net/engio/mbassy/SyncBusTest.java @@ -2,6 +2,7 @@ package net.engio.mbassy; import net.engio.mbassy.bus.*; import net.engio.mbassy.common.ConcurrentExecutor; +import net.engio.mbassy.common.ListenerFactory; import net.engio.mbassy.common.MessageBusTest; import net.engio.mbassy.common.TestUtil; import net.engio.mbassy.listeners.*; diff --git a/src/test/java/net/engio/mbassy/bus/ListenerSubscriptionTest.java b/src/test/java/net/engio/mbassy/bus/ListenerSubscriptionTest.java deleted file mode 100644 index 0c2d080..0000000 --- a/src/test/java/net/engio/mbassy/bus/ListenerSubscriptionTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package net.engio.mbassy.bus; - -import net.engio.mbassy.common.MessageBusTest; -import net.engio.mbassy.common.TestUtil; -import net.engio.mbassy.messages.SubTestMessage; -import net.engio.mbassy.messages.TestMessage; -import net.engio.mbassy.listeners.EventingTestBean; -import net.engio.mbassy.listeners.EventingTestBean2; -import net.engio.mbassy.listeners.EventingTestBean3; -import net.engio.mbassy.listeners.ListenerFactory; -import net.engio.mbassy.listeners.NonListeningBean; -import net.engio.mbassy.subscription.Subscription; -import org.junit.Test; - -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; - -/** - * Testing different scenarios of subscribing objects (listeners and non-listeners) to the message bus. - * - * @author bennidi - * Date: 1/9/13 - */ -public class ListenerSubscriptionTest extends MessageBusTest{ - - - // this is a single threaded test for subscribing and unsubscribing of a single listener - @Test - public void testSubscribeSimple() throws InterruptedException { - MBassador bus = getBus(new BusConfiguration()); - List listeners = new LinkedList(); - int listenerCount = 200000; - - // subscribe a number of listeners to the bus - for (int i = 1; i <= listenerCount; i++) { - EventingTestBean listener = new EventingTestBean(); - NonListeningBean nonListener = new NonListeningBean(); - listeners.add(listener); - - bus.subscribe(listener); - bus.subscribe(nonListener); - - assertFalse(bus.unsubscribe(nonListener)); // these are not expected to be subscribed listeners - assertFalse(bus.unsubscribe(new EventingTestBean())); - - } - - // check the generated subscriptions for existence of all previously subscribed valid listeners - Collection testEventsubscriptions = bus.getSubscriptionsByMessageType(TestMessage.class); - assertEquals(1, testEventsubscriptions.size()); - assertEquals(listenerCount, getNumberOfSubscribedListeners(testEventsubscriptions)); - - Collection subTestEventsubscriptions = bus.getSubscriptionsByMessageType(SubTestMessage.class); - assertEquals(3, subTestEventsubscriptions.size()); - assertEquals(3 * listenerCount, getNumberOfSubscribedListeners(subTestEventsubscriptions)); - - // unsubscribe the listeners - for(Object listener : listeners){ - assertTrue(bus.unsubscribe(listener)); // this listener is expected to exist - } - - // no listener should be left - testEventsubscriptions = bus.getSubscriptionsByMessageType(TestMessage.class); - assertEquals(1, testEventsubscriptions.size()); - assertEquals(0, getNumberOfSubscribedListeners(testEventsubscriptions)); - - subTestEventsubscriptions = bus.getSubscriptionsByMessageType(SubTestMessage.class); - assertEquals(3, subTestEventsubscriptions.size()); - assertEquals(0, getNumberOfSubscribedListeners(subTestEventsubscriptions)); - - } - - private int getNumberOfSubscribedListeners(Collection subscriptions) { - int listeners = 0; - for (Subscription sub : subscriptions) { - listeners += sub.size(); - } - return listeners; - } - - @Test - public void testConcurrentSubscription() throws Exception { - - MBassador bus = getBus(new BusConfiguration()); - ListenerFactory listenerFactory = new ListenerFactory() - .create(10000, EventingTestBean.class) - .create(10000, EventingTestBean2.class) - .create(10000, EventingTestBean3.class) - .create(10000, Object.class) - .create(10000, NonListeningBean.class); - - List listeners = listenerFactory.getAll(); - - // this will subscribe the listeners concurrently to the bus - TestUtil.setup(bus, listeners, 10); - - // check the generated subscriptions for existence of all previously subscribed valid listeners - Collection testEventsubscriptions = bus.getSubscriptionsByMessageType(TestMessage.class); - assertEquals(3, testEventsubscriptions.size()); - assertEquals(30000, getNumberOfSubscribedListeners(testEventsubscriptions)); - - Collection subTestEventsubscriptions = bus.getSubscriptionsByMessageType(SubTestMessage.class); - assertEquals(10, subTestEventsubscriptions.size()); - assertEquals(100000, getNumberOfSubscribedListeners(subTestEventsubscriptions)); - - } -} diff --git a/src/test/java/net/engio/mbassy/listeners/ListenerFactory.java b/src/test/java/net/engio/mbassy/common/ListenerFactory.java similarity index 98% rename from src/test/java/net/engio/mbassy/listeners/ListenerFactory.java rename to src/test/java/net/engio/mbassy/common/ListenerFactory.java index 9dc0b8f..9b63a54 100644 --- a/src/test/java/net/engio/mbassy/listeners/ListenerFactory.java +++ b/src/test/java/net/engio/mbassy/common/ListenerFactory.java @@ -1,4 +1,4 @@ -package net.engio.mbassy.listeners; +package net.engio.mbassy.common; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/test/java/net/engio/mbassy/common/MessageBusTest.java b/src/test/java/net/engio/mbassy/common/MessageBusTest.java index 3a56ea2..3c6be6b 100644 --- a/src/test/java/net/engio/mbassy/common/MessageBusTest.java +++ b/src/test/java/net/engio/mbassy/common/MessageBusTest.java @@ -24,6 +24,7 @@ public abstract class MessageBusTest extends Assert protected static final int processingTimeInMS = 6000; protected static final int InstancesPerListener = 5000; protected static final int ConcurrentUnits = 10; + protected static final int IterationsPerThread = 100; protected static final IPublicationErrorHandler TestFailingHandler = new IPublicationErrorHandler() { @Override diff --git a/src/test/java/net/engio/mbassy/common/SubscriptionValidator.java b/src/test/java/net/engio/mbassy/common/SubscriptionValidator.java index 16b4968..01eb96c 100644 --- a/src/test/java/net/engio/mbassy/common/SubscriptionValidator.java +++ b/src/test/java/net/engio/mbassy/common/SubscriptionValidator.java @@ -1,6 +1,5 @@ package net.engio.mbassy.common; -import net.engio.mbassy.listeners.ListenerFactory; import net.engio.mbassy.subscription.Subscription; import net.engio.mbassy.subscription.SubscriptionManager; diff --git a/src/test/java/net/engio/mbassy/common/TestUtil.java b/src/test/java/net/engio/mbassy/common/TestUtil.java index 5a1e3b8..5209602 100644 --- a/src/test/java/net/engio/mbassy/common/TestUtil.java +++ b/src/test/java/net/engio/mbassy/common/TestUtil.java @@ -1,7 +1,6 @@ package net.engio.mbassy.common; import net.engio.mbassy.bus.ISyncMessageBus; -import net.engio.mbassy.listeners.ListenerFactory; import net.engio.mbassy.subscription.SubscriptionManager; import java.util.Iterator; diff --git a/src/test/java/net/engio/mbassy/listeners/EventingTestBean.java b/src/test/java/net/engio/mbassy/listeners/EventingTestBean.java deleted file mode 100644 index 7843e53..0000000 --- a/src/test/java/net/engio/mbassy/listeners/EventingTestBean.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.engio.mbassy.listeners; - -import net.engio.mbassy.dispatch.HandlerInvocation; -import net.engio.mbassy.messages.SubTestMessage; -import net.engio.mbassy.messages.TestMessage; -import net.engio.mbassy.listener.*; -import net.engio.mbassy.subscription.SubscriptionContext; - -/** - * Basic bean that defines some event handlers to be used for different unit testting scenarios - * - * @author bennidi - * Date: 11/22/12 - */ -public class EventingTestBean { - - // every event of type TestEvent or any subtype will be delivered - // to this listener - @Handler - public void handleTestEvent(TestMessage message) { - message.counter.incrementAndGet(); - } - - // this handler will be invoked asynchronously - @Handler(priority = 0, delivery = Invoke.Asynchronously, invocation = HandleSubTestEventInvocation.class) - public void handleSubTestEvent(SubTestMessage message) { - message.counter.incrementAndGet(); - } - - // this handler will receive events of type SubTestEvent - // or any subtabe and that passes the given filter - @Handler( - priority = 10, - delivery = Invoke.Synchronously, - filters = {@Filter(Filters.RejectAll.class), @Filter(Filters.AllowAll.class)}) - public void handleFiltered(SubTestMessage message) { - message.counter.incrementAndGet(); - } - - public static class HandleSubTestEventInvocation extends HandlerInvocation { - - public HandleSubTestEventInvocation(SubscriptionContext context) { - super(context); - } - - @Override - public void invoke(EventingTestBean listener, SubTestMessage message) { - listener.handleSubTestEvent(message); - } - } -} diff --git a/src/test/java/net/engio/mbassy/listeners/EventingTestBean2.java b/src/test/java/net/engio/mbassy/listeners/EventingTestBean2.java deleted file mode 100644 index 637fc44..0000000 --- a/src/test/java/net/engio/mbassy/listeners/EventingTestBean2.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.engio.mbassy.listeners; - -import net.engio.mbassy.messages.SubTestMessage; -import net.engio.mbassy.listener.Handler; -import net.engio.mbassy.listener.Invoke; -import net.engio.mbassy.listener.Listener; -import net.engio.mbassy.listener.References; - -/** - * @author bennidi - * Date: 11/22/12 - */ -@Listener(references = References.Strong) -public class EventingTestBean2 extends EventingTestBean{ - - // redefine the configuration for this handler - @Handler(delivery = Invoke.Synchronously) - public void handleSubTestEvent(SubTestMessage message) { - super.handleSubTestEvent(message); - } - -} diff --git a/src/test/java/net/engio/mbassy/listeners/EventingTestBean3.java b/src/test/java/net/engio/mbassy/listeners/EventingTestBean3.java deleted file mode 100644 index 86ccf29..0000000 --- a/src/test/java/net/engio/mbassy/listeners/EventingTestBean3.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.engio.mbassy.listeners; - -import net.engio.mbassy.messages.SubTestMessage; -import net.engio.mbassy.listener.Handler; -import net.engio.mbassy.listener.Invoke; -import net.engio.mbassy.listener.Listener; -import net.engio.mbassy.listener.References; - -/** - * @author bennidi - * Date: 11/22/12 - */ -@Listener(references = References.Strong) -public class EventingTestBean3 extends EventingTestBean2{ - - - // this handler will be invoked asynchronously - @Handler(priority = 0, delivery = Invoke.Synchronously) - public void handleSubTestEventAgain(SubTestMessage message) { - message.counter.incrementAndGet(); - } - -} diff --git a/src/test/java/net/engio/mbassy/listeners/MultiEventHandler.java b/src/test/java/net/engio/mbassy/listeners/MultiEventHandler.java deleted file mode 100644 index 43c8149..0000000 --- a/src/test/java/net/engio/mbassy/listeners/MultiEventHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.engio.mbassy.listeners; - -import net.engio.mbassy.messages.TestMessage; -import net.engio.mbassy.messages.TestMessage2; -import net.engio.mbassy.listener.*; -import net.engio.mbassy.listener.Invoke; -import net.engio.mbassy.subscription.MessageEnvelope; - -/** - * Todo: Add javadoc - * - * @author bennidi - * Date: 12/12/12 - */ -public class MultiEventHandler { - - - @Handler(delivery = Invoke.Synchronously) - @Enveloped(messages = {TestMessage.class, TestMessage2.class}) - public void handleEvents(MessageEnvelope envelope) { - if(TestMessage.class.isAssignableFrom(envelope.getMessage().getClass())){ - TestMessage message = envelope.getMessage(); - message.counter.incrementAndGet(); - } - if(envelope.getMessage().getClass().equals(TestMessage2.class)){ - TestMessage2 message = envelope.getMessage(); - message.counter.incrementAndGet(); - } - } - - @Handler(delivery = Invoke.Synchronously, filters = @Filter(Filters.RejectSubtypes.class)) - @Enveloped(messages = {TestMessage.class, TestMessage2.class}) - public void handleSuperTypeEvents(MessageEnvelope envelope) { - if(TestMessage.class.isAssignableFrom(envelope.getMessage().getClass())){ - TestMessage message = envelope.getMessage(); - message.counter.incrementAndGet(); - } - if(envelope.getMessage().getClass().equals(TestMessage2.class)){ - TestMessage2 message = envelope.getMessage(); - message.counter.incrementAndGet(); - } - } - -} diff --git a/src/test/java/net/engio/mbassy/listeners/NonListeningBean.java b/src/test/java/net/engio/mbassy/listeners/NonListeningBean.java deleted file mode 100644 index 3bc5f34..0000000 --- a/src/test/java/net/engio/mbassy/listeners/NonListeningBean.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.engio.mbassy.listeners; - -import net.engio.mbassy.messages.SubTestMessage; -import net.engio.mbassy.messages.TestMessage; -import net.engio.mbassy.listener.Handler; - -/** - * This bean overrides all the handlers defined in its superclass. Since it does not specify any annotations - * it should not be considered a message listener - * - * @author bennidi - * Date: 11/22/12 - */ -public class NonListeningBean extends EventingTestBean{ - - - @Override - @Handler(enabled = false) - public void handleTestEvent(TestMessage message) { - message.counter.incrementAndGet(); // should never be called - } - - @Override - @Handler(enabled = false) - public void handleSubTestEvent(SubTestMessage message) { - message.counter.incrementAndGet(); // should never be called - } - - @Override - @Handler(enabled = false) - public void handleFiltered(SubTestMessage message) { - message.counter.incrementAndGet(); // should never be called - } -} diff --git a/src/test/java/net/engio/mbassy/listeners/ObjectListener.java b/src/test/java/net/engio/mbassy/listeners/ObjectListener.java new file mode 100644 index 0000000..a9b401b --- /dev/null +++ b/src/test/java/net/engio/mbassy/listeners/ObjectListener.java @@ -0,0 +1,20 @@ +package net.engio.mbassy.listeners; + +import net.engio.mbassy.common.DeadMessage; +import net.engio.mbassy.listener.Handler; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + + +public class ObjectListener { + + private List handledMessages = Collections.synchronizedList(new LinkedList()); + + @Handler + public void handle(Object message){ + handledMessages.add(message); + } + +}