package com.limegroup.gnutella.dime;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.List;
import com.limegroup.gnutella.stubs.ReadBufferChannel;
import junit.framework.Test;
/**
* Tests for AsyncDimeParser.
*/
public final class AsyncDimeParserTest extends com.limegroup.gnutella.util.LimeTestCase {
private ByteArrayOutputStream out;
private ByteBuffer buffer;
private ReadBufferChannel channel;
private AsyncDimeParser parser;
private DIMERecord one, two;
private DIMERecord readOne;
private ByteBuffer zero = ByteBuffer.allocate(0);
/**
* Constructs a new test instance for responses.
*/
public AsyncDimeParserTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(AsyncDimeParserTest.class);
}
/**
* Runs this test individually.
*/
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void testNoFirstRecord() throws Exception {
// test a stream that didn't have a 'first' message.
out = new ByteArrayOutputStream();
one = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, null);
one.write(out);
parser = new AsyncDimeParser();
buffer = ByteBuffer.wrap(out.toByteArray());
channel = new ReadBufferChannel(buffer);
try {
parser.process(channel, zero);
fail("expected exception");
} catch(IOException ex) {
assertEquals("middle of stream.", ex.getMessage());
}
}
public void testSingleMessageNoEnd() throws Exception {
// test we can read a single message.
out = new ByteArrayOutputStream();
one = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "sab".getBytes());
one.setFirstRecord(true);
one.write(out);
parser = new AsyncDimeParser();
buffer = ByteBuffer.wrap(out.toByteArray());
channel = new ReadBufferChannel(buffer);
assertTrue(parser.process(channel, zero));
List list = parser.getRecords();
assertNotNull(list);
assertEquals(1, list.size());
assertEquals(one.getRecordLength(), parser.getAmountProcessed());
readOne = (DIMERecord)list.get(0);
assertEquals("sab".getBytes(), readOne.getData());
}
public void testSingleMessageBeginAndEnd() throws Exception {
// test that once we get a message with ME we stop.
out = new ByteArrayOutputStream();
one = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "sam".getBytes());
one.setFirstRecord(true);
one.setLastRecord(true);
two = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "bad".getBytes());
one.write(out);
two.write(out);
parser = new AsyncDimeParser();
buffer = ByteBuffer.wrap(out.toByteArray());
channel = new ReadBufferChannel(buffer);
assertFalse(parser.process(channel, zero));
List list = parser.getRecords();
assertNotNull(list);
assertEquals(1, list.size());
assertEquals(one.getRecordLength(), parser.getAmountProcessed());
assertEquals(two.getRecordLength(), buffer.remaining());
readOne = (DIMERecord)list.get(0);
assertEquals("sam".getBytes(), readOne.getData());
}
public void testMultipleFirstMessages() throws Exception {
// test multiple 'first' messages fail.
out = new ByteArrayOutputStream();
one = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "sab".getBytes());
one.setFirstRecord(true);
two = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "bas".getBytes());
two.setFirstRecord(true);
one.write(out);
two.write(out);
parser = new AsyncDimeParser();
buffer = ByteBuffer.wrap(out.toByteArray());
channel = new ReadBufferChannel(buffer);
try {
parser.process(channel, zero);
fail("exception expected");
} catch(IOException ex) {
assertEquals("two first records.", ex.getMessage());
}
}
}