package org.limewire.core.impl.mojito; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.PrintWriter; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.lib.legacy.ClassImposteriser; import org.limewire.mojito.MojitoDHT; import org.limewire.util.BaseTestCase; import org.limewire.util.MatchAndCopy; import com.limegroup.gnutella.dht.DHTController; import com.limegroup.gnutella.dht.DHTEvent; import com.limegroup.gnutella.dht.DHTEventListener; import com.limegroup.gnutella.dht.DHTManager; public class MojitoManagerImplTest extends BaseTestCase { public MojitoManagerImplTest(String name) { super(name); } public void testGetName() { Mockery context = new Mockery(); final DHTManager dhtManager = context.mock(DHTManager.class); MojitoManagerImpl managerImpl = new MojitoManagerImpl(dhtManager); final MojitoDHT mojitoDHT = context.mock(MojitoDHT.class); final String mojitoName = "mojito"; context.checking(new Expectations() { { one(dhtManager).getMojitoDHT(); will(returnValue(null)); one(dhtManager).getMojitoDHT(); will(returnValue(mojitoDHT)); one(mojitoDHT).getName(); will(returnValue(mojitoName)); } }); assertNull(managerImpl.getName()); assertEquals(mojitoName, managerImpl.getName()); context.assertIsSatisfied(); } public void testIsRunning() { Mockery context = new Mockery(); final DHTManager dhtManager = context.mock(DHTManager.class); MojitoManagerImpl managerImpl = new MojitoManagerImpl(dhtManager); context.checking(new Expectations() { { one(dhtManager).isRunning(); will(returnValue(true)); } }); assertTrue(managerImpl.isRunning()); context.checking(new Expectations() { { one(dhtManager).isRunning(); will(returnValue(false)); } }); assertFalse(managerImpl.isRunning()); context.assertIsSatisfied(); } /** * Test the register function and ensure a functional listener is passed to the * MojitoManager. Test registering property change listeners and that they are fired * on appropriate events. */ public void testListenerInfrastructure() { Mockery context = new Mockery(); final DHTManager dhtManager = context.mock(DHTManager.class); final DHTController dhtController = context.mock(DHTController.class); final PropertyChangeListener listener1 = context.mock(PropertyChangeListener.class); final PropertyChangeListener listener2 = context.mock(PropertyChangeListener.class); final MatchAndCopy<DHTEventListener> listenerCollector = new MatchAndCopy<DHTEventListener>(DHTEventListener.class); final MojitoManagerImpl manager = new MojitoManagerImpl(dhtManager); context.checking(new Expectations() {{ exactly(1).of(dhtManager).addEventListener(with(listenerCollector)); exactly(2).of(listener1).propertyChange(with(any(PropertyChangeEvent.class))); exactly(1).of(listener2).propertyChange(with(any(PropertyChangeEvent.class))); }}); // Link the internal listener to the MojitoManager manager.registerListener(); // Add external state change listeners manager.addPropertyChangeListener(listener1); manager.addPropertyChangeListener(listener2); // Fire an event listenerCollector.getLastMatch().handleDHTEvent(new DHTEvent(dhtController, DHTEvent.Type.CONNECTED)); // Remove an external Listener manager.removePropertyChangeListener(listener2); // Fire another event that should not be bounced because caching listenerCollector.getLastMatch().handleDHTEvent(new DHTEvent(dhtController, DHTEvent.Type.STOPPED)); // Fire another event that should fire a property changed event listenerCollector.getLastMatch().handleDHTEvent(new DHTEvent(dhtController, DHTEvent.Type.CONNECTED)); context.assertIsSatisfied(); } // TODO: test rest of handle??? a good handle??? reflection??? /** * Test handle has a graceful fail when no Mojito instance is registered to the DHTManager. */ public void testHandleFail() { Mockery context = new Mockery() {{ setImposteriser(ClassImposteriser.INSTANCE); }}; final DHTManager dhtManager = context.mock(DHTManager.class); final PrintWriter dummyStream = context.mock(PrintWriter.class); final MojitoManagerImpl manager = new MojitoManagerImpl(dhtManager); context.checking(new Expectations() {{ allowing(dhtManager).getMojitoDHT(); will(returnValue(null)); ignoring(dummyStream); }}); assertFalse(manager.handle("???", dummyStream)); context.assertIsSatisfied(); } }