package com.limegroup.gnutella.messages;
import java.io.ByteArrayOutputStream;
import com.limegroup.gnutella.util.BaseTestCase;
import junit.framework.Test;
public class GGEPParserTest extends BaseTestCase {
public GGEPParserTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(GGEPParserTest.class);
}
public static void main(String argv[]) {
junit.textui.TestRunner.run(suite());
}
public void testCreationValues() throws Exception {
GGEPParser parser = new GGEPParser();
assertNull(parser.getSecureGGEP());
assertNull(parser.getNormalGGEP());
assertEquals(-1, parser.getSecureStartIndex());
assertEquals(-1, parser.getSecureEndIndex());
}
public void testSimpleGGEPParse() throws Exception {
GGEP ggep = new GGEP();
ggep.put("test");
ggep.put("test1", "data");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNotNull(parser.getNormalGGEP());
assertNull(parser.getSecureGGEP());
assertEquals(-1, parser.getSecureStartIndex());
assertEquals(-1, parser.getSecureEndIndex());
GGEP read = parser.getNormalGGEP();
assertTrue(read.hasKey("test"));
assertEquals("data", read.getString("test1"));
assertEquals(2, read.getHeaders().size());
}
public void testMultipleGGEPsMerged() throws Exception {
GGEP ggep = new GGEP();
ggep.put("test");
ggep.put("test1", "data");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ggep.write(out);
ggep = new GGEP();
ggep.put("test");
ggep.put("test2", "data2");
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNotNull(parser.getNormalGGEP());
assertNull(parser.getSecureGGEP());
assertEquals(-1, parser.getSecureStartIndex());
assertEquals(-1, parser.getSecureEndIndex());
GGEP read = parser.getNormalGGEP();
assertTrue(read.hasKey("test"));
assertEquals("data", read.getString("test1"));
assertEquals("data2", read.getString("test2"));
assertEquals(3, read.getHeaders().size());
}
public void testSecureGGEP() throws Exception {
GGEP ggep = new GGEP();
ggep.put("SB");
ggep.put("other", "stuff");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNotNull(parser.getSecureGGEP());
assertEquals(0, parser.getSecureStartIndex());
assertEquals(out.size(), parser.getSecureEndIndex());
assertNull(parser.getNormalGGEP());
GGEP read = parser.getSecureGGEP();
assertTrue(read.hasKey("SB"));
assertEquals("stuff", read.getString("other"));
assertEquals(2, read.getHeaders().size());
}
public void testSecureGGEPWithNormal() throws Exception {
GGEP ggep = new GGEP();
ggep.put("test");
ggep.put("test1", "data");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ggep.write(out);
int sizeOne = out.size();
ggep = new GGEP();
ggep.put("SB");
ggep.put("other", "stuff");
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNotNull(parser.getSecureGGEP());
assertEquals(sizeOne, parser.getSecureStartIndex());
assertEquals(out.size(), parser.getSecureEndIndex());
assertNotNull(parser.getNormalGGEP());
GGEP read = parser.getNormalGGEP();
assertTrue(read.hasKey("test"));
assertEquals("data", read.getString("test1"));
assertEquals(2, read.getHeaders().size());
read = parser.getSecureGGEP();
assertTrue(read.hasKey("SB"));
assertEquals("stuff", read.getString("other"));
assertEquals(2, read.getHeaders().size());
}
public void testMergeAndSecure() throws Exception {
GGEP ggep = new GGEP();
ggep.put("test");
ggep.put("test1", "data");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ggep.write(out);
ggep = new GGEP();
ggep.put("test");
ggep.put("test2", "data2");
ggep.write(out);
int sizeOne = out.size();
ggep = new GGEP();
ggep.put("SB");
ggep.put("other", "stuff");
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNotNull(parser.getSecureGGEP());
assertEquals(sizeOne, parser.getSecureStartIndex());
assertEquals(out.size(), parser.getSecureEndIndex());
assertNotNull(parser.getNormalGGEP());
GGEP read = parser.getNormalGGEP();
assertTrue(read.hasKey("test"));
assertEquals("data", read.getString("test1"));
assertEquals("data2", read.getString("test2"));
assertEquals(3, read.getHeaders().size());
read = parser.getSecureGGEP();
assertTrue(read.hasKey("SB"));
assertEquals("stuff", read.getString("other"));
assertEquals(2, read.getHeaders().size());
}
public void testDataAfterSecure() throws Exception {
GGEP ggep = new GGEP();
ggep.put("test");
ggep.put("test1", "data");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ggep.write(out);
int sizeOne = out.size();
ggep = new GGEP();
ggep.put("SB");
ggep.put("other", "stuff");
ggep.write(out);
int sizeTwo = out.size();
ggep = new GGEP();
ggep.put("test");
ggep.put("test2", "data2");
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNotNull(parser.getSecureGGEP());
assertEquals(sizeOne, parser.getSecureStartIndex());
assertEquals(sizeTwo, parser.getSecureEndIndex());
assertNotNull(parser.getNormalGGEP());
GGEP read = parser.getNormalGGEP();
assertTrue(read.hasKey("test"));
assertEquals("data", read.getString("test1"));
assertEquals(2, read.getHeaders().size());
read = parser.getSecureGGEP();
assertTrue(read.hasKey("SB"));
assertEquals("stuff", read.getString("other"));
assertEquals(2, read.getHeaders().size());
}
public void testScansForGGEP() throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(new byte[100]);
GGEP ggep = new GGEP();
ggep.put("test");
ggep.put("test1", "data");
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNotNull(parser.getNormalGGEP());
assertNull(parser.getSecureGGEP());
assertEquals(-1, parser.getSecureStartIndex());
assertEquals(-1, parser.getSecureEndIndex());
GGEP read = parser.getNormalGGEP();
assertTrue(read.hasKey("test"));
assertEquals("data", read.getString("test1"));
assertEquals(2, read.getHeaders().size());
}
public void testFailsGracefully() throws Exception {
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(new byte[100], 0);
assertNull(parser.getNormalGGEP());
assertNull(parser.getSecureGGEP());
assertEquals(-1, parser.getSecureStartIndex());
assertEquals(-1, parser.getSecureEndIndex());
}
public void testMagicByteScrewsParsing() throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(new byte[100]);
out.write(GGEP.GGEP_PREFIX_MAGIC_NUMBER);
GGEP ggep = new GGEP();
ggep.put("test");
ggep.put("test1", "data");
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNull(parser.getNormalGGEP());
assertNull(parser.getSecureGGEP());
assertEquals(-1, parser.getSecureStartIndex());
assertEquals(-1, parser.getSecureEndIndex());
}
public void testMergingMustBeNextToEachOther() throws Exception {
GGEP ggep = new GGEP();
ggep.put("test");
ggep.put("test1", "data");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ggep.write(out);
out.write(0);
ggep = new GGEP();
ggep.put("test");
ggep.put("test2", "data2");
ggep.write(out);
GGEPParser parser = new GGEPParser();
parser.scanForGGEPs(out.toByteArray(), 0);
assertNotNull(parser.getNormalGGEP());
assertNull(parser.getSecureGGEP());
assertEquals(-1, parser.getSecureStartIndex());
assertEquals(-1, parser.getSecureEndIndex());
GGEP read = parser.getNormalGGEP();
assertTrue(read.hasKey("test"));
assertEquals("data", read.getString("test1"));
assertEquals(2, read.getHeaders().size());
}
}