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.*;
import com.limegroup.gnutella.messages.vendor.*;
import com.limegroup.gnutella.routing.PatchTableMessage;
import com.limegroup.gnutella.routing.ResetTableMessage;
import com.limegroup.gnutella.stubs.ActivityCallbackStub;
public class ClientSideInitialMessagesTest extends ClientSideTestCase {
protected static int TIMEOUT = 2000;
private List /*of Messsage*/ _queue;
public ClientSideInitialMessagesTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(ClientSideInitialMessagesTest.class);
}
public static Integer numUPs() {
return new Integer(1);
}
public static Boolean shouldRespondToPing() {
return Boolean.FALSE;
}
public static ActivityCallback getActivityCallback() {
return new ActivityCallbackStub();
}
public static void setUpQRPTables() {}
public void setUp() {
_queue=new ArrayList(10);
}
// BEGIN TESTS
// ======================================================
public void testInitialUpMessages() throws Exception {
Connection up=testUP[0];
Thread.sleep( 10*1000 );
parseWaitingMessages( up );
// Check that initial messages are sent & received correctly
Message mCapVM=getFirstMessageOfTypeFromQueue( CapabilitiesVM.class );
Message mReset=getFirstMessageOfTypeFromQueue( ResetTableMessage.class );
Message mPatch=getFirstMessageOfTypeFromQueue( PatchTableMessage.class );
Message mMsgVM=getFirstMessageOfTypeFromQueue( 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 );
assertEquals( "UP 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=con.receive( 100 );
while( m!=null ) {
_queue.add( m );
m=con.receive(100);
}
} 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;
}
}