package com.limegroup.gnutella.search; import java.util.LinkedList; import java.util.List; import java.util.Set; import junit.framework.Test; import org.limewire.io.IpPort; import org.limewire.security.SecureMessage.Status; import org.limewire.util.NameValue; import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.google.inject.Singleton; import com.limegroup.gnutella.ActivityCallback; import com.limegroup.gnutella.ForMeReplyHandler; import com.limegroup.gnutella.LimeTestUtils; import com.limegroup.gnutella.RemoteFileDesc; import com.limegroup.gnutella.Response; import com.limegroup.gnutella.ResponseFactory; import com.limegroup.gnutella.ResponseVerifier; import com.limegroup.gnutella.ResponseVerifierImpl; import com.limegroup.gnutella.helpers.UrnHelper; import com.limegroup.gnutella.messages.QueryReply; import com.limegroup.gnutella.messages.QueryReplyFactory; import com.limegroup.gnutella.stubs.ActivityCallbackStub; import com.limegroup.gnutella.util.LimeTestCase; import com.limegroup.gnutella.xml.LimeXMLDocument; import com.limegroup.gnutella.xml.LimeXMLDocumentFactory; import com.limegroup.gnutella.xml.LimeXMLDocumentHelper; public class SearchResultHandlerTest extends LimeTestCase { private LimeXMLDocumentFactory factory; private MyActivityCallback callback; private LimeXMLDocumentHelper limeXMLDocumentHelper; private SearchResultHandler searchResultHandler; private ResponseFactory responseFactory; private QueryReplyFactory queryReplyFactory; public SearchResultHandlerTest(String name) { super(name); } public static Test suite() { return buildTestSuite(SearchResultHandlerTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } @Override protected void setUp() throws Exception { Injector injector = LimeTestUtils.createInjector(MyActivityCallback.class, new AbstractModule() { @Override protected void configure() { bind(ResponseVerifier.class).to(StubVerifier.class); } }); callback = (MyActivityCallback) injector.getInstance(ActivityCallback.class); limeXMLDocumentHelper = injector.getInstance(LimeXMLDocumentHelper.class); factory = injector.getInstance(LimeXMLDocumentFactory.class); searchResultHandler = injector.getInstance(SearchResultHandler.class); responseFactory = injector.getInstance(ResponseFactory.class); queryReplyFactory = injector.getInstance(QueryReplyFactory.class); } public void testSecureActionSent() throws Exception { List<NameValue<String>> list = new LinkedList<NameValue<String>>(); list.add(new NameValue<String>("audios__audio__action__", "http://somewhere.com")); LimeXMLDocument actionDoc = factory.createLimeXMLDocument(list, "http://www.limewire.com/schemas/audio.xsd"); Response actionResponse = responseFactory.createResponse(0, 1, "test", actionDoc, UrnHelper.SHA1); QueryReply reply = newQueryReply(new Response[] { actionResponse } ); reply.setSecureStatus(Status.SECURE); assertEquals(0, callback.results.size()); searchResultHandler.handleQueryReply(reply); assertEquals(1, callback.results.size()); RemoteFileDesc rfd = callback.getRFD(); assertNotNull(rfd.getXMLDocument()); assertEquals("http://somewhere.com", rfd.getXMLDocument().getAction()); assertEquals(Status.SECURE, rfd.getSecureStatus()); } public void testInsecureActionNotSent() throws Exception { Response actionResponse = responseFactory.createResponse(0, 1, "test", UrnHelper.SHA1); List<NameValue<String>> list = new LinkedList<NameValue<String>>(); list.add(new NameValue<String>("audios__audio__action__", "http://somewhere.com")); LimeXMLDocument actionDoc = factory.createLimeXMLDocument(list, "http://www.limewire.com/schemas/audio.xsd"); actionResponse.setDocument(actionDoc); QueryReply reply = newQueryReply(new Response[] { actionResponse } ); assertEquals(0, callback.results.size()); searchResultHandler.handleQueryReply(reply); assertEquals(0, callback.results.size()); } public void testInsecureResponseWithoutActionSent() throws Exception { Response actionResponse = responseFactory.createResponse(0, 1, "test", UrnHelper.SHA1); List<NameValue<String>> list = new LinkedList<NameValue<String>>(); list.add(new NameValue<String>("audios__audio__action__", "http://somewhere.com")); LimeXMLDocument actionDoc = factory.createLimeXMLDocument(list, "http://www.limewire.com/schemas/audio.xsd"); actionResponse.setDocument(actionDoc); Response noDoc = responseFactory.createResponse(1, 2, "other", UrnHelper.SHA1); QueryReply reply = newQueryReply(new Response[] { actionResponse, noDoc } ); assertEquals(0, callback.results.size()); searchResultHandler.handleQueryReply(reply); assertEquals(1, callback.results.size()); RemoteFileDesc rfd = callback.getRFD(); assertNull(rfd.getXMLDocument()); assertEquals("other", rfd.getFileName()); } public void testFailedReplyNotForwarded() throws Exception { Response actionResponse = responseFactory.createResponse(0, 1, "test", UrnHelper.SHA1); List<NameValue<String>> list = new LinkedList<NameValue<String>>(); list.add(new NameValue<String>("audios__audio__action__", "http://somewhere.com")); LimeXMLDocument actionDoc = factory.createLimeXMLDocument(list, "http://www.limewire.com/schemas/audio.xsd"); actionResponse.setDocument(actionDoc); Response noDoc = responseFactory.createResponse(1, 2, "other", UrnHelper.SHA1); QueryReply reply = newQueryReply(new Response[] { actionResponse, noDoc } ); reply.setSecureStatus(Status.FAILED); assertEquals(0, callback.results.size()); searchResultHandler.handleQueryReply(reply); assertEquals(0, callback.results.size()); } private QueryReply newQueryReply(Response[] responses) throws Exception { QueryReply reply = queryReplyFactory.createQueryReply(new byte[16], (byte)1, 6346, new byte[] { (byte)1, (byte)1, (byte)1, (byte)1 }, 1, responses, new byte[16], LimeXMLDocumentHelper.getAggregateString(responses).getBytes(), false, false, true, true, false, false, false, IpPort.EMPTY_SET, null); ForMeReplyHandler.addXMLToResponses(reply, limeXMLDocumentHelper); return reply; } @Singleton private static class MyActivityCallback extends ActivityCallbackStub { List<RemoteFileDesc> results = new LinkedList<RemoteFileDesc>(); @Override public void handleQueryResult(RemoteFileDesc rfd, QueryReply queryReply, Set alts) { results.add(rfd); } public RemoteFileDesc getRFD() { return results.remove(0); } } @Singleton private static class StubVerifier extends ResponseVerifierImpl { @Override public synchronized boolean matchesQuery(byte[] guid, Response response) { return true; } @Override public boolean isMandragoreWorm(byte[] guid, Response response) { return false; } @Override public boolean matchesType(byte[] guid, Response response) { return true; } } }