package com.limegroup.gnutella.uploader;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.limewire.core.settings.ConnectionSettings;
import org.limewire.core.settings.NetworkSettings;
import org.limewire.gnutella.tests.ActivityCallbackStub;
import org.limewire.gnutella.tests.LimeTestCase;
import org.limewire.gnutella.tests.LimeTestUtils;
import org.limewire.http.httpclient.HttpClientUtils;
import org.limewire.io.LocalSocketAddressProvider;
import org.limewire.io.LocalSocketAddressProviderStub;
import org.limewire.net.ConnectionDispatcher;
import org.limewire.nio.NIOTestUtils;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Singleton;
import com.google.inject.name.Named;
import com.limegroup.gnutella.Acceptor;
import com.limegroup.gnutella.ActivityCallback;
import com.limegroup.gnutella.HTTPAcceptor;
import com.limegroup.gnutella.HTTPUploadManager;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.Uploader;
import com.limegroup.gnutella.Uploader.UploadStatus;
import com.limegroup.gnutella.library.FileCollection;
import com.limegroup.gnutella.library.FileDescStub;
import com.limegroup.gnutella.library.GnutellaFiles;
import com.limegroup.gnutella.library.LibraryStubModule;
public class HTTPUploaderTest extends LimeTestCase {
private static final int PORT = 6668;
private static MyActivityCallback cb;
@Inject private HTTPAcceptor httpAcceptor;
private HttpClient client;
private URN urn1;
@Inject private HTTPUploadManager uploadManager;
private FileDescStub fd1;
@Inject private Acceptor acceptor;
@Inject @GnutellaFiles FileCollection gnutellaFileCollection;
@Inject @Named("global") ConnectionDispatcher connectionDispatcher;
private String host;
public HTTPUploaderTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(HTTPUploaderTest.class);
}
@Override
protected void setUp() throws Exception {
NetworkSettings.PORT.setValue(PORT);
ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false);
ConnectionSettings.EVER_ACCEPTED_INCOMING.setValue(true);
final LocalSocketAddressProviderStub localSocketAddressProvider = new LocalSocketAddressProviderStub();
localSocketAddressProvider.setTLSCapable(true);
Injector injector = LimeTestUtils.createInjectorNonEagerly(MyActivityCallback.class, new AbstractModule() {
@Override
protected void configure() {
bind(LocalSocketAddressProvider.class).toInstance(localSocketAddressProvider);
}
}, new LibraryStubModule(), LimeTestUtils.createModule(this));
urn1 = URN.createSHA1Urn("urn:sha1:PLSTHIPQGSSZTS5FJUPAKUZWUGYQYPFG");
fd1 = new FileDescStub("abc1.txt", urn1, 0);
gnutellaFileCollection.add(fd1);
cb = (MyActivityCallback) injector.getInstance(ActivityCallback.class);
acceptor.setListeningPort(PORT);
acceptor.start();
httpAcceptor.start();
uploadManager.start();
connectionDispatcher.addConnectionAcceptor(httpAcceptor, false, httpAcceptor.getHttpMethods());
client = new DefaultHttpClient();
host = "http://localhost:" + PORT;
}
@Override
protected void tearDown() throws Exception {
uploadManager.stop();
httpAcceptor.stop();
acceptor.setListeningPort(0);
acceptor.shutdown();
NIOTestUtils.waitForNIO();
}
public void testBrowseEnabled() throws Exception {
HttpGet method = new HttpGet(host + "/uri-res/N2R?" + urn1);
HttpResponse response = null;
try {
response = client.execute(method);
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
assertEquals(1, cb.uploads.size());
HTTPUploader uploader = (HTTPUploader) cb.uploads.get(0);
assertFalse(uploader.isBrowseHostEnabled());
assertEquals("127.0.0.1", uploader.getHost());
} finally {
HttpClientUtils.releaseConnection(response);
}
method = new HttpGet(host + "/uri-res/N2R?" + urn1);
method.addHeader("X-Features", "chat/0.1");
try {
response = client.execute(method);
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
assertEquals(1, cb.uploads.size());
HTTPUploader uploader = (HTTPUploader) cb.uploads.get(0);
assertFalse(uploader.isBrowseHostEnabled());
assertEquals("127.0.0.1", uploader.getHost());
} finally {
HttpClientUtils.releaseConnection(response);
}
method = new HttpGet(host + "/uri-res/N2R?" + urn1);
method.addHeader("X-Node", "123.123.123.123:456");
method.addHeader("X-Features", "chat/0.1");
try {
response = client.execute(method);
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
assertEquals(1, cb.uploads.size());
HTTPUploader uploader = (HTTPUploader) cb.uploads.get(0);
assertFalse(uploader.isBrowseHostEnabled());
assertEquals(456, uploader.getGnutellaPort());
assertEquals("123.123.123.123", uploader.getHost());
} finally {
HttpClientUtils.releaseConnection(response);
}
// old chat header isn't supported anymore.
// method = new HttpGet(host + "/uri-res/N2R?" + urn1);
// method.addHeader("Chat", "123.123.123.123:456");
// try {
// response = client.execute(method);
// assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
// assertEquals(1, cb.uploads.size());
// HTTPUploader uploader = (HTTPUploader) cb.uploads.get(0);
// assertTrue(uploader.isBrowseHostEnabled());
// assertEquals(456, uploader.getGnutellaPort());
// assertEquals("123.123.123.123", uploader.getHost());
// } finally {
// HttpClientUtils.releaseConnection(response);
// }
}
public void testAmountRead() throws Exception {
HTTPUploader uploader;
HttpGet method = new HttpGet(host + "/uri-res/N2R?" + urn1);
HttpResponse response = null;
try {
response = client.execute(method);
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
assertEquals(1, cb.uploads.size());
uploader = (HTTPUploader) cb.uploads.get(0);
assertEquals(UploadType.SHARED_FILE, uploader.getUploadType());
InputStream in = response.getEntity().getContent();
LimeTestUtils.readBytes(in, 500);
Thread.sleep(500);
assertGreaterThanOrEquals(500, uploader.amountUploaded());
LimeTestUtils.readBytes(in, 500);
Thread.sleep(500);
assertGreaterThanOrEquals(1000, uploader.amountUploaded());
} finally {
HttpClientUtils.releaseConnection(response);
}
NIOTestUtils.waitForNIO();
assertEquals(UploadStatus.COMPLETE, uploader.getState());
}
@Singleton
private static class MyActivityCallback extends ActivityCallbackStub {
List<Uploader> uploads = new ArrayList<Uploader>();
@Override
public void addUpload(Uploader u) {
uploads.add(u);
}
@Override
public void removeUpload(Uploader u) {
boolean removed = uploads.remove(u);
assertTrue("Upload has been added before", removed);
}
}
}