package com.limegroup.gnutella.downloader; import java.util.Collections; import junit.framework.Test; import org.jmock.Expectations; import org.jmock.Mockery; import org.limewire.core.settings.DownloadSettings; import org.limewire.gnutella.tests.LimeTestUtils; import org.limewire.util.BaseTestCase; import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.google.inject.Module; import com.limegroup.gnutella.MessageRouter; import com.limegroup.gnutella.NetworkManager; import com.limegroup.gnutella.UDPPinger; public class SourceRankerFactoryTest extends BaseTestCase { private NetworkManager networkManager; private UDPPinger pinger; private MessageRouter messageRouter; private SourceRankerFactory factory; private Mockery context; private RemoteFileDescFactory remoteFileDescFactory; public SourceRankerFactoryTest(String name) { super(name); } public static Test suite() { return buildTestSuite(SourceRankerFactoryTest.class); } @Override protected void setUp() throws Exception { context = new Mockery(); networkManager = context.mock(NetworkManager.class); pinger = context.mock(UDPPinger.class); messageRouter = context.mock(MessageRouter.class); remoteFileDescFactory = context.mock(RemoteFileDescFactory.class); Module module = new AbstractModule() { @Override protected void configure() { bind(UDPPinger.class).toInstance(pinger); bind(NetworkManager.class).toInstance(networkManager); bind(MessageRouter.class).toInstance(messageRouter); bind(RemoteFileDescFactory.class).toInstance(remoteFileDescFactory); } }; Injector injector = LimeTestUtils.createInjectorNonEagerly(module); factory = injector.getInstance(SourceRankerFactory.class); } @Override protected void tearDown() throws Exception { DownloadSettings.USE_HEADPINGS.revertToDefault(); } private void expectLegacyRanker() { context.checking(new Expectations() {{ one(networkManager).canReceiveSolicited(); will(returnValue(false)); }}); } private void expectPingRanker() { context.checking(new Expectations() {{ one(networkManager).canReceiveSolicited(); will(returnValue(true)); }}); } public void testGetAppropriateRankerReturnsLegacyRanker() { // if we cannot do solicited udp, we should get the legacy ranker expectLegacyRanker(); SourceRanker ranker = factory.getAppropriateRanker(); assertTrue(ranker instanceof LegacyRanker); context.assertIsSatisfied(); expectPingRanker(); DownloadSettings.USE_HEADPINGS.setValue(false); ranker = factory.getAppropriateRanker(); assertTrue(ranker instanceof LegacyRanker); context.assertIsSatisfied(); } public void testGetAppropriateRankerReturnsPingRanker() { assertTrue(DownloadSettings.USE_HEADPINGS.getValue()); expectPingRanker(); SourceRanker ranker = factory.getAppropriateRanker(); assertTrue(ranker instanceof FriendsFirstSourceRanker); context.assertIsSatisfied(); } private SourceRanker getLegacyRanker() { expectLegacyRanker(); SourceRanker ranker = factory.getAppropriateRanker(); assertTrue(ranker instanceof LegacyRanker); context.assertIsSatisfied(); return ranker; } private SourceRanker getFriendsFirstRanker() { expectPingRanker(); SourceRanker ranker = factory.getAppropriateRanker(); assertTrue(ranker instanceof FriendsFirstSourceRanker); context.assertIsSatisfied(); return ranker; } public void testGetAppropriateRankerSourceRankerRemainsUnchanged() { // legacy ranker staying the same SourceRanker ranker = getLegacyRanker(); expectLegacyRanker(); assertSame(ranker, factory.getAppropriateRanker(ranker)); context.assertIsSatisfied(); // ping ranker ranker = getFriendsFirstRanker(); expectPingRanker(); assertSame(ranker, factory.getAppropriateRanker(ranker)); context.assertIsSatisfied(); } public void testGetAppropriateRankerSourceRankerChangesFromLegacyToPingRanker() { // legacy to ping SourceRanker original = getLegacyRanker(); MeshHandler handler = context.mock(MeshHandler.class); original.setMeshHandler(handler); expectPingRanker(); SourceRanker copy = factory.getAppropriateRanker(original); assertTrue(copy instanceof FriendsFirstSourceRanker); assertSame(handler, copy.getMeshHandler()); } public void testGetAppropriateRankerSourceRankerChangesFromPingToLegacyRanker() { // ping to legacy SourceRanker original = getFriendsFirstRanker(); MeshHandler handler = context.mock(MeshHandler.class); original.setMeshHandler(handler); expectLegacyRanker(); SourceRanker copy = factory.getAppropriateRanker(original); assertTrue(copy instanceof LegacyRanker); assertSame(handler, copy.getMeshHandler()); } public void testOriginalRankerIsStoppedAndValuesAreCopied() { final SourceRanker original = context.mock(SourceRanker.class); context.checking(new Expectations() {{ one(original).stop(); one(original).getMeshHandler(); will(returnValue(null)); one(original).getShareableHosts(); will(returnValue(Collections.emptyList())); }}); expectPingRanker(); SourceRanker copy = factory.getAppropriateRanker(original); assertNotSame(original, copy); context.assertIsSatisfied(); } }