package com.limegroup.gnutella.uploader;
import java.util.Collections;
import junit.framework.Test;
import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.message.BasicHttpRequest;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.protocol.BasicHttpContext;
import org.limewire.io.ConnectableImpl;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.limegroup.gnutella.ConnectionManager;
import com.limegroup.gnutella.LimeTestUtils;
import com.limegroup.gnutella.NetworkManager;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.http.HTTPHeaderName;
import com.limegroup.gnutella.library.FileDesc;
import com.limegroup.gnutella.library.FileDescStub;
import com.limegroup.gnutella.library.FileManager;
import com.limegroup.gnutella.library.FileManagerStub;
import com.limegroup.gnutella.library.GnutellaFileListStub;
import com.limegroup.gnutella.stubs.ConnectionManagerStub;
import com.limegroup.gnutella.stubs.NetworkManagerStub;
import com.limegroup.gnutella.uploader.authentication.GnutellaUploadFileListProvider;
import com.limegroup.gnutella.util.LimeTestCase;
public class FileRequestHandlerTest extends LimeTestCase {
private FileDesc fd = new FileDescStub("filename");
private URN urn1;
private MockHTTPUploadSessionManager sessionManager;
private FileManagerStub fileManager;
private FileRequestHandler fileRequestHandler;
private Injector injector;
public FileRequestHandlerTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(FileRequestHandlerTest.class);
}
@Override
protected void setUp() throws Exception {
sessionManager = new MockHTTPUploadSessionManager();
injector = LimeTestUtils.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(ConnectionManager.class).to(ConnectionManagerStub.class);
bind(HTTPUploadSessionManager.class).toInstance(sessionManager);
bind(FileManager.class).to(FileManagerStub.class);
bind(NetworkManager.class).to(NetworkManagerStub.class);
}
});
ConnectionManagerStub connectionManager = (ConnectionManagerStub) injector
.getInstance(ConnectionManager.class);
connectionManager.setPushProxies(Collections.singleton(new ConnectableImpl("127.0.0.1",
9999, false)));
fileManager = (FileManagerStub) injector.getInstance(FileManager.class);
GnutellaFileListStub sharedList = fileManager.getGnutellaFileList();
urn1 = URN.createSHA1Urn("urn:sha1:PLSTHIPQGSSZTS5FJUPAKUZWUGYQYPFG");
FileDesc fd1 = new FileDescStub("abc1.txt", urn1, 0);
sharedList.add(fd1);
GnutellaUploadFileListProvider uploadProvider = injector.getInstance(GnutellaUploadFileListProvider.class);
fileRequestHandler = injector.getInstance(FileRequestHandlerFactory.class).createFileRequestHandler(uploadProvider, false);
}
public void testHandleAccept() throws Exception {
HttpRequest request = new BasicHttpRequest("GET", "filename");
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "");
HTTPUploader uploader = new HTTPUploader("filename", null);
// setting host to a value, so we don't need to specify a session
uploader.setHost("somehost");
uploader.setFileDesc(fd);
NetworkManagerStub networkManager = (NetworkManagerStub) injector
.getInstance(NetworkManager.class);
networkManager.setCanDoFWT(true);
fileRequestHandler.handleAccept(new BasicHttpContext(null), request, response,
uploader, fd);
Header header = response.getFirstHeader(HTTPHeaderName.FWTPORT.httpStringValue());
assertNotNull("expected header: " + HTTPHeaderName.FWTPORT.httpStringValue(), header);
assertEquals(networkManager.getStableUDPPort() + "", header.getValue());
}
public void testFeatureHeaderInterceptor() throws Exception {
HTTPUploadSession session = new HTTPUploadSession(null, null, null);
HTTPUploader uploader = new HTTPUploader("filename", session);
// setting host to a value, so we don't need to specify a session
uploader.setHost("somehost");
uploader.setFileDesc(fd);
sessionManager.uploader = uploader;
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "");
HttpRequest request = new BasicHttpRequest("GET", LimeTestUtils.getRelativeRequest(urn1));
request.addHeader("X-Features", "fwalt/0.1,browse/1.0,chat/0.1");
request.addHeader("X-Node", "127.0.0.1:1234");
request.addHeader("X-Downloaded", "123456");
request.addHeader("Range", "bytes 1-2");
request.addHeader("X-Gnutella-Content-URN", urn1.httpStringValue());
request.addHeader("X-Queue", "1.0");
fileRequestHandler.handle(request, response, new BasicHttpContext(null));
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
assertEquals(1234, uploader.getGnutellaPort());
assertEquals("127.0.0.1", uploader.getHost());
assertTrue(uploader.isBrowseHostEnabled());
assertEquals(123456, uploader.getTotalAmountUploaded());
assertEquals(1, uploader.getUploadBegin());
assertEquals(3, uploader.getUploadEnd());
assertEquals(true, uploader.containedRangeRequest());
assertEquals(urn1, uploader.getRequestedURN());
assertTrue(uploader.supportsQueueing());
}
// chat header unused.
// public void testFeatureHeaderInterceptorChat() throws Exception {
// HTTPUploadSession session = new HTTPUploadSession(null, null, null);
// HTTPUploader uploader = new HTTPUploader("filename", session);
// // setting host to a value, so we don't need to specify a session
// uploader.setHost("somehost");
// uploader.setFileDesc(fd);
// sessionManager.uploader = uploader;
// HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "");
//
// HttpRequest request = new BasicHttpRequest("GET", LimeTestUtils.getRelativeRequest(urn1));
// request.addHeader("Chat", "128.0.0.1:5678");
// fileRequestHandler.handle(request, response, new BasicHttpContext(null));
// assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
// assertEquals(5678, uploader.getGnutellaPort());
// assertEquals("128.0.0.1", uploader.getHost());
// assertTrue(uploader.isBrowseHostEnabled());
// }
/**
* Tests if browse host is enabled on the uploader if the downloader sent
* its push endpoint information along in the X-FWT-Node header.
*/
public void testIsFWTBrowseHostEnabled() throws Exception {
HTTPUploadSession session = new HTTPUploadSession(null, null, null);
HTTPUploader uploader = new HTTPUploader("filename", session);
// setting host to a value, so we don't need to specify a session
uploader.setHost("somehost");
uploader.setFileDesc(fd);
sessionManager.uploader = uploader;
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "");
HttpRequest request = new BasicHttpRequest("GET", LimeTestUtils.getRelativeRequest(urn1));
String pushEndpoint = "FF9EEA9E8B2E1D737828EFD1B7DAC500;129.168.0.1:5555";
request.addHeader(HTTPHeaderName.FW_NODE_INFO.create(pushEndpoint));
fileRequestHandler.handle(request, response, new BasicHttpContext(null));
assertTrue(uploader.isBrowseHostEnabled());
assertEquals(pushEndpoint, uploader.getPushEndpoint().httpStringValue());
}
}