package com.limegroup.gnutella;
import junit.framework.Test;
import com.limegroup.gnutella.messages.PingRequest;
import com.limegroup.gnutella.stubs.MessageRouterStub;
import com.limegroup.gnutella.util.BaseTestCase;
import com.limegroup.gnutella.util.LeafConnectionManager;
import com.limegroup.gnutella.util.PrivilegedAccessor;
import com.limegroup.gnutella.util.UltrapeerConnectionManager;
/**
* Tests the <tt>Pinger</tt> class that periodically sends pings to gather new
* host data.
*/
public final class PingerTest extends BaseTestCase {
public PingerTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(PingerTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static void globalSetUp() throws Exception {
//ROUTER_SERVICE = new RouterService(new ActivityCallbackStub());
}
/**
* Test to make sure that we're correctly sending out periodic pings
* from the pinger as an Ultrapeer (we should not be sending these
* periodic pings as a leaf).
*/
public void testPeriodicUltrapeerPings() throws Exception {
TestMessageRouter mr = new TestMessageRouter();
ConnectionManager cm = new UltrapeerConnectionManager();
PrivilegedAccessor.setValue(RouterService.class, "router", mr);
PrivilegedAccessor.setValue(RouterService.class, "manager", cm);
Pinger pinger = Pinger.instance();
pinger.start();
synchronized(mr) {
while(mr.getNumPings() < 2) {
mr.wait(7000);
}
}
// don't know exactly how many have been sent because of thread
// scheduling, but just make sure they're going out
assertTrue("unexpected number of ping sends: "+mr.getNumPings(),
mr.getNumPings()>=2);
}
/**
* Test to make sure that we're not sending out periodic pings as a
* leaf.
*/
public void testPeriodicLeafPings() throws Exception {
TestMessageRouter mr = new TestMessageRouter();
ConnectionManager cm = new LeafConnectionManager();
PrivilegedAccessor.setValue(RouterService.class, "router", mr);
PrivilegedAccessor.setValue(RouterService.class, "manager", cm);
Pinger pinger = Pinger.instance();
pinger.start();
Thread.sleep(8000);
// we should not have sent any out, since we're a leaf
assertEquals("unexpected number of ping sends", 0, mr.getNumPings());
}
/**
* Test class for making sure that <tt>MessageRouter</tt> receives the
* expected calls.
*/
private final class TestMessageRouter extends MessageRouterStub {
private volatile int _numPings = 0;
public void broadcastPingRequest(PingRequest ping) {
_numPings++;
// notify any waiting threads that we have received a ping request
synchronized(this) {
notifyAll();
}
}
int getNumPings() {
return _numPings;
}
}
}