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.util.StringUtils;
import org.limewire.gnutella.tests.LimeTestUtils;
import org.limewire.io.GUID;
import org.limewire.net.TLSManager;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
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.createInjectorNonEagerly(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(StringUtils.toAsciiBytes("WHAT")));
assertEquals(-1, vmp.supportsCapability(StringUtils.toAsciiBytes("MDHT")));
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(StringUtils.toAsciiBytes("WHAT")));
assertEquals(-1, vmp.supportsCapability(StringUtils.toAsciiBytes("MDHT")));
}
public void testDHTCapability() throws Exception {
CapabilitiesVM vmp = factory.getCapabilitiesVM();
assertEquals(-1, vmp.supportsCapability(StringUtils.toAsciiBytes("MDHT")));
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(StringUtils.toAsciiBytes("TLS!")));
tlsManager.setIncomingTLSEnabled(true);
factory.updateCapabilities();
vmp = factory.getCapabilitiesVM();
assertEquals(1, vmp.supportsTLS());
assertEquals(1, vmp.supportsCapability(StringUtils.toAsciiBytes("TLS!")));
}
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, StringUtils.toAsciiBytes("SUSH"), 10, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("NEIL"), 5, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("DAWG"), 3, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("DAWG"), 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(StringUtils.toAsciiBytes("SUSH")));
assertEquals(5, vmp.supportsCapability(StringUtils.toAsciiBytes("NEIL")));
assertEquals(3, vmp.supportsCapability(StringUtils.toAsciiBytes("DAWG")));
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, StringUtils.toAsciiBytes("NEIL"), 5, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("DAWG"), 3, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("SUSH"), 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, StringUtils.toAsciiBytes("NEIL"), 5, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("DAWG"), 3, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("SUSH"), 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, StringUtils.toAsciiBytes("SUSH"), 10, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("NEIL"), 5, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("DAWG"), 3, false);
baos.write(StringUtils.toAsciiBytes("crap"));
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, StringUtils.toAsciiBytes("DAWG"), 3, false);
ByteUtils.short2leb((short)3, baos);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("DAWG"), 3, true);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("SUSH"), 10, true);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("NEIL"), 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, StringUtils.toAsciiBytes("NEIL"), 5, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("DAWG"), 3, false);
CapabilitiesVMImpl.writeCapability(baos, StringUtils.toAsciiBytes("SUSH"), 10, false);
CapabilitiesVM vmpOneOther =
new CapabilitiesVMImpl(guid, ttl, hops, 0, baos.toByteArray(), Network.UNKNOWN);
assertEquals(vmpOther,vmpOneOther);
}
}