package com.limegroup.gnutella.dht.db; import java.net.InetSocketAddress; import java.util.List; import junit.framework.Test; import org.limewire.core.settings.DHTSettings; import org.limewire.core.settings.NetworkSettings; import org.limewire.io.GUID; import org.limewire.io.IOUtils; import org.limewire.io.NetworkUtils; import org.limewire.mojito.MojitoDHT; import org.limewire.mojito.util.MojitoUtils; import org.limewire.util.PrivilegedAccessor; import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.limegroup.gnutella.Acceptor; import com.limegroup.gnutella.ApplicationServices; import com.limegroup.gnutella.ConnectionManager; import com.limegroup.gnutella.ExtendedEndpoint; import com.limegroup.gnutella.HostCatcher; import com.limegroup.gnutella.LifecycleManager; import com.limegroup.gnutella.LimeTestUtils; import com.limegroup.gnutella.NetworkManager; import com.limegroup.gnutella.PushEndpoint; import com.limegroup.gnutella.dht.DHTManager; import com.limegroup.gnutella.dht.DHTTestUtils; import com.limegroup.gnutella.dht.DHTManager.DHTMode; import com.limegroup.gnutella.stubs.ConnectionManagerStub; import com.limegroup.gnutella.stubs.LocalSocketAddressProviderStub; import com.limegroup.gnutella.stubs.NetworkManagerStub; import com.limegroup.gnutella.util.LimeTestCase; /** * Integration test to ensure that push proxies are published. */ public class PushProxyPublishingTest extends LimeTestCase { private NetworkManagerStub networkManagerStub = new NetworkManagerStub(); private Injector injector; private DHTManager dhtManager; private List<MojitoDHT> dhts; private HostCatcher hostCatcher; public PushProxyPublishingTest(String name) { super(name); } public static Test suite() { return buildTestSuite(PushProxyPublishingTest.class); } @Override protected void setUp() throws Exception { PrivilegedAccessor.setValue(DHTSettings.PUSH_PROXY_STABLE_PUBLISHING_INTERVAL, "value", 1000L); DHTSettings.DISABLE_DHT_USER.setValue(false); DHTSettings.DISABLE_DHT_NETWORK.setValue(false); DHTSettings.FORCE_DHT_CONNECT.setValue(true); DHTTestUtils.setSettings(NetworkSettings.PORT.getValue()); PrivilegedAccessor.setValue(DHTSettings.DHT_NODE_FETCHER_TIME, "value", 500L); injector = LimeTestUtils.createInjectorAndStart(LocalSocketAddressProviderStub.STUB_MODULE, new AbstractModule() { @Override protected void configure() { bind(NetworkManager.class).toInstance(networkManagerStub); bind(ConnectionManager.class).to(ConnectionManagerStub.class); } }); dhtManager = injector.getInstance(DHTManager.class); hostCatcher = injector.getInstance(HostCatcher.class); DHTTestUtils.setLocalIsPrivate(injector, false); networkManagerStub.setCanReceiveSolicited(true); networkManagerStub.setAcceptedIncomingConnection(true); networkManagerStub.setAddress(NetworkUtils.getLocalAddress().getAddress()); ((ConnectionManagerStub)injector.getInstance(ConnectionManager.class)).setConnected(true); Acceptor acceptor = injector.getInstance(Acceptor.class); networkManagerStub.setPort(acceptor.getPort(false)); // make sure address is updated which isn't done by mock network manager dhtManager.addressChanged(); dhts = MojitoUtils.createBootStrappedDHTs(1); } @Override protected void tearDown() throws Exception { injector.getInstance(LifecycleManager.class).shutdown(); IOUtils.close(dhts); } public void testPushProxiesArePublished() throws Exception { MojitoDHT dht = dhts.get(0); assertTrue(dht.isBootstrapped()); ExtendedEndpoint endpoint = new ExtendedEndpoint((InetSocketAddress)dht.getContactAddress()); endpoint.setDHTMode(DHTMode.ACTIVE); endpoint.setDHTVersion(dhtManager.getVersion().shortValue()); hostCatcher.add(endpoint, true); DHTTestUtils.waitForBootStrap(dhtManager, 5); // should have published after 3 secs with a publishing interval of 1 sec Thread.sleep(3 * 1000); DHTPushEndpointFinder finder = injector.getInstance(DHTPushEndpointFinder.class); GUID guid = new GUID(injector.getInstance(ApplicationServices.class).getMyGUID()); PushEndpoint pushEndpoint = finder.getPushEndpoint(guid); assertNotNull(pushEndpoint); assertEquals(networkManagerStub.getPort(), pushEndpoint.getPort()); assertEquals(guid.bytes(), pushEndpoint.getClientGUID()); } }