package com.limegroup.gnutella.messages.vendor; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import junit.framework.Test; import org.limewire.gnutella.tests.LimeTestUtils; import org.limewire.io.GUID; import org.limewire.util.ByteUtils; import org.limewire.util.StringUtils; import com.google.inject.Injector; import com.limegroup.gnutella.messages.BadPacketException; import com.limegroup.gnutella.messages.MessageFactory; import com.limegroup.gnutella.messages.Message.Network; /** Tests the important MessagesSupportedVendorMessage. */ public class MessagesSupportedVendorMessageTest extends org.limewire.gnutella.tests.LimeTestCase { private MessagesSupportedVendorMessage messagesSupportedVendorMessage; private MessageFactory messageFactory; 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()); } @Override protected void setUp() throws Exception { Injector injector = LimeTestUtils.createInjectorNonEagerly(); messagesSupportedVendorMessage = injector.getInstance(MessagesSupportedVendorMessage.class); messageFactory = injector.getInstance(MessageFactory.class); } public void testStaticConstructor() throws Exception { MessagesSupportedVendorMessage vmp = messagesSupportedVendorMessage; 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(StringUtils.toAsciiBytes("BEAR"),7)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("BEAR"),4)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("GTKG"),7)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("BEAR"),11)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("LIME"),21)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("LIME"),7)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("LIME"),8)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("LIME"),30)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); vmp.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); MessagesSupportedVendorMessage vmpRead = (MessagesSupportedVendorMessage) messageFactory.read(bais, Network.TCP); 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(StringUtils.toAsciiBytes("BEAR"),7)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("BEAR"),4)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("GTKG"),7)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("BEAR"),11)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("LIME"),21)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("LIME"),7)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("LIME"),8)); assertGreaterThan(0, vmp.supportsMessage(StringUtils.toAsciiBytes("LIME"),30)); } public void testNetworkConstructor() throws Exception { MessagesSupportedVendorMessage.SupportedMessageBlock smp1 = new MessagesSupportedVendorMessage.SupportedMessageBlock(StringUtils.toAsciiBytes("SUSH"), 10, 10); MessagesSupportedVendorMessage.SupportedMessageBlock smp2 = new MessagesSupportedVendorMessage.SupportedMessageBlock(StringUtils.toAsciiBytes("NEIL"), 5, 5); MessagesSupportedVendorMessage.SupportedMessageBlock smp3 = new MessagesSupportedVendorMessage.SupportedMessageBlock(StringUtils.toAsciiBytes("DAWG"), 3, 3); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] guid = GUID.makeGuid(); byte ttl = 1, hops = 0; ByteUtils.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(), Network.UNKNOWN); baos = new ByteArrayOutputStream(); vm.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); MessagesSupportedVendorMessage vmp = (MessagesSupportedVendorMessage) messageFactory.read(bais, Network.TCP); // make sure it supports everything we expect.... assertEquals(10, vmp.supportsMessage(StringUtils.toAsciiBytes("SUSH"), 10)); assertEquals(5, vmp.supportsMessage(StringUtils.toAsciiBytes("NEIL"), 5)); assertEquals(3, vmp.supportsMessage(StringUtils.toAsciiBytes("DAWG"), 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(); ByteUtils.short2leb((short)3, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); MessagesSupportedVendorMessage vmpOther = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); assertEquals(vmp, vmpOther); } public void testBadCases() throws Exception { MessagesSupportedVendorMessage.SupportedMessageBlock smp1 = new MessagesSupportedVendorMessage.SupportedMessageBlock(StringUtils.toAsciiBytes("SUSH"), 10, 10); MessagesSupportedVendorMessage.SupportedMessageBlock smp2 = new MessagesSupportedVendorMessage.SupportedMessageBlock(StringUtils.toAsciiBytes("NEIL"), 5, 5); MessagesSupportedVendorMessage.SupportedMessageBlock smp3 = new MessagesSupportedVendorMessage.SupportedMessageBlock(StringUtils.toAsciiBytes("DAWG"), 3, 3); ByteArrayOutputStream baos = null; byte[] guid = GUID.makeGuid(); byte ttl = 1, hops = 0; try { // test missing info.... baos = new ByteArrayOutputStream(); ByteUtils.short2leb((short)4, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); fail("bpe should have been thrown."); } catch (BadPacketException expected) { } try { // test corrupt info.... baos = new ByteArrayOutputStream(); ByteUtils.short2leb((short)4, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); baos.write(StringUtils.toAsciiBytes("crap")); new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); fail("bpe should have been thrown."); } catch (BadPacketException expected) { } // test semantics.... baos = new ByteArrayOutputStream(); ByteUtils.short2leb((short)0, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); MessagesSupportedVendorMessage vmpOther = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); baos = new ByteArrayOutputStream(); ByteUtils.short2leb((short)3, baos); smp2.encode(baos); smp3.encode(baos); smp1.encode(baos); MessagesSupportedVendorMessage vmpOneOther = new MessagesSupportedVendorMessage(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); assertNotEquals(vmpOther,vmpOneOther); } }