package com.limegroup.gnutella.dime;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import junit.framework.Test;
/**
* Tests for DIMEParser.
*/
public final class DIMEParserTest extends com.limegroup.gnutella.util.BaseTestCase {
/**
* Constructs a new test instance for responses.
*/
public DIMEParserTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(DIMEParserTest.class);
}
/**
* Runs this test individually.
*/
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void testNext() throws Exception {
ByteArrayInputStream in;
ByteArrayOutputStream out;
Iterator parser;
DIMERecord one, two;
DIMERecord readOne, readTwo;
// test an empty stream.
in = new ByteArrayInputStream(new byte[0]);
parser = new DIMEParser(in);
try {
parser.next();
fail("expected exception");
} catch(NoSuchElementException nsee) {
assertEquals("eof", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
try {
parser.next();
fail("expected exception");
} catch(NoSuchElementException nsee) {
assertEquals("middle of stream.", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
Object next = parser.next();
assertInstanceof(DIMERecord.class, next);
readOne = (DIMERecord)next;
assertEquals("sab".getBytes(), readOne.getData());
try {
parser.next();
fail("expected exception");
} catch(NoSuchElementException nsee) {
assertEquals("eof", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
next = parser.next();
assertInstanceof(DIMERecord.class, next);
readOne = (DIMERecord)next;
assertEquals("sam".getBytes(), readOne.getData());
try {
parser.next();
fail("expected exception");
} catch(NoSuchElementException nsee) {
assertEquals("already read last message.", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
next = parser.next();
assertInstanceof(DIMERecord.class, next);
readOne = (DIMERecord)next;
assertEquals("sab".getBytes(), readOne.getData());
try {
parser.next();
fail("expected exception");
} catch(NoSuchElementException nsee) {
assertEquals("two first records.", nsee.getMessage());
}
}
public void testNextRecord() throws Exception {
ByteArrayInputStream in;
ByteArrayOutputStream out;
DIMEParser parser;
DIMERecord one, two;
DIMERecord readOne, readTwo;
// test an empty stream.
in = new ByteArrayInputStream(new byte[0]);
parser = new DIMEParser(in);
try {
parser.nextRecord();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("eof", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
try {
parser.nextRecord();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("middle of stream.", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
readOne = parser.nextRecord();
assertEquals("sab".getBytes(), readOne.getData());
try {
parser.nextRecord();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("eof", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
readOne = parser.nextRecord();
assertEquals("sam".getBytes(), readOne.getData());
try {
parser.nextRecord();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("already read last message.", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
readOne = parser.nextRecord();
assertEquals("sab".getBytes(), readOne.getData());
try {
parser.nextRecord();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("two first records.", nsee.getMessage());
}
}
public void testGetRecords() throws Exception {
ByteArrayInputStream in;
ByteArrayOutputStream out;
DIMEParser parser;
DIMERecord one, two;
DIMERecord readOne, readTwo;
List readList;
// test an empty stream.
in = new ByteArrayInputStream(new byte[0]);
parser = new DIMEParser(in);
try {
parser.nextRecord();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("eof", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
try {
parser.nextRecord();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("middle of stream.", nsee.getMessage());
}
// 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);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
try {
parser.getRecords();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("two first records.", nsee.getMessage());
}
// test the simple correct case with one message (first & last)
// 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.setLastRecord(true);
one.write(out);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
readList = parser.getRecords();
assertEquals(1, readList.size());
readOne = (DIMERecord)readList.get(0);
assertEquals("sab".getBytes(), readOne.getData());
// Make sure the next getRecords is empty.
readList = parser.getRecords();
assertEquals(0, readList.size());
// test that we ignore further messages after the last message
// is read.
out = new ByteArrayOutputStream();
one = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "bas".getBytes());
one.setFirstRecord(true);
one.setLastRecord(true);
two = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "sab".getBytes());
one.write(out);
two.write(out);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
readList = parser.getRecords();
assertEquals(1, readList.size());
readOne = (DIMERecord)readList.get(0);
assertEquals("bas".getBytes(), readOne.getData());
// Make sure the next getRecords is empty.
readList = parser.getRecords();
assertEquals(0, readList.size());
// test that a stream without an end fails.
out = new ByteArrayOutputStream();
one = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "sab".getBytes());
one.setFirstRecord(true);
one.write(out);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
try {
parser.getRecords();
fail("expected exception");
} catch(IOException nsee) {
assertEquals("eof", nsee.getMessage());
}
}
public void testHasNext() throws Exception {
ByteArrayInputStream in;
ByteArrayOutputStream out;
DIMEParser parser;
DIMERecord one, two, three;
DIMERecord readOne, readTwo, readThree;
// write out a few messages.
out = new ByteArrayOutputStream();
one = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "one".getBytes());
one.setFirstRecord(true);
two = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "two".getBytes());
three = new DIMERecord(DIMERecord.TYPE_UNCHANGED,
null, null, null, "three".getBytes());
three.setLastRecord(true);
one.write(out);
two.write(out);
three.write(out);
in = new ByteArrayInputStream(out.toByteArray());
parser = new DIMEParser(in);
assertTrue(parser.hasNext());
readOne = parser.nextRecord();
assertEquals("one".getBytes(), readOne.getData());
assertTrue(parser.hasNext());
readTwo = parser.nextRecord();
assertEquals("two".getBytes(), readTwo.getData());
assertTrue(parser.hasNext());
readThree = parser.nextRecord();
assertEquals("three".getBytes(), readThree.getData());
assertFalse(parser.hasNext());
try {
parser.nextRecord();
fail("expected exception");
} catch(IOException ioe) {
assertEquals("already read last message.", ioe.getMessage());
}
}
public void testRemove() throws Exception {
Iterator p = new DIMEParser(new ByteArrayInputStream(new byte[0]));
try {
p.remove();
fail("expected exception");
} catch(UnsupportedOperationException expected) {}
}
}