package com.limegroup.gnutella.dht; import java.io.File; import java.net.InetSocketAddress; import java.util.Collection; import java.util.List; import junit.framework.Test; import org.limewire.core.settings.DHTSettings; import org.limewire.io.IpPort; import org.limewire.mojito.Context; import org.limewire.mojito.KUID; import org.limewire.mojito.MojitoDHT; import org.limewire.mojito.routing.Contact; import org.limewire.mojito.routing.RouteTable; import org.limewire.mojito.routing.Vendor; import org.limewire.mojito.routing.Version; import org.limewire.mojito.routing.Contact.State; import org.limewire.mojito.routing.impl.RemoteContact; import org.limewire.mojito.settings.ContextSettings; import org.limewire.util.CommonUtils; import com.google.inject.Injector; import com.google.inject.Stage; import com.limegroup.gnutella.LifecycleManager; import com.limegroup.gnutella.LimeTestUtils; import com.limegroup.gnutella.NetworkManager; import com.limegroup.gnutella.util.EventDispatcher; public class ActiveDHTNodeControllerTest extends DHTTestCase { private static final EventDispatcher<DHTEvent, DHTEventListener> dispatcherStub = new DHTEventDispatcherStub(); private Injector injector; private DHTControllerFactory dhtControllerFactory; public ActiveDHTNodeControllerTest(String name) { super(name); } public static Test suite() { return buildTestSuite(ActiveDHTNodeControllerTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } @Override protected void setUp() throws Exception { DHTTestUtils.setSettings(PORT); DHTSettings.FORCE_DHT_CONNECT.setValue(true); injector = LimeTestUtils.createInjector(Stage.PRODUCTION); dhtControllerFactory = injector.getInstance(DHTControllerFactory.class); } public void testPersistence() throws Exception{ DHTSettings.PERSIST_ACTIVE_DHT_ROUTETABLE.setValue(true); DHTSettings.PERSIST_DHT_DATABASE.setValue(true); //first delete any previous file File dhtFile = new File(CommonUtils.getUserSettingsDir(), "active.mojito"); dhtFile.delete(); //start the node controller ActiveDHTNodeController controller = dhtControllerFactory.createActiveDHTNodeController(Vendor.UNKNOWN, Version.ZERO, dispatcherStub); try { Context context = (Context) controller.getMojitoDHT(); KUID nodeID = context.getLocalNodeID(); RouteTable rt = context.getRouteTable(); //fill the routing table a bit fillRoutingTable(rt, 10); //add one more KUID kuid = KUID.createRandomID(); RemoteContact node = new RemoteContact( new InetSocketAddress("localhost",4010), ContextSettings.getVendor(), ContextSettings.getVersion(), kuid, new InetSocketAddress("localhost",4010), 0, Contact.DEFAULT_FLAG, State.UNKNOWN); rt.add(node); controller.start(); controller.stop(); controller = dhtControllerFactory.createActiveDHTNodeController( Vendor.UNKNOWN, Version.ZERO, dispatcherStub); context = (Context) controller.getMojitoDHT(); rt = context.getRouteTable(); //should have the same nodeID as before assertEquals(nodeID, context.getLocalNodeID()); //should have persisted the routetable Collection<Contact> contacts = rt.getContacts(); assertEquals(12, contacts.size()); //11 + localnode assertTrue(contacts.contains(node)); } finally { controller.stop(); } } public void testGetActiveDHTNodes() throws Exception{ DHTSettings.FORCE_DHT_CONNECT.setValue(true); ActiveDHTNodeController controller = dhtControllerFactory.createActiveDHTNodeController(Vendor.UNKNOWN, Version.ZERO, dispatcherStub); MojitoDHT dhtBootstrapNode = startBootstrapDHT(injector.getInstance(LifecycleManager.class)); try { try { controller.start(); assertTrue(controller.isRunning()); // bootstrap active node controller.addActiveDHTNode(dhtBootstrapNode.getContactAddress()); for (int i = 0; i < 10; i++) { if (controller.isBootstrapped()) { break; } Thread.sleep(500); } assertTrue(controller.isBootstrapped()); // ask for active nodes -- should return itself and the bootstrap node List<IpPort> l = controller.getActiveDHTNodes(10); assertEquals(2, l.size()); assertEquals(injector.getInstance(NetworkManager.class).getPort(), l.get(0).getPort()); assertEquals(3000, l.get(1).getPort()); } finally { controller.stop(); } } finally { dhtBootstrapNode.close(); } } public void testResetRouteTable() { DHTSettings.PERSIST_ACTIVE_DHT_ROUTETABLE.setValue(true); DHTSettings.PERSIST_DHT_DATABASE.setValue(true); File dhtFile = new File(CommonUtils.getUserSettingsDir(), "active.mojito"); dhtFile.delete(); ActiveDHTNodeController controller = dhtControllerFactory.createActiveDHTNodeController(Vendor.UNKNOWN, Version.ZERO, dispatcherStub); Contact localNode1 = controller.getMojitoDHT().getLocalNode(); controller.start(); controller.stop(); controller = dhtControllerFactory.createActiveDHTNodeController(Vendor.UNKNOWN, Version.ZERO, dispatcherStub); Contact localNode2 = controller.getMojitoDHT().getLocalNode(); controller.start(); controller.stop(); assertEquals(localNode1.getNodeID(), localNode2.getNodeID()); DHTSettings.ACTIVE_DHT_ROUTETABLE_VERSION.setValue(1); controller = dhtControllerFactory.createActiveDHTNodeController(Vendor.UNKNOWN, Version.ZERO, dispatcherStub); Contact localNode3 = controller.getMojitoDHT().getLocalNode(); controller.start(); controller.stop(); assertNotEquals(localNode1.getNodeID(), localNode3.getNodeID()); } }