package org.limewire.mojito.routing.impl; import java.net.InetSocketAddress; import junit.framework.TestSuite; import org.limewire.mojito.KUID; import org.limewire.mojito.MojitoTestCase; import org.limewire.mojito.routing.Contact; import org.limewire.mojito.routing.ContactFactory; import org.limewire.mojito.routing.Vendor; import org.limewire.mojito.routing.Version; import org.limewire.mojito.settings.NetworkSettings; public class RemoteContactTest extends MojitoTestCase { public RemoteContactTest(String name) { super(name); } public static TestSuite suite() { return buildTestSuite(RemoteContactTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public void testFixSourceAndContactAddress() { setLocalIsPrivate(false); // External Port == 0 -> force firewalled if it isn't! // even w/o calling fix.. RemoteContact node1 = (RemoteContact)ContactFactory.createLiveContact( null, Vendor.UNKNOWN, Version.ZERO, KUID.createRandomID(), new InetSocketAddress("localhost", 0), 0, Contact.DEFAULT_FLAG); assertNull(node1.getSourceAddress()); assertTrue(node1.isFirewalled()); node1.fixSourceAndContactAddress(new InetSocketAddress("localhost", 1024)); assertNotNull(node1.getSourceAddress()); assertTrue(node1.isFirewalled()); assertEquals(new InetSocketAddress("localhost", 1024), node1.getSourceAddress()); assertEquals(new InetSocketAddress("localhost", 1024), node1.getContactAddress()); // External Port != 0 -> Contact Address = Source Address + external Port RemoteContact node2 = (RemoteContact)ContactFactory.createLiveContact( null, Vendor.UNKNOWN, Version.ZERO, KUID.createRandomID(), new InetSocketAddress("dell.com", 2048), 0, Contact.DEFAULT_FLAG); assertNull(node2.getSourceAddress()); assertFalse(node2.isFirewalled()); // Cannot switch from a PUBLIC to a PRIVATE address node2.fixSourceAndContactAddress(new InetSocketAddress("localhost", 1024)); assertNotNull(node2.getSourceAddress()); assertFalse(node2.isFirewalled()); assertEquals(new InetSocketAddress("localhost", 1024), node2.getSourceAddress()); //assertEquals(new InetSocketAddress("localhost", 2048), node2.getContactAddress()); } public void testUpdateWithExistingContact() { setLocalIsPrivate(false); KUID nodeId = KUID.createRandomID(); RemoteContact node1 = (RemoteContact)ContactFactory.createLiveContact( new InetSocketAddress("localhost", 1024), Vendor.UNKNOWN, Version.ZERO, nodeId, new InetSocketAddress("localhost", 2048), 0, Contact.DEFAULT_FLAG); node1.setTimeStamp(100); node1.setRoundTripTime(100); node1.handleFailure(); RemoteContact node2 = (RemoteContact)ContactFactory.createLiveContact( new InetSocketAddress("localhost", 1024), Vendor.UNKNOWN, Version.ZERO, nodeId, new InetSocketAddress("localhost", 2048), 0, Contact.DEFAULT_FLAG); node2.setTimeStamp(99); // Node #2 is elder than Node #1 assertEquals(-1, node2.getRoundTripTime()); assertEquals(0, node2.getFailures()); assertEquals(0, node2.getLastFailedTime()); assertTrue(node2.getTimeStamp() > 0 && node2.getTimeStamp() < Long.MAX_VALUE); node2.updateWithExistingContact(node1); assertEquals(100, node2.getRoundTripTime()); assertEquals(1, node2.getFailures()); assertEquals(node1.getLastFailedTime(), node2.getLastFailedTime()); assertEquals(node1.getTimeStamp(), node2.getTimeStamp()); // Make sure update works only with Contacts that have the same Node ID try { RemoteContact node4 = (RemoteContact)ContactFactory.createLiveContact( new InetSocketAddress("localhost", 1024), Vendor.UNKNOWN, Version.ZERO, KUID.createRandomID(), new InetSocketAddress("localhost", 2048), 0, Contact.DEFAULT_FLAG); node4.updateWithExistingContact(node2); fail(node4 + " should have rejected the exsting Node " + node2); } catch (IllegalArgumentException ignore) {} } public void testVendorAndVersion() { setLocalIsPrivate(false); Contact node1 = ContactFactory.createLocalContact(Vendor.valueOf(1), Version.valueOf(2), false); assertEquals(Vendor.valueOf(1), node1.getVendor()); assertEquals(Version.valueOf(2), node1.getVersion()); Contact node2 = ContactFactory.createLiveContact( new InetSocketAddress("localhost", 1024), Vendor.valueOf(3), Version.valueOf(4), KUID.createRandomID(), new InetSocketAddress("localhost", 2048), 0, Contact.DEFAULT_FLAG); assertEquals(Vendor.valueOf(3), node2.getVendor()); assertEquals(Version.valueOf(4), node2.getVersion()); Contact node3 = ContactFactory.createUnknownContact( Vendor.valueOf(5), Version.valueOf(6), KUID.createRandomID(), new InetSocketAddress("localhost", 2048)); assertEquals(Vendor.valueOf(5), node3.getVendor()); assertEquals(Version.valueOf(6), node3.getVersion()); } public void testAdaptiveTimeout() { setLocalIsPrivate(false); // This test relies on the default values NetworkSettings.DEFAULT_TIMEOUT.revertToDefault(); NetworkSettings.MIN_TIMEOUT_RTT.revertToDefault(); NetworkSettings.MIN_TIMEOUT_RTT_FACTOR.revertToDefault(); Contact node1 = ContactFactory.createLiveContact( new InetSocketAddress("localhost", 1024), Vendor.UNKNOWN, Version.ZERO, KUID.createRandomID(), new InetSocketAddress("localhost", 2048), 0, Contact.DEFAULT_FLAG); assertEquals(-1L, node1.getRoundTripTime()); assertEquals(NetworkSettings.DEFAULT_TIMEOUT.getValue(), node1.getAdaptativeTimeout()); node1.setRoundTripTime(NetworkSettings.MIN_TIMEOUT_RTT.getValue() - 500L); assertEquals(NetworkSettings.MIN_TIMEOUT_RTT.getValue(), node1.getAdaptativeTimeout()); node1.setRoundTripTime(NetworkSettings.MIN_TIMEOUT_RTT.getValue() + 500L); assertGreaterThan(NetworkSettings.MIN_TIMEOUT_RTT.getValue(), node1.getAdaptativeTimeout()); Contact node2 = ContactFactory.createUnknownContact( Vendor.UNKNOWN, Version.ZERO, KUID.createRandomID(), new InetSocketAddress("localhost", 2048)); assertEquals(-1L, node2.getRoundTripTime()); assertEquals(NetworkSettings.DEFAULT_TIMEOUT.getValue(), node2.getAdaptativeTimeout()); node2.setRoundTripTime(NetworkSettings.MIN_TIMEOUT_RTT.getValue() - 500L); assertFalse(node2.isAlive()); assertEquals(NetworkSettings.DEFAULT_TIMEOUT.getValue(), node2.getAdaptativeTimeout()); ((RemoteContact)node2).alive(); assertTrue(node2.isAlive()); node2.setRoundTripTime(NetworkSettings.MIN_TIMEOUT_RTT.getValue() - 500L); assertEquals(NetworkSettings.MIN_TIMEOUT_RTT.getValue(), node2.getAdaptativeTimeout()); } public void testPublicPrivateAddress() { setLocalIsPrivate(true); InetSocketAddress sourceAddress = new InetSocketAddress("localhost", 1234); InetSocketAddress contactAddress = new InetSocketAddress("216.244.101.15", 5000); InetSocketAddress externalAddress = new InetSocketAddress("216.244.101.16", 5000); RemoteContact node1 = (RemoteContact)ContactFactory .createLiveContact(null, Vendor.UNKNOWN, Version.ZERO, KUID.createRandomID(), contactAddress, 0, Contact.DEFAULT_FLAG); // PUBLIC contact address and PRIVATE source address // Result: Don't use the IP from the source address node1.fixSourceAndContactAddress(sourceAddress); assertEquals(contactAddress, node1.getContactAddress()); // PUBLIC contact address and PUBLIC source address // Result: Use the IP from the source address node1.fixSourceAndContactAddress(externalAddress); assertEquals(externalAddress, node1.getContactAddress()); // As above... node1 = (RemoteContact)ContactFactory .createLiveContact(sourceAddress, Vendor.UNKNOWN, Version.ZERO, KUID.createRandomID(), contactAddress, 0, Contact.DEFAULT_FLAG); assertEquals(contactAddress, node1.getContactAddress()); // As above... node1 = (RemoteContact)ContactFactory .createLiveContact(externalAddress, Vendor.UNKNOWN, Version.ZERO, KUID.createRandomID(), contactAddress, 0, Contact.DEFAULT_FLAG); assertEquals(externalAddress, node1.getContactAddress()); } }