package com.limegroup.gnutella.udpconnect;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import junit.framework.Test;
import com.limegroup.gnutella.messages.Message;
import com.limegroup.gnutella.util.BaseTestCase;
/**
* Unit tests for UDPConnectionMessages
*/
public class UDPMessageTest extends BaseTestCase {
ByteArrayInputStream sin;
ByteArrayOutputStream sout;
public UDPMessageTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(UDPMessageTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void testDataMessage() throws Exception {
// Construct a data message
byte connectionID = 1;
long sequenceNumber = 0;
byte[] data = new byte[512];
int datalength = data.length;
SequenceNumberExtender extender = new SequenceNumberExtender();
// Try a range of sequence numbers
for( long i = 0; i <= 0x1ffff; i++) {
writeAndReadADataMessage(connectionID, i, data, datalength,
extender);
}
}
public void testBoundaryConditions() throws Exception {
// Construct a data message
byte connectionID = 1;
long sequenceNumber = 0;
byte[] data = new byte[512];
int datalength = data.length;
SequenceNumberExtender extender;
// Test boundary conditions
extender = new SequenceNumberExtender(999999999l);
writeAndReadADataMessage((byte)0xff, 999999999l, data, datalength,
extender);
// Test 1 byte
data = new byte[1];
datalength = 1;
extender = new SequenceNumberExtender(999999999l);
writeAndReadADataMessage((byte)0xff, 999999999l, data, datalength,
extender);
}
public void testDataSizes() throws Exception {
// Construct a data message
byte connectionID = 1;
long sequenceNumber = 0;
byte[] data;
int datalength;
SequenceNumberExtender extender = new SequenceNumberExtender();
// Test data sizes and content
DataMessage dmRead;
data = new byte[0x1000];
datalength = data.length;
for (int i = 0; i < datalength; i++) {
data[i] = (byte)(i % 255);
}
dmRead = writeAndReadADataMessage((byte)1, 1, data, datalength,
extender);
for (int i = 0; i < datalength; i++) {
assertEquals(dmRead.getDataAt(i), (byte)(i % 255));
}
// Test 2K
data = new byte[0x2000];
datalength = data.length;
for (int i = 0; i < datalength; i++) {
data[i] = (byte)(i % 255);
}
dmRead = writeAndReadADataMessage((byte)1, 1, data, datalength,
extender);
for (int i = 0; i < datalength; i++) {
assertEquals(dmRead.getDataAt(i), (byte)(i % 255));
}
// Test 4K
data = new byte[0x4000];
datalength = data.length;
for (int i = 0; i < datalength; i++) {
data[i] = (byte)(i % 255);
}
dmRead = writeAndReadADataMessage((byte)1, 1, data, datalength,
extender);
for (int i = 0; i < datalength; i++) {
assertEquals(dmRead.getDataAt(i), (byte)(i % 255));
}
// Test 8K
data = new byte[0x8000];
datalength = data.length;
for (int i = 0; i < datalength; i++) {
data[i] = (byte)(i % 255);
}
dmRead = writeAndReadADataMessage((byte)1, 1, data, datalength,
extender);
for (int i = 0; i < datalength; i++) {
assertEquals(dmRead.getDataAt(i), (byte)(i % 255));
}
}
private DataMessage writeAndReadADataMessage(
byte connectionID,
long sequenceNumber,
byte[] data,
int datalength,
SequenceNumberExtender extender) throws Exception {
DataMessage dmWrite;
DataMessage dmRead;
dmWrite =
new DataMessage(connectionID, sequenceNumber, data, datalength);
// Write the message out
sout = new ByteArrayOutputStream();
dmWrite.write(sout);
// Read the message in
sin = new ByteArrayInputStream(sout.toByteArray());
dmRead = (DataMessage) Message.read(sin);
// Extend the msgs sequenceNumber to 8 bytes based on past state
dmRead.extendSequenceNumber(
extender.extendSequenceNumber( dmRead.getSequenceNumber()) );
assertEquals(connectionID, dmRead.getConnectionID());
assertEquals(sequenceNumber, dmRead.getSequenceNumber());
assertEquals(datalength, dmRead.getDataLength());
return dmRead;
}
}