package com.limegroup.gnutella;
import java.util.Collections;
import java.util.Set;
import junit.framework.Test;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.limewire.gnutella.tests.LimeTestUtils;
import org.limewire.gnutella.tests.NetworkManagerStub;
import org.limewire.io.Connectable;
import org.limewire.io.ConnectableImpl;
import org.limewire.io.GUID;
import org.limewire.util.BaseTestCase;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.limegroup.gnutella.uploader.HTTPHeaderUtils;
public class SelfEndpointTest extends BaseTestCase {
private NetworkManagerStub networkManagerStub;
private SelfEndpoint selfEndpoint;
private Mockery context;
private ConnectionManager connectionManager;
private Injector injector;
public SelfEndpointTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(SelfEndpointTest.class);
}
@Override
protected void setUp() throws Exception {
context = new Mockery();
connectionManager = context.mock(ConnectionManager.class);
networkManagerStub = new NetworkManagerStub();
injector = LimeTestUtils.createInjectorNonEagerly(new AbstractModule() {
@Override
protected void configure() {
bind(NetworkManager.class).toInstance(networkManagerStub);
bind(ConnectionManager.class).toInstance(connectionManager);
}
});
selfEndpoint = injector.getInstance(SelfEndpoint.class);
}
/**
* Ensures that new values in the network manager are reflected immediately
* in the self endpoint.
*/
public void testNetworkManagerChangesAreReflected() {
// for fwt version
networkManagerStub.setSupportsFWTVersion(0);
assertEquals(0, selfEndpoint.getFWTVersion());
networkManagerStub.setSupportsFWTVersion(1);
assertEquals(1, selfEndpoint.getFWTVersion());
// for external address
networkManagerStub.setExternalAddress(new byte[4]);
assertEquals(RemoteFileDesc.BOGUS_IP, selfEndpoint.getAddress());
networkManagerStub.setExternalAddress(new byte[] { (byte)192, (byte)168, 0, 1 });
assertEquals(RemoteFileDesc.BOGUS_IP, selfEndpoint.getAddress());
}
/**
* This is a whitebox test, if it doesn't make sense, feel free to change
* the implementation.
*/
public void testPrivateNetworkAddressResultsInBogusIp() {
networkManagerStub.setExternalAddress(new byte[] { (byte)192, (byte)168, 0, 1 });
assertEquals(RemoteFileDesc.BOGUS_IP, selfEndpoint.getAddress());
}
/**
* Ensures proxies are encoded in http string.
*/
public void testHttpStringValueContainsProxiesWithoutValidExternalAddress() throws Exception {
networkManagerStub.setExternalAddress(new byte[] { (byte)192, (byte)168, 0, 1 });
final Set<? extends Connectable> proxies = Collections.singleton(new ConnectableImpl("222.222.222.222", 2222, false));
context.checking(new Expectations() {{
allowing(connectionManager).getPushProxies();
will(returnValue(proxies));
}});
ApplicationServices applicationServices = injector.getInstance(ApplicationServices.class);
String expected = new GUID(applicationServices.getMyGUID()).toHexString();
expected += ";";
expected += HTTPHeaderUtils.encodePushProxies(proxies, ";", PushEndpoint.MAX_PROXIES);
System.out.println(expected);
assertEquals(expected, selfEndpoint.httpStringValue());
}
}