package com.limegroup.gnutella.messages.vendor; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import junit.framework.Test; import org.limewire.util.BaseTestCase; import org.limewire.util.ByteUtils; import org.limewire.io.GUID; import org.limewire.net.TLSManager; import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.limegroup.gnutella.LimeTestUtils; import com.limegroup.gnutella.dht.DHTManager; import com.limegroup.gnutella.dht.DHTManagerStub; import com.limegroup.gnutella.messages.BadPacketException; import com.limegroup.gnutella.messages.MessageFactory; import com.limegroup.gnutella.messages.Message.Network; public class CapabilitiesVMTest extends BaseTestCase { private CapabilitiesVMFactory factory; private MessageFactory messageFactory; private TLSManager tlsManager; public CapabilitiesVMTest(String name) { super(name); } public static Test suite() { return buildTestSuite(CapabilitiesVMTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } @Override public void setUp() throws Exception { Injector injector = LimeTestUtils.createInjector(new AbstractModule() { @Override protected void configure() { bind(DHTManager.class).to(DHTManagerStub.class); } }); factory = injector.getInstance(CapabilitiesVMFactory.class); messageFactory = injector.getInstance(MessageFactory.class); tlsManager = injector.getInstance(TLSManager.class); } public void testStaticConstructor() throws Exception { CapabilitiesVM vmp = factory.getCapabilitiesVM(); assertGreaterThan(0, vmp.supportsFeatureQueries()); assertTrue(vmp.supportsWhatIsNew()); assertGreaterThan(0, vmp.supportsCapability("WHAT".getBytes())); assertEquals(-1, vmp.supportsCapability("MDHT".getBytes())); ByteArrayOutputStream baos = new ByteArrayOutputStream(); vmp.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); CapabilitiesVM vmpRead = (CapabilitiesVM) messageFactory.read(bais, Network.TCP); assertEquals(vmp, vmpRead); assertGreaterThan(0, vmpRead.supportsFeatureQueries()); assertTrue(vmpRead.supportsWhatIsNew()); assertGreaterThan(0, vmpRead.supportsCapability("WHAT".getBytes())); assertEquals(-1, vmp.supportsCapability("MDHT".getBytes())); } public void testDHTCapability() throws Exception { CapabilitiesVM vmp = factory.getCapabilitiesVM(); assertEquals(-1, vmp.supportsCapability("MDHT".getBytes())); factory.updateCapabilities(); vmp = factory.getCapabilitiesVM(); assertGreaterThan(-1, vmp.isActiveDHTNode()); } public void testTLSCapability() throws Exception { tlsManager.setIncomingTLSEnabled(false); CapabilitiesVM vmp = factory.getCapabilitiesVM(); assertEquals(-1, vmp.supportsTLS()); assertEquals(-1, vmp.supportsCapability("TLS!".getBytes())); tlsManager.setIncomingTLSEnabled(true); factory.updateCapabilities(); vmp = factory.getCapabilitiesVM(); assertEquals(1, vmp.supportsTLS()); assertEquals(1, vmp.supportsCapability("TLS!".getBytes())); } public void testNetworkConstructor() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] guid = GUID.makeGuid(); byte ttl = 1, hops = 0; ByteUtils.short2leb((short)4, baos); CapabilitiesVMImpl.writeCapability(baos, "SUSH".getBytes(), 10, false); CapabilitiesVMImpl.writeCapability(baos, "NEIL".getBytes(), 5, false); CapabilitiesVMImpl.writeCapability(baos, "DAWG".getBytes(), 3, false); CapabilitiesVMImpl.writeCapability(baos, "DAWG".getBytes(), 3, false); VendorMessage vm = new CapabilitiesVMImpl(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); baos = new ByteArrayOutputStream(); vm.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); CapabilitiesVM vmp = (CapabilitiesVM) messageFactory.read(bais, Network.TCP); // make sure it supports everything we expect.... assertEquals(10, vmp.supportsCapability("SUSH".getBytes())); assertEquals(5, vmp.supportsCapability("NEIL".getBytes())); assertEquals(3, vmp.supportsCapability("DAWG".getBytes())); assertEquals(-1, vmp.supportsFeatureQueries()); assertFalse(vmp.supportsWhatIsNew()); // 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); CapabilitiesVMImpl.writeCapability(baos, "NEIL".getBytes(), 5, false); CapabilitiesVMImpl.writeCapability(baos, "DAWG".getBytes(), 3, false); CapabilitiesVMImpl.writeCapability(baos, "SUSH".getBytes(), 10, false); CapabilitiesVM vmpOther = new CapabilitiesVMImpl(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); assertEquals(vmp, vmpOther); } public void testBadCases() throws Exception { ByteArrayOutputStream baos; byte[] guid = GUID.makeGuid(); byte ttl = 1, hops = 0; try { // test missing info.... baos = new ByteArrayOutputStream(); ByteUtils.short2leb((short)4, baos); CapabilitiesVMImpl.writeCapability(baos, "NEIL".getBytes(), 5, false); CapabilitiesVMImpl.writeCapability(baos, "DAWG".getBytes(), 3, false); CapabilitiesVMImpl.writeCapability(baos, "SUSH".getBytes(), 10, false); new CapabilitiesVMImpl(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); CapabilitiesVMImpl.writeCapability(baos, "SUSH".getBytes(), 10, false); CapabilitiesVMImpl.writeCapability(baos, "NEIL".getBytes(), 5, false); CapabilitiesVMImpl.writeCapability(baos, "DAWG".getBytes(), 3, false); baos.write("crap".getBytes()); new CapabilitiesVMImpl(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); fail("bpe should have been thrown."); } catch (BadPacketException expected) { } } public void testLargeVersions() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] guid = GUID.makeGuid(); byte ttl = 1, hops = 0; ByteUtils.short2leb((short)1, baos); CapabilitiesVMImpl.writeCapability(baos, "DAWG".getBytes(), 3, false); ByteUtils.short2leb((short)3, baos); CapabilitiesVMImpl.writeCapability(baos, "DAWG".getBytes(), 3, true); CapabilitiesVMImpl.writeCapability(baos, "SUSH".getBytes(), 10, true); CapabilitiesVMImpl.writeCapability(baos, "NEIL".getBytes(), 5, true); CapabilitiesVM vmpOther = new CapabilitiesVMImpl(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); baos = new ByteArrayOutputStream(); ByteUtils.short2leb((short)3, baos); CapabilitiesVMImpl.writeCapability(baos, "NEIL".getBytes(), 5, false); CapabilitiesVMImpl.writeCapability(baos, "DAWG".getBytes(), 3, false); CapabilitiesVMImpl.writeCapability(baos, "SUSH".getBytes(), 10, false); CapabilitiesVM vmpOneOther = new CapabilitiesVMImpl(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN); assertEquals(vmpOther,vmpOneOther); } }