package com.limegroup.gnutella; import java.io.InterruptedIOException; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import junit.framework.Test; import com.limegroup.gnutella.connection.BlockingConnection; import com.limegroup.gnutella.messages.Message; import com.limegroup.gnutella.messages.vendor.CapabilitiesVM; import com.limegroup.gnutella.messages.vendor.MessagesSupportedVendorMessage; import com.limegroup.gnutella.routing.PatchTableMessage; import com.limegroup.gnutella.routing.ResetTableMessage; public class ClientSideInitialMessagesTest extends ClientSideTestCase { protected static int TIMEOUT = 2000; public ClientSideInitialMessagesTest(String name) { super(name); } public static Test suite() { return buildTestSuite(ClientSideInitialMessagesTest.class); } @Override public int getNumberOfPeers() { return 2; } @Override public boolean shouldRespondToPing() { return false; } public static void setUpQRPTables() {} @Override public void setUp() throws Exception { super.setUp(); } // BEGIN TESTS // ====================================================== public void testInitialUpMessages() throws Exception { BlockingConnection up1 = testUP[0]; BlockingConnection up2 = testUP[1]; List<Message> queue1 = new ArrayList<Message>(); List<Message> queue2 = new ArrayList<Message>(); Thread.sleep(10 * 1000); parseWaitingMessages(up1, queue1); parseWaitingMessages(up2, queue2); // Check that initial messages are sent & received correctly assertQueue(queue1); assertQueue(queue2); // One of q1 or q2 is empty -- because the handshake on the first // connection will update our capabilities to let us know // whether or not we're firewalled. if(queue1.isEmpty()) { Message extraCapVM = getFirstMessageOfTypeFromQueue(queue2, CapabilitiesVM.class); assertNotNull(extraCapVM); } else { Message extraCapVM = getFirstMessageOfTypeFromQueue(queue1, CapabilitiesVM.class); assertNotNull(extraCapVM); } assertEquals(queue1.toString(), 0, queue1.size()); assertEquals(queue2.toString(), 0, queue2.size()); } private void assertQueue(List<Message> q) throws Exception { Message mCapVM = getFirstMessageOfTypeFromQueue(q, CapabilitiesVM.class); Message mReset = getFirstMessageOfTypeFromQueue(q, ResetTableMessage.class); Message mPatch = getFirstMessageOfTypeFromQueue(q, PatchTableMessage.class); Message mMsgVM = getFirstMessageOfTypeFromQueue(q, MessagesSupportedVendorMessage.class ); // Leaf supports PONG CACHING so we don't send it an initial ping. // Message mqePingR=getFirstMessageOfTypeFromQueue( PingRequest.class ); assertTrue(mCapVM != null); assertTrue(mReset != null); assertTrue(mPatch != null); assertTrue(mMsgVM != null ); // See above - NOTE that ClientSideTestCase was responding to a non-existing ping // Request with a PingReply, so the other side USED to get a PingREPLY anyway, // despite supporting PONG CACHING. // assertTrue( mqePingR!=null ); } // ====================================================== private void parseWaitingMessages( BlockingConnection con, List<Message> q ) throws Exception { try { Message m=con.receive( 100 ); while( m!=null ) { q.add( m ); m=con.receive(100); } } catch (InterruptedIOException ie) { } } private Message getFirstMessageOfTypeFromQueue(List<Message> q, Class type ) { ListIterator li=q.listIterator(); Message m=null; while( li.hasNext() ) { Message n=(Message)li.next(); if( type.isInstance(n) ) { m = n; li.remove(); break; } } return m; } }