package com.limegroup.gnutella.handshaking; import java.util.Properties; import junit.framework.Test; import com.limegroup.gnutella.settings.ConnectionSettings; import com.limegroup.gnutella.settings.UltrapeerSettings; import com.limegroup.gnutella.util.BaseTestCase; /** * Tests the functionality of the <tt>LeafHandshakeResponderTest</tt> * class.<p> * * For the Ultrapeer specifications, see:<p> * * http://groups.yahoo.com/group/the_gdf/files/Proposals/Ultrapeer/Ultrapeers_1.0_clean.html */ public final class LeafHandshakeResponderTest extends BaseTestCase { public LeafHandshakeResponderTest(String name) { super(name); } public static Test suite() { return buildTestSuite(LeafHandshakeResponderTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } /** * Always assume we're encoding & accept it. This simplifies the testing. * For further tests on whether how handshaking works in response to these * settings, see HandshakeResponseTest. */ public void setUp() { ConnectionSettings.ACCEPT_DEFLATE.setValue(true); ConnectionSettings.ENCODE_DEFLATE.setValue(true); } /** * Tests the method for responding to outgoing connection attempts. * The response we send is the final response of the handshake -- * the third header exchange overall. */ public void testRespondToOutgoingUltrapeer() throws Exception { UltrapeerSettings.FORCE_ULTRAPEER_MODE.setValue(false); ConnectionSettings.ALLOW_WHILE_DISCONNECTED.setValue(true); // test the 3 Ultrapeer cases -- // create the Ultrapeer responder to test off of LeafHandshakeResponder responder = new LeafHandshakeResponder("23.3.4.5"); // 1) Ultrapeer-Leaf::No X-Ultrapeer-Needed -- we should ignore // the ultrapeer needed, and it should never be sent, but // test it anyway Properties props = new UltrapeerHeaders("40.0.9.8"); HandshakeResponse headers = HandshakeResponse.createResponse(props); HandshakeResponse hr = responder.respond(headers, true); // we shouldn't send any response header in this case // we should not accept any incoming connections assertTrue("should have been accepted", hr.isAccepted()); assertEquals("should only have deflate header", 1, hr.props().size()); assertTrue("should be deflated", hr.isDeflateEnabled()); // 2) Ultrapeer-Leaf::X-Ultrapeer-Needed: true props = new UltrapeerHeaders("40.0.9.8"); // this should be redundant, but make sure it's handled the way // we want props.put(HeaderNames.X_ULTRAPEER_NEEDED, "true"); headers = HandshakeResponse.createResponse(props); hr = responder.respond(headers, true); // we shouldn't send any response header in this case -- it's // just assumed that we're becoming an Ultrapeer assertTrue("should have been accepted", hr.isAccepted()); assertEquals("should only have deflate header", 1, hr.props().size()); assertTrue("should be deflated", hr.isDeflateEnabled()); // 3) Ultrapeer-Leaf::X-Ultrapeer-Needed: false props = new UltrapeerHeaders("78.9.3.0"); props.put(HeaderNames.X_ULTRAPEER_NEEDED, "false"); headers = HandshakeResponse.createResponse(props); hr = responder.respond(headers, true); assertTrue("should have been accepted", hr.isAccepted()); assertEquals("should only have deflate header", 1, hr.props().size()); assertTrue("should be deflated", hr.isDeflateEnabled()); ConnectionSettings.ALLOW_WHILE_DISCONNECTED.setValue(false); } /** * Tests to make sure that outgoing connection responses are handled * correctly when the host we're responding to is a leaf. Leaves * should never connect directly to other leaves, so all of these * connection attempts should fail. */ public void testRespondToOutgoingLeaf() throws Exception { ConnectionSettings.ALLOW_WHILE_DISCONNECTED.setValue(true); LeafHandshakeResponder responder = new LeafHandshakeResponder("23.3.4.5"); // Leaf-Leaf --> never allowed, regardless of slots UltrapeerSettings.MAX_LEAVES.setValue(1); Properties props = new LeafHeaders("78.9.3.0"); HandshakeResponse headers = HandshakeResponse.createResponse(props); HandshakeResponse hr = responder.respond(headers, true); assertTrue("should not accept connections to other leaves: "+ hr.getStatusLine(), !hr.isAccepted()); assertEquals("should not have any headers", 0, hr.props().size()); // Leaf-Leaf --> never allowed, but check anyway with no slots UltrapeerSettings.MAX_LEAVES.setValue(0); hr = responder.respond(headers, true); assertTrue("should not have accepted the connection", !hr.isAccepted()); assertEquals("should not have any headers", 0, hr.props().size()); // clean up settings ConnectionSettings.ALLOW_WHILE_DISCONNECTED.setValue(false); } /** * Tests the method for responding to incoming connection attempts. */ public void testRespondToIncomingUltrapeer() throws Exception { UltrapeerSettings.FORCE_ULTRAPEER_MODE.setValue(false); ConnectionSettings.PREFERENCING_ACTIVE.setValue(true); ConnectionSettings.ALLOW_WHILE_DISCONNECTED.setValue(true); LeafHandshakeResponder responder = new LeafHandshakeResponder("23.3.4.5"); // 1) check the Ultrapeer case. Here, the "leaf" does // not have any leaf connections yet, so it should just // accept the incoming connection HandshakeResponse up = HandshakeResponse.createResponse(new UltrapeerHeaders("80.45.0.1")); HandshakeResponse hr = responder.respond(up, false); assertTrue("should accept incoming connections as a leaf -- "+ "this could change in the future!", hr.isAccepted()); assertTrue("should be deflated", hr.isDeflateEnabled()); } /** * Test to make sure that incoming leaf connections are handled correctly. */ public void testRespondToIncomingLeaf() throws Exception { ConnectionSettings.PREFERENCING_ACTIVE.setValue(true); ConnectionSettings.ALLOW_WHILE_DISCONNECTED.setValue(true); // the ultrapeer we'll be testing against LeafHandshakeResponder responder = new LeafHandshakeResponder("23.3.4.5"); // 1) check to make sure that leaves are properly accepted as // leaves HandshakeResponse leaf = HandshakeResponse.createResponse(new LeafHeaders("80.45.0.1")); HandshakeResponse hr = responder.respond(leaf, false); assertFalse("should never accept leaves if we're a leaf.", hr.isAccepted()); } }