package com.limegroup.gnutella;
import java.net.InetAddress;
import junit.framework.Test;
import org.limewire.core.settings.SearchSettings;
import org.limewire.gnutella.tests.LimeTestUtils;
import com.google.inject.Injector;
import com.limegroup.gnutella.connection.BlockingConnection;
import com.limegroup.gnutella.messages.BadPacketException;
import com.limegroup.gnutella.messages.QueryRequest;
import com.limegroup.gnutella.messages.QueryRequestFactory;
import com.limegroup.gnutella.messages.vendor.MessagesSupportedVendorMessage;
import com.limegroup.gnutella.messages.vendor.MessagesSupportedVendorMessageStubHelper;
/**
* First ultrapeer supports new out-of-band proxying control protocol.
*
* Methods that are tested by this integration test include:
*
* {@link MessageRouterImpl#originateLeafQuery(QueryRequest)} and
* {@link ManagedConnection#originateQuery(QueryRequest)}.
*/
public class ClientSideOOBProxyControlTest extends ClientSideTestCase {
private MessagesSupportedVendorMessage messagesSupportedVendorMessage;
private QueryRequestFactory queryRequestFactory;
private MessageRouter messageRouter;
public ClientSideOOBProxyControlTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(ClientSideOOBProxyControlTest.class);
}
@Override
protected void setUp() throws Exception {
Injector injector = LimeTestUtils.createInjector();
super.setUp(injector);
messagesSupportedVendorMessage = injector.getInstance(MessagesSupportedVendorMessage.class);
queryRequestFactory = injector.getInstance(QueryRequestFactory.class);
messageRouter = injector.getInstance(MessageRouter.class);
setUpProxyControlSupport();
}
private void setUpProxyControlSupport() throws Exception {
drainAll();
// send client a message that we support proxy control for OOB v3
testUP[0].send(messagesSupportedVendorMessage);
testUP[0].flush();
// send client a message that we support leaf guidance and everything
// but the proxy control protocol for OOB v3
testUP[1].send(MessagesSupportedVendorMessageStubHelper.makeMSVMWithoutOOBProxyControl());
testUP[1].flush();
Thread.sleep(250);
}
@Override
public void setSettings() {
SearchSettings.DISABLE_OOB_V2.setBoolean(false);
}
@Override
public int getNumberOfPeers() {
return 2;
}
public void testQueryV2Disabled() throws Exception {
QueryRequest query = queryRequestFactory.createQuery("txt");
assertFalse(query.desiresOutOfBandReplies());
assertFalse(query.doNotProxy());
SearchSettings.DISABLE_OOB_V2.setBoolean(true);
// send query through messagerouter
messageRouter.sendDynamicQuery(query);
Thread.sleep(250);
// new ultrapeer should not get do_not_proxy
assertQueryNoOOB(testUP[0], query, false);
// old ultrapper should get do_not_proxy
assertQueryNoOOB(testUP[1], query, true);
}
public void testOOBQueryV2Disabled() throws Exception {
QueryRequest query = queryRequestFactory.createOutOfBandQuery("txt", InetAddress.getLocalHost().getAddress(), 1340);
assertTrue(query.desiresOutOfBandReplies());
assertFalse(query.doNotProxy());
SearchSettings.DISABLE_OOB_V2.setBoolean(true);
// send query through message router
messageRouter.sendDynamicQuery(query);
Thread.sleep(250);
// new ultrapeer should not get do_not_proxy
assertQuery(testUP[0], query, false, true);
// old ultrapper get do_not_proxy
assertQuery(testUP[1], query, true, true);
}
public void testOOBQueryV2Enabled() throws Exception {
QueryRequest query = queryRequestFactory.createOutOfBandQuery("txt", InetAddress.getLocalHost().getAddress(), 1340);
assertTrue(query.desiresOutOfBandReplies());
assertFalse(query.doNotProxy());
SearchSettings.DISABLE_OOB_V2.setBoolean(false);
// send query through message router
messageRouter.sendDynamicQuery(query);
Thread.sleep(250);
// new ultrapeer should not get do_not_proxy
assertQuery(testUP[0], query, false, true);
// old ultrapper should not get do_not_proxy either
assertQuery(testUP[1], query, false, true);
}
public void testQueryV2Enabled() throws Exception {
QueryRequest query = queryRequestFactory.createQuery("txt");
assertFalse(query.desiresOutOfBandReplies());
assertFalse(query.doNotProxy());
SearchSettings.DISABLE_OOB_V2.setBoolean(false);
// send query through message router
messageRouter.sendDynamicQuery(query);
Thread.sleep(250);
// new ultrapeer should not get do_not_proxy
assertQueryNoOOB(testUP[0], query, false);
// old ultrapper shouldn't get do_not_proxy either
assertQueryNoOOB(testUP[1], query, false);
}
private QueryRequest assertQuery(BlockingConnection c, QueryRequest query, boolean doNotProxy,
boolean desiresOOB) throws BadPacketException {
QueryRequest qr = BlockingConnectionUtils.getFirstInstanceOfMessageType(c, QueryRequest.class);
assertNotNull(qr);
assertEquals(query.getGUID(), qr.getGUID());
assertEquals(doNotProxy, qr.doNotProxy());
assertEquals(desiresOOB, qr.desiresOutOfBandReplies());
return qr;
}
private QueryRequest assertQueryNoOOB(BlockingConnection c, QueryRequest query, boolean doNotProxy) throws BadPacketException {
return assertQuery(c, query, doNotProxy, false);
}
}