package com.limegroup.gnutella; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeSet; import junit.framework.Test; import com.limegroup.gnutella.messages.QueryReply; import com.limegroup.gnutella.util.BaseTestCase; import com.limegroup.gnutella.util.IpPort; import com.limegroup.gnutella.util.IpPortImpl; import com.limegroup.gnutella.util.PrivilegedAccessor; /** * tests the PushEndpoint class. */ public class PushEndpointTest extends BaseTestCase { public PushEndpointTest(String name) { super(name); } static Map m; public static void globalSetUp () { try { m = (Map)PrivilegedAccessor.getValue(PushEndpoint.class, "GUID_PROXY_MAP"); }catch(Exception bad){ ErrorService.error(bad); } } public static Test suite() { return buildTestSuite(PushEndpointTest.class); } public void testConstructors() throws Exception { GUID guid1 = new GUID(GUID.makeGuid()); GUID guid2 = new GUID(GUID.makeGuid()); GUID guid3 = new GUID(GUID.makeGuid()); IpPort ppi1 = new IpPortImpl("1.2.3.4",1234); IpPort ppi2 = new IpPortImpl("1.2.3.5",1235); Set set1 = new HashSet(); Set set2 = new HashSet(); set1.add(ppi1); set2.add(ppi1); set2.add(ppi2); PushEndpoint empty = new PushEndpoint(guid1.bytes()); assertEquals(guid1,new GUID(empty.getClientGUID())); assertEquals(PushEndpoint.HEADER_SIZE,PushEndpoint.getSizeBytes(empty.getProxies())); assertEquals(0,empty.getProxies().size()); PushEndpoint one = new PushEndpoint(guid2.bytes(),set1); assertEquals(PushEndpoint.HEADER_SIZE+PushEndpoint.PROXY_SIZE, PushEndpoint.getSizeBytes(one.getProxies())); assertEquals(1,one.getProxies().size()); assertEquals(0,one.supportsFWTVersion()); PushEndpoint two = new PushEndpoint(guid2.bytes(),set2); assertEquals(PushEndpoint.HEADER_SIZE+2*PushEndpoint.PROXY_SIZE, PushEndpoint.getSizeBytes(two.getProxies())); assertEquals(2,two.getProxies().size()); assertEquals(0,two.supportsFWTVersion()); //test features PushEndpoint three = new PushEndpoint(guid3.bytes(),set2,0x0,1); assertGreaterThan(0,three.supportsFWTVersion()); assertEquals("1.1.1.1",three.getAddress()); assertEquals(6346,three.getPort()); //test IpPort constructor IpPort ip = new IpPortImpl("1.2.3.4",5); PushEndpoint four = new PushEndpoint(guid3.bytes(),set2,0x0,1,ip); assertEquals("1.2.3.4",four.getAddress()); assertEquals(5,four.getPort()); } public void testExternalization() throws Exception { GUID guid1 = new GUID(GUID.makeGuid()); GUID guid2 = new GUID(GUID.makeGuid()); IpPort ppi1 = new IpPortImpl("1.2.3.4",1234); IpPort ppi2 = new IpPortImpl("1.2.3.5",1235); IpPort ppi3 = new IpPortImpl("1.2.3.6",1235); IpPort ppi4 = new IpPortImpl("1.2.3.7",1235); IpPort ppi5 = new IpPortImpl("1.2.3.8",1235); IpPort ppi6 = new IpPortImpl("1.2.3.9",1235); Set set1 = new TreeSet(IpPort.COMPARATOR); Set set6 = new TreeSet(IpPort.COMPARATOR); set1.add(ppi1); set6.add(ppi1);set6.add(ppi2);set6.add(ppi3);set6.add(ppi4); set6.add(ppi5);set6.add(ppi6); PushEndpoint one = new PushEndpoint(guid1.bytes(),set1); assertEquals(0,one.supportsFWTVersion()); byte [] network = one.toBytes(); byte [] network2 = new byte [PushEndpoint.getSizeBytes(one.getProxies())+5]; one.toBytes(network2,2); assertEquals(PushEndpoint.getSizeBytes(one.getProxies()),network.length); PushEndpoint one_prim= PushEndpoint.fromBytes( new DataInputStream(new ByteArrayInputStream(network))); assertEquals(one,one_prim); one_prim = PushEndpoint.fromBytes( new DataInputStream(new ByteArrayInputStream(network2,2,network2.length-2))); assertEquals(one,one_prim); assertEquals(0,one_prim.supportsFWTVersion()); m.clear(); // test a PE that claims it supports FWT but doesn't have external address - // its FWT status gets cleared PushEndpoint six = new PushEndpoint(guid2.bytes(),set6, 0,2); assertEquals(2,six.supportsFWTVersion()); network = six.toBytes(); assertEquals(PushEndpoint.getSizeBytes(six.getProxies()),network.length); m.clear(); PushEndpoint four = PushEndpoint.fromBytes( new DataInputStream(new ByteArrayInputStream(network))); assertEquals(0,four.supportsFWTVersion()); assertEquals(4,four.getProxies().size()); Set sent = new TreeSet(IpPort.COMPARATOR); sent.addAll(set6); assertTrue(set6.containsAll(four.getProxies())); // test a PE that carries its external address m.clear(); PushEndpoint ext = new PushEndpoint(guid2.bytes(),set6, 0,2, new IpPortImpl("1.2.3.4",5)); network = ext.toBytes(); assertEquals(ext.getSizeBytes(set6)+6,network.length); m.clear(); PushEndpoint ext2 = PushEndpoint.fromBytes( new DataInputStream(new ByteArrayInputStream(network))); assertEquals(ext,ext2); assertEquals("1.2.3.4",ext2.getAddress()); assertEquals(5,ext2.getPort()); assertEquals(4,ext2.getProxies().size()); // test that a PE with external address which can't do FWT // does not use up the extra 6 bytes m.clear(); PushEndpoint noFWT = new PushEndpoint(guid2.bytes(),set6, 0,0, new IpPortImpl("1.2.3.4",5)); network = noFWT.toBytes(); assertEquals(noFWT.getSizeBytes(set6),network.length); m.clear(); PushEndpoint noFWT2 = PushEndpoint.fromBytes( new DataInputStream(new ByteArrayInputStream(network))); assertEquals(noFWT,noFWT2); assertEquals(RemoteFileDesc.BOGUS_IP,noFWT2.getAddress()); assertEquals(4,noFWT2.getProxies().size()); m.clear(); } /** * tests externalization to http header values. * TODO: update this test after format is finalized. */ public void testExternalizationHTTP() throws Exception { GUID guid1 = new GUID(GUID.makeGuid()); GUID guid2 = new GUID(GUID.makeGuid()); IpPort ppi1 = new IpPortImpl("1.2.3.4",1234); IpPort ppi2 = new IpPortImpl("1.2.3.5",1235); IpPort ppi3 = new IpPortImpl("1.2.3.6",1235); IpPort ppi4 = new IpPortImpl("1.2.3.7",1235); IpPort ppi5 = new IpPortImpl("1.2.3.8",1235); IpPort ppi6 = new IpPortImpl("1.2.3.9",1235); Set set1 = new TreeSet(IpPort.COMPARATOR); Set set6 = new TreeSet(IpPort.COMPARATOR); set1.add(ppi1); set6.add(ppi1);set6.add(ppi2);set6.add(ppi3);set6.add(ppi4); set6.add(ppi5);set6.add(ppi6); PushEndpoint one = new PushEndpoint(guid1.bytes(),set1); String httpString = one.httpStringValue(); PushEndpoint one_prim = new PushEndpoint(httpString); assertEquals(1,one_prim.getProxies().size()); set1.retainAll(one_prim.getProxies()); assertEquals(1,set1.size()); //now test a bigger endpoint with an ip in it IpPort ip = new IpPortImpl("1.2.3.4",5); PushEndpoint six = new PushEndpoint(guid2.bytes(),set6,0,2,ip); httpString = six.httpStringValue(); PushEndpoint four = new PushEndpoint(httpString); assertEquals(2,four.supportsFWTVersion()); assertEquals(4,four.getProxies().size()); assertEquals("1.2.3.4",four.getAddress()); assertEquals(5,four.getPort()); Set sent = new TreeSet(IpPort.COMPARATOR); sent.addAll(set6); sent.retainAll(four.getProxies()); assertEquals(four.getProxies().size(),sent.size()); //now test an endpoint with an ip in it, but which does not support //FWT. We should not get the ip in the http representation PushEndpoint noFWT = new PushEndpoint(guid2.bytes(),set1,0,0,ip); httpString = noFWT.httpStringValue(); PushEndpoint parsed = new PushEndpoint(httpString); assertEquals(RemoteFileDesc.BOGUS_IP,parsed.getAddress()); //************* parsing tests *****************// //now an endpoint with a feature we do not understand PushEndpoint unknown = new PushEndpoint("2A8CA57F43E6E0B7FF823F0CC7880500;someFeature/2.3;1.2.3.5:1235;1.2.3.6:1235"); assertEquals(2,unknown.getProxies().size()); assertEquals(0,unknown.supportsFWTVersion()); //now an endpoint with the fwt header moved elsewhere unknown = new PushEndpoint("2A8CA57F43E6E0B7FF823F0CC7880500;1.2.3.5:1235;fwt/1.3;1.2.3.6:1235"); assertEquals(2,unknown.getProxies().size()); assertEquals(1,unknown.supportsFWTVersion()); //now an endpoint only with the guid unknown = new PushEndpoint("2A8CA57F43E6E0B7FF823F0CC7880500"); assertEquals(0,unknown.getProxies().size()); assertEquals(0,unknown.supportsFWTVersion()); //now an endpoint only guid and port:ip unknown = new PushEndpoint("2A8CA57F43E6E0B7FF823F0CC7880500;5:1.2.3.4"); assertEquals(0,unknown.getProxies().size()); assertEquals(0,unknown.supportsFWTVersion()); assertEquals("1.2.3.4",unknown.getAddress()); assertEquals(5,unknown.getPort()); //now an endpoint only guid and two port:ips.. the second one should be ignored unknown = new PushEndpoint("2A8CA57F43E6E0B7FF823F0CC7880500;5:1.2.3.4;6:2.3.4.5"); assertEquals(0,unknown.getProxies().size()); assertEquals(0,unknown.supportsFWTVersion()); assertEquals("1.2.3.4",unknown.getAddress()); assertEquals(5,unknown.getPort()); } }