package com.limegroup.gnutella.dht;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import junit.framework.Test;
import org.limewire.concurrent.ExecutorsHelper;
import org.limewire.core.settings.DHTSettings;
import org.limewire.gnutella.tests.LimeTestUtils;
import org.limewire.mojito.KUID;
import com.google.inject.Injector;
import com.limegroup.gnutella.dht.DHTManager.DHTMode;
public class DHTManagerTest extends DHTTestCase {
private Injector injector;
private DHTControllerFactory dhtControllerFactory;
public DHTManagerTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(DHTManagerTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
@Override
protected void setUp() throws Exception {
DHTSettings.FORCE_DHT_CONNECT.setValue(true);
injector = LimeTestUtils.createInjector();
dhtControllerFactory = injector.getInstance(DHTControllerFactory.class);
}
public void testLimeDHTManager() throws Exception{
DHTSettings.PERSIST_ACTIVE_DHT_ROUTETABLE.setValue(true);
DHTSettings.PERSIST_DHT_DATABASE.setValue(true);
TestExecutor executor = new TestExecutor();
DHTManagerImpl manager = new DHTManagerImpl(executor, dhtControllerFactory);
try {
assertFalse(manager.isRunning());
assertFalse(manager.isBootstrapped());
assertFalse(manager.isWaitingForNodes());
assertEquals(0, manager.getActiveDHTNodes(10).size());
manager.start(DHTMode.ACTIVE);
assertEquals(1, executor.getRunners().size());
Thread.sleep(200);
assertTrue(manager.isRunning());
assertEquals(DHTMode.ACTIVE, manager.getDHTMode());
KUID activeLocalNodeID = manager.getMojitoDHT().getLocalNodeID();
// Rry starting again
manager.start(DHTMode.ACTIVE);
Thread.sleep(200);
assertEquals(activeLocalNodeID, manager.getMojitoDHT().getLocalNodeID());
// Try switching mode
manager.start(DHTMode.PASSIVE);
Thread.sleep(200);
assertEquals(DHTMode.PASSIVE, manager.getDHTMode());
assertTrue(manager.isRunning());
KUID passiveLocalNodeID = manager.getMojitoDHT().getLocalNodeID();
assertNotEquals(activeLocalNodeID, passiveLocalNodeID);
manager.start(DHTMode.PASSIVE);
Thread.sleep(200);
assertEquals(passiveLocalNodeID, manager.getMojitoDHT().getLocalNodeID());
manager.addressChanged();
Thread.sleep(200);
assertEquals(passiveLocalNodeID, manager.getMojitoDHT().getLocalNodeID());
// Try switching multiple times (does some Disk I/O)
manager.start(DHTMode.ACTIVE);
manager.start(DHTMode.PASSIVE);
manager.start(DHTMode.ACTIVE);
// Give it enough time --> previous starts were offloaded to threadpool
Thread.sleep(10000);
// We should be in active mode
assertEquals(DHTMode.ACTIVE, manager.getDHTMode());
// The Node ID should be something else than passiveLocalNodeID
assertNotEquals(passiveLocalNodeID, manager.getMojitoDHT().getLocalNodeID());
// The Node ID should be (but it's not guaranteed) equals to activeLocalNodeID
assertEquals(activeLocalNodeID, manager.getMojitoDHT().getLocalNodeID());
} finally {
manager.stop();
}
}
public void testStopStartLimeDHTManager() throws Exception{
TestExecutor executor = new TestExecutor();
DHTManagerImpl manager = new DHTManagerImpl(executor, dhtControllerFactory);
try {
manager.start(DHTMode.ACTIVE);
manager.stop();
Thread.sleep(200);
assertFalse(manager.isRunning());
manager.start(DHTMode.ACTIVE);
Thread.sleep(200);
assertTrue(manager.isRunning());
assertEquals(DHTMode.ACTIVE, manager.getDHTMode());
manager.start(DHTMode.PASSIVE);
Thread.sleep(200);
assertEquals(DHTMode.PASSIVE, manager.getDHTMode());
assertTrue(manager.isRunning());
manager.start(DHTMode.ACTIVE);
manager.start(DHTMode.PASSIVE);
manager.start(DHTMode.ACTIVE);
manager.stop();
assertFalse(manager.isRunning());
Thread.sleep(500);
assertFalse(manager.isRunning());
} finally {
manager.stop();
}
}
private class TestExecutor implements Executor {
private List<Runnable> runners = new ArrayList<Runnable>();
private ExecutorService service = ExecutorsHelper.newProcessingQueue("DHT-TestExecutor");
public List<Runnable> getRunners() {
return runners;
}
public void execute(Runnable command) {
runners.add(command);
service.execute(command);
}
}
}