package com.limegroup.gnutella.net.address;
import junit.framework.Test;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.limewire.io.Address;
import org.limewire.io.Connectable;
import org.limewire.io.ConnectableImpl;
import org.limewire.io.Address.EventType;
import org.limewire.listener.EventBroadcaster;
import org.limewire.listener.EventMulticaster;
import org.limewire.net.ConnectivityChangeEvent;
import org.limewire.net.address.AddressEvent;
import org.limewire.net.address.BlockingAddressResolutionObserver;
import org.limewire.net.address.FirewalledAddress;
import org.limewire.util.BaseTestCase;
import com.limegroup.gnutella.stubs.NetworkManagerStub;
public class SameNATAddressResolverTest extends BaseTestCase {
private NetworkManagerStub networkManagerStub;
private SameNATAddressResolver resolver;
private Mockery context;
private EventBroadcaster eventBroadcaster;
public SameNATAddressResolverTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(SameNATAddressResolverTest.class);
}
@SuppressWarnings("unchecked")
@Override
protected void setUp() throws Exception {
context = new Mockery();
networkManagerStub = new NetworkManagerStub();
eventBroadcaster = context.mock(EventMulticaster.class);
resolver = new SameNATAddressResolver(networkManagerStub, eventBroadcaster);
networkManagerStub.setExternalAddress(new byte[] { (byte)129, 0, 0, 1 });
networkManagerStub.setAddress(new byte[] { (byte)192, (byte)168, 0, 1});
}
public void testCanResolve() throws Exception {
assertTrue(resolver.canResolve(createAddress("129.0.0.1", "192.168.0.5")));
assertFalse(resolver.canResolve(createAddress("129.0.0.1", "10.0.0.1")));
assertFalse(resolver.canResolve(createAddress("128.0.0.1", "192.168.0.5")));
}
@SuppressWarnings("unchecked")
public void testConnectivityEventOnlyFiredOnce() {
context.checking(new Expectations() {{
one(eventBroadcaster).broadcast(with(any(ConnectivityChangeEvent.class)));
}});
resolver.handleEvent(new AddressEvent(context.mock(Address.class), EventType.ADDRESS_CHANGED));
resolver.handleEvent(new AddressEvent(context.mock(Address.class), EventType.ADDRESS_CHANGED));
context.assertIsSatisfied();
}
public void testResolvesSameNatAddressToConnectable() throws Exception {
BlockingAddressResolutionObserver observer = new BlockingAddressResolutionObserver();
FirewalledAddress behindSameNatAddress = createAddress("129.0.0.1", "192.168.0.2");
resolver.resolve(behindSameNatAddress, observer);
Address resolvedAddress = observer.getAddress();
Connectable connectable = (Connectable) resolvedAddress;
assertEquals("192.168.0.2", connectable.getAddress());
}
public void testDoesNotResolveDifferentSiteLocalNetwork() throws Exception {
BlockingAddressResolutionObserver observer = new BlockingAddressResolutionObserver();
FirewalledAddress samePublicAddressDifferentSiteLocalNetwork = createAddress("129.0.0.1", "172.16.0.5");
try {
resolver.resolve(samePublicAddressDifferentSiteLocalNetwork, observer);
fail("expected assertion error");
} catch (AssertionError ae) {
}
}
public void testDoesNotResolveDifferentPublicAddress() throws Exception {
BlockingAddressResolutionObserver observer = new BlockingAddressResolutionObserver();
FirewalledAddress samePublicAddressDifferentSiteLocalNetwork = createAddress("128.0.0.1", "191.168.0.2");
try {
resolver.resolve(samePublicAddressDifferentSiteLocalNetwork, observer);
fail("expected assertion error");
} catch (AssertionError ae) {
}
}
private FirewalledAddress createAddress(String publicAddress, String privateAddress) throws Exception {
return new FirewalledAddress(new ConnectableImpl(publicAddress, 5555, false),
new ConnectableImpl(privateAddress, 6666, true),
null, null, 0);
}
}