package org.oddjob.beanbus; import java.util.List; import junit.framework.TestCase; import org.oddjob.beanbus.destinations.BeanCapture; public class BasicBeanBusTest extends TestCase { private class OurListener implements BusListener { int starting; int beginning; int ending; int stopping; int crashed; int terminated; @Override public void busStarting(BusEvent event) throws BusCrashException { ++starting; } @Override public void tripBeginning(BusEvent event) throws BusCrashException { ++beginning; } @Override public void tripEnding(BusEvent event) throws BusCrashException { ++ending; } @Override public void busStopping(BusEvent event) throws BusCrashException { ++stopping; } @Override public void busTerminated(BusEvent event) { ++terminated; } @Override public void busCrashed(BusEvent event) { ++crashed; } @Override public void busStopRequested(BusEvent event) { // TODO Auto-generated method stub } } public void testStandardLifecycle() throws BusException { BeanCapture<String> trap = new BeanCapture<String>(); OurListener listener = new OurListener(); BasicBeanBus<String> test = new BasicBeanBus<String>(); test.setTo(trap); test.getBusConductor().addBusListener(listener); test.startBus(); assertEquals(1, listener.starting); assertEquals(0, listener.beginning); test.add("apple"); assertEquals(1, listener.beginning); test.stopBus(); assertEquals(1, listener.starting); assertEquals(1, listener.beginning); assertEquals(1, listener.ending); assertEquals(1, listener.stopping); assertEquals(1, listener.terminated); assertEquals(0, listener.crashed); List<String> results = trap.getBeans(); assertEquals("apple", results.get(0)); } private class BadDestination extends AbstractDestination<Object> { @Override public boolean add(Object bean) { throw new IllegalArgumentException(); } } public void testCrashOnPutLifecycle() throws BusException { OurListener listener = new OurListener(); BasicBeanBus<String> test = new BasicBeanBus<String>(); test.setTo(new BadDestination()); test.getBusConductor().addBusListener(listener); test.startBus(); assertEquals(1, listener.starting); assertEquals(0, listener.beginning); try { test.add("apple"); fail("Should fail."); } catch (RuntimeException e) { // expected } assertEquals(1, listener.starting); assertEquals(1, listener.beginning); assertEquals(0, listener.ending); assertEquals(0, listener.stopping); assertEquals(1, listener.crashed); assertEquals(1, listener.terminated); try { test.stopBus(); fail("Should fail."); } catch (IllegalStateException e) { // expected assertEquals("Bus Not Started.", e.getMessage()); } } public void testCleaningLifecycle() throws BusException { BeanCapture<String> trap = new BeanCapture<String>(); OurListener listener = new OurListener(); BasicBeanBus<String> test = new BasicBeanBus<String>(); test.setTo(trap); test.getBusConductor().addBusListener(listener); // start stop. test.startBus(); assertEquals(1, listener.starting); test.stopBus(); assertEquals(1, listener.stopping); assertEquals(1, listener.terminated); // now with clean. test.startBus(); assertEquals(2, listener.starting); test.add("apple"); assertEquals(1, listener.beginning); test.getBusConductor().cleanBus(); assertEquals(1, listener.ending); test.add("pear"); assertEquals(2, listener.beginning); test.getBusConductor().cleanBus(); assertEquals(2, listener.ending); test.stopBus(); assertEquals(2, listener.starting); assertEquals(2, listener.beginning); assertEquals(2, listener.ending); assertEquals(2, listener.stopping); assertEquals(2, listener.terminated); // no clean before stop test.startBus(); test.add("orange"); test.getBusConductor().cleanBus(); test.add("kiwi"); test.stopBus(); assertEquals(3, listener.starting); assertEquals(4, listener.beginning); assertEquals(4, listener.ending); assertEquals(3, listener.stopping); assertEquals(3, listener.terminated); } public void testBusState() throws BusException { BeanCapture<String> trap = new BeanCapture<String>(); OurListener listener = new OurListener(); BasicBeanBus<String> test = new BasicBeanBus<String>(); test.setTo(trap); test.getBusConductor().addBusListener(listener); // stop before started.. try { test.stopBus(); fail("Should fail!"); } catch (IllegalStateException e) { // expected. } assertEquals(0, listener.starting); assertEquals(0, listener.beginning); assertEquals(0, listener.ending); assertEquals(0, listener.stopping); assertEquals(0, listener.terminated); test.startBus(); assertEquals(1, listener.starting); // start after started. try { test.startBus(); fail("Should fail!"); } catch (IllegalStateException e) { // expected. } test.stopBus(); assertEquals(1, listener.starting); assertEquals(0, listener.beginning); assertEquals(0, listener.ending); assertEquals(1, listener.stopping); assertEquals(1, listener.terminated); } private class CrashingOnStartListener extends OurListener { @Override public void busStarting(BusEvent event) throws BusCrashException { throw new BusCrashException("Bang!"); } } public void testCrashedByListenerWhenStarting() throws BusCrashException { CrashingOnStartListener listener = new CrashingOnStartListener(); BasicBeanBus<String> test = new BasicBeanBus<String>(); test.getBusConductor().addBusListener(listener); try { test.startBus(); fail("Should Throw Exception"); } catch (BusCrashException e) { assertEquals("Bang!", e.getMessage()); } assertEquals(0, listener.starting); assertEquals(0, listener.beginning); assertEquals(0, listener.ending); assertEquals(0, listener.stopping); assertEquals(1, listener.terminated); assertEquals(1, listener.crashed); try { test.add("apple"); fail("Should Throw Exception"); } catch (IllegalStateException e) { // expected. assertEquals("Bus Not Started.", e.getMessage()); } try { test.stopBus(); fail("Should Throw Exception"); } catch (IllegalStateException e) { // expected. assertEquals("Bus Not Started.", e.getMessage()); } } private class CrashingOnCleanListener extends OurListener { @Override public void tripEnding(BusEvent event) throws BusCrashException { throw new BusCrashException("Bang!"); } } public void testCrashedByListenerWhenCleaning() throws BusCrashException { CrashingOnCleanListener listener = new CrashingOnCleanListener(); BasicBeanBus<String> test = new BasicBeanBus<String>(); test.getBusConductor().addBusListener(listener); test.startBus(); assertEquals(1, listener.starting); assertEquals(0, listener.beginning); test.add("apple"); assertEquals(1, listener.beginning); try { test.getBusConductor().cleanBus(); } catch (BusCrashException e) { assertEquals("Bang!", e.getMessage()); } try { test.stopBus(); fail("Should Throw Exception"); } catch (IllegalStateException e) { // expected. assertEquals("Bus Not Started.", e.getMessage()); } assertEquals(0, listener.stopping); assertEquals(0, listener.ending); assertEquals(1, listener.terminated); assertEquals(1, listener.crashed); } }