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.messages.Message; import com.limegroup.gnutella.messages.PingRequest; 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; import com.limegroup.gnutella.stubs.ActivityCallbackStub; /** * Tests that an Ultrapeer and Leaf correctly send and parse some initial messages * */ public final class ServerSideInitialMessagesTest extends ServerSideTestCase { protected static int TIMEOUT = 2000; private List /*of Messsage*/ _queue; public ServerSideInitialMessagesTest(String name) { super(name); } public static Test suite() { return buildTestSuite(ServerSideInitialMessagesTest.class); } public static Integer numUPs() { return new Integer(1); } public static Integer numLeaves() { return new Integer(1); } public static ActivityCallback getActivityCallback() { return new ActivityCallbackStub(); } public static void setUpQRPTables() {} public void setUp() { _queue=new ArrayList(10); } // BEGIN TESTS // ====================================================== public void testInitialPeerMessages() throws Exception{ Connection up=ULTRAPEER[0]; Thread.sleep( 5*1000 ); parseWaitingMessages( up ); // Check that initial messages are sent & received correctly Message mCapVM=getFirstMessageOfTypeFromQueue( CapabilitiesVM.class ); Message mVendS=getFirstMessageOfTypeFromQueue( MessagesSupportedVendorMessage.class ); Message mReset=getFirstMessageOfTypeFromQueue( ResetTableMessage.class ); Message mPatch=getFirstMessageOfTypeFromQueue( PatchTableMessage.class ); // UP may support PONG CACHING so we don't send it an initial ping. Message mPingR=getFirstMessageOfTypeFromQueue( PingRequest.class ); assertNotNull( mCapVM ); assertNotNull( mVendS ); assertNotNull( mReset ); assertNotNull( mPatch ); // see above // assertNotNull( mPingR ); assertEquals( "Peer messages queue not empty" + _queue, 0, _queue.size() ); } // ------------------------------------------------------ public void testInitialLeafMessages() throws Exception { Connection leaf=LEAF[0]; Thread.sleep( 5*1000 ); parseWaitingMessages( leaf ); // Check that initial messages are sent & received correctly Message mCapvm=getFirstMessageOfTypeFromQueue( CapabilitiesVM.class ); Message mVendS=getFirstMessageOfTypeFromQueue( MessagesSupportedVendorMessage.class ); // Leaf may support PONG CACHING so we don't send it an initial ping. Message mqePingR=getFirstMessageOfTypeFromQueue( PingRequest.class ); assertNotNull( mCapvm ); assertNotNull( mVendS ); // See above // assertNotNull( mqePingR ); assertEquals( "Leaf messages queue not empty" + _queue, 0, _queue.size() ); } // ====================================================== // Utility functions private final void sendF(Connection c, Message m) throws Exception { c.send(m); c.flush(); } private void parseWaitingMessages( Connection con ) throws Exception { try { Message m = null; while((m = con.receive( 300 )) !=null ) { _queue.add( m ); } } catch (InterruptedIOException ie) { } } private Message getFirstMessageOfTypeFromQueue( Class type ) { ListIterator li=_queue.listIterator(); Message m=null; while( li.hasNext() ) { Message n=(Message)li.next(); if( type.isInstance(n) ) { m = n; li.remove(); break; } } return m; } }