package com.limegroup.gnutella.messages.vendor; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import junit.framework.Test; import com.limegroup.gnutella.ByteOrder; import com.limegroup.gnutella.GUID; import com.limegroup.gnutella.messages.BadPacketException; import com.limegroup.gnutella.messages.Message; /** Tests the important MessagesSupportedVendorMessage. */ public class MessagesSupportedVendorMessageTest extends com.limegroup.gnutella.util.BaseTestCase { public MessagesSupportedVendorMessageTest(String name) { super(name); } public static Test suite() { return buildTestSuite(MessagesSupportedVendorMessageTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public void testStaticConstructor() throws Exception { MessagesSupportedVendorMessage vmp = MessagesSupportedVendorMessage.instance(); assertGreaterThan(0, vmp.supportsTCPConnectBack()); assertGreaterThan(0, vmp.supportsUDPConnectBack()); assertGreaterThan(0, vmp.supportsTCPConnectBackRedirect()); assertGreaterThan(0, vmp.supportsUDPConnectBackRedirect()); assertGreaterThan(0, vmp.supportsHopsFlow()); assertGreaterThan(0, vmp.supportsPushProxy()); assertGreaterThan(0, vmp.supportsLeafGuidance()); assertGreaterThan(0, vmp.supportsMessage("BEAR".getBytes(),7)); assertGreaterThan(0, vmp.supportsMessage("BEAR".getBytes(),4)); assertGreaterThan(0, vmp.supportsMessage("GTKG".getBytes(),7)); assertGreaterThan(0, vmp.supportsMessage("BEAR".getBytes(),11)); assertGreaterThan(0, vmp.supportsMessage("LIME".getBytes(),21)); assertGreaterThan(0, vmp.supportsMessage("LIME".getBytes(),7)); assertGreaterThan(0, vmp.supportsMessage("LIME".getBytes(),8)); assertGreaterThan(0, vmp.supportsMessage("LIME".getBytes(),14)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); vmp.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); MessagesSupportedVendorMessage vmpRead = (MessagesSupportedVendorMessage) Message.read(bais); assertEquals(vmp, vmpRead); assertGreaterThan(0, vmpRead.supportsTCPConnectBack()); assertGreaterThan(0, vmpRead.supportsUDPConnectBack()); assertGreaterThan(0, vmpRead.supportsTCPConnectBackRedirect()); assertGreaterThan(0, vmpRead.supportsUDPConnectBackRedirect()); assertGreaterThan(0, vmpRead.supportsHopsFlow()); assertGreaterThan(0, vmp.supportsPushProxy()); assertGreaterThan(0, vmp.supportsLeafGuidance()); assertGreaterThan(0, vmp.supportsMessage("BEAR".getBytes(),7)); assertGreaterThan(0, vmp.supportsMessage("BEAR".getBytes(),4)); assertGreaterThan(0, vmp.supportsMessage("GTKG".getBytes(),7)); assertGreaterThan(0, vmp.supportsMessage("BEAR".getBytes(),11)); assertGreaterThan(0, vmp.supportsMessage("LIME".getBytes(),21)); assertGreaterThan(0, vmp.supportsMessage("LIME".getBytes(),7)); assertGreaterThan(0, vmp.supportsMessage("LIME".getBytes(),8)); assertGreaterThan(0, vmp.supportsMessage("LIME".getBytes(),14)); } public void testNetworkConstructor() throws Exception { MessagesSupportedVendorMessage.SupportedMessageBlock smp1 = new MessagesSupportedVendorMessage.SupportedMessageBlock("SUSH".getBytes(), 10, 10); MessagesSupportedVendorMessage.SupportedMessageBlock smp2 = new MessagesSupportedVendorMessage.SupportedMessageBlock("NEIL".getBytes(), 5, 5); MessagesSupportedVendorMessage.SupportedMessageBlock smp3 = new MessagesSupportedVendorMessage.SupportedMessageBlock("DAWG".getBytes(), 3, 3); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] guid = GUID.makeGuid(); byte ttl = 1, hops = 0; ByteOrder.short2leb((short)4, baos); smp1.encode(baos); smp2.encode(baos); smp3.encode(baos); smp3.encode(baos); VendorMessage vm = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray()); baos = new ByteArrayOutputStream(); vm.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); MessagesSupportedVendorMessage vmp = (MessagesSupportedVendorMessage) Message.read(bais); // make sure it supports everything we expect.... assertEquals(10, vmp.supportsMessage("SUSH".getBytes(), 10)); assertEquals(5, vmp.supportsMessage("NEIL".getBytes(), 5)); assertEquals(3, vmp.supportsMessage("DAWG".getBytes(), 3)); assertEquals(-1, vmp.supportsTCPConnectBack()); assertEquals(-1, vmp.supportsUDPConnectBack()); assertEquals(-1, vmp.supportsHopsFlow()); // now creat another one, mix up the blocks that are supported, and // make sure they are equal.... baos = new ByteArrayOutputStream(); ByteOrder.short2leb((short)3, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); MessagesSupportedVendorMessage vmpOther = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray()); assertEquals(vmp, vmpOther); } public void testBadCases() throws Exception { MessagesSupportedVendorMessage.SupportedMessageBlock smp1 = new MessagesSupportedVendorMessage.SupportedMessageBlock("SUSH".getBytes(), 10, 10); MessagesSupportedVendorMessage.SupportedMessageBlock smp2 = new MessagesSupportedVendorMessage.SupportedMessageBlock("NEIL".getBytes(), 5, 5); MessagesSupportedVendorMessage.SupportedMessageBlock smp3 = new MessagesSupportedVendorMessage.SupportedMessageBlock("DAWG".getBytes(), 3, 3); ByteArrayOutputStream baos = null; byte[] guid = GUID.makeGuid(); byte ttl = 1, hops = 0; try { // test missing info.... baos = new ByteArrayOutputStream(); ByteOrder.short2leb((short)4, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); MessagesSupportedVendorMessage vmpOther = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray()); fail("bpe should have been thrown."); } catch (BadPacketException expected) { } try { // test corrupt info.... baos = new ByteArrayOutputStream(); ByteOrder.short2leb((short)4, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); baos.write("crap".getBytes()); MessagesSupportedVendorMessage vmpOther = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray()); fail("bpe should have been thrown."); } catch (BadPacketException expected) { } // test semantics.... baos = new ByteArrayOutputStream(); ByteOrder.short2leb((short)0, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); MessagesSupportedVendorMessage vmpOther = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray()); baos = new ByteArrayOutputStream(); ByteOrder.short2leb((short)3, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); MessagesSupportedVendorMessage vmpOneOther = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray()); assertNotEquals(vmpOther,vmpOneOther); } }