package com.limegroup.gnutella.search;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import junit.framework.Test;
import com.limegroup.gnutella.ForMeReplyHandler;
import com.limegroup.gnutella.RemoteFileDesc;
import com.limegroup.gnutella.Response;
import com.limegroup.gnutella.ResponseVerifier;
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.messages.QueryReply;
import com.limegroup.gnutella.messages.SecureMessage;
import com.limegroup.gnutella.stubs.ActivityCallbackStub;
import com.limegroup.gnutella.util.BaseTestCase;
import com.limegroup.gnutella.util.NameValue;
import com.limegroup.gnutella.util.PrivilegedAccessor;
import com.limegroup.gnutella.xml.LimeXMLDocument;
import com.limegroup.gnutella.xml.LimeXMLDocumentHelper;
public class SearchResultHandlerTest extends BaseTestCase {
private StubCallback callback = new StubCallback();
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());
}
public void setUp() throws Exception {
new RouterService(callback);
PrivilegedAccessor.setValue(RouterService.class, "VERIFIER", new StubVerifier());
}
public void testSecureActionSent() throws Exception {
SearchResultHandler handler = new SearchResultHandler();
List list = new LinkedList();
list.add(new NameValue("audios__audio__action__", "http://somewhere.com"));
LimeXMLDocument actionDoc = new LimeXMLDocument(list, "http://www.limewire.com/schemas/audio.xsd");
Response actionResponse = new Response(0, 1, "test", actionDoc);
QueryReply reply = newQueryReply(new Response[] { actionResponse } );
reply.setSecureStatus(SecureMessage.SECURE);
assertEquals(0, callback.results.size());
handler.handleQueryReply(reply);
assertEquals(1, callback.results.size());
RemoteFileDesc rfd = callback.getRFD();
assertNotNull(rfd.getXMLDocument());
assertEquals("http://somewhere.com", rfd.getXMLDocument().getAction());
assertEquals(SecureMessage.SECURE, rfd.getSecureStatus());
}
public void testInsecureActionNotSent() throws Exception {
SearchResultHandler handler = new SearchResultHandler();
Response actionResponse = new Response(0, 1, "test");
List list = new LinkedList();
list.add(new NameValue("audios__audio__action__", "http://somewhere.com"));
LimeXMLDocument actionDoc = new LimeXMLDocument(list, "http://www.limewire.com/schemas/audio.xsd");
actionResponse.setDocument(actionDoc);
QueryReply reply = newQueryReply(new Response[] { actionResponse } );
assertEquals(0, callback.results.size());
handler.handleQueryReply(reply);
assertEquals(0, callback.results.size());
}
public void testInsecureResponseWithoutActionSent() throws Exception {
SearchResultHandler handler = new SearchResultHandler();
Response actionResponse = new Response(0, 1, "test");
List list = new LinkedList();
list.add(new NameValue("audios__audio__action__", "http://somewhere.com"));
LimeXMLDocument actionDoc = new LimeXMLDocument(list, "http://www.limewire.com/schemas/audio.xsd");
actionResponse.setDocument(actionDoc);
Response noDoc = new Response(1, 2, "other");
QueryReply reply = newQueryReply(new Response[] { actionResponse, noDoc } );
assertEquals(0, callback.results.size());
handler.handleQueryReply(reply);
assertEquals(1, callback.results.size());
RemoteFileDesc rfd = callback.getRFD();
assertNull(rfd.getXMLDocument());
assertEquals("other", rfd.getFileName());
}
public void testFailedReplyNotForwarded() throws Exception {
SearchResultHandler handler = new SearchResultHandler();
Response actionResponse = new Response(0, 1, "test");
List list = new LinkedList();
list.add(new NameValue("audios__audio__action__", "http://somewhere.com"));
LimeXMLDocument actionDoc = new LimeXMLDocument(list, "http://www.limewire.com/schemas/audio.xsd");
actionResponse.setDocument(actionDoc);
Response noDoc = new Response(1, 2, "other");
QueryReply reply = newQueryReply(new Response[] { actionResponse, noDoc } );
reply.setSecureStatus(SecureMessage.FAILED);
assertEquals(0, callback.results.size());
handler.handleQueryReply(reply);
assertEquals(0, callback.results.size());
}
private QueryReply newQueryReply(Response[] responses) throws Exception {
QueryReply reply =
new QueryReply( 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
, Collections.EMPTY_SET
);
PrivilegedAccessor.invokeMethod(ForMeReplyHandler.instance(), "addXMLToResponses", reply);
return reply;
}
private static class StubCallback extends ActivityCallbackStub {
List results = new LinkedList();
public void handleQueryResult(RemoteFileDesc rfd, HostData data, Set alts) {
results.add(rfd);
}
public RemoteFileDesc getRFD() {
return (RemoteFileDesc)results.remove(0);
}
}
private static class StubVerifier extends ResponseVerifier {
public synchronized boolean matchesQuery(byte[] guid, Response response) {
return true;
}
public boolean isMandragoreWorm(byte[] guid, Response response) {
return false;
}
public boolean matchesType(byte[] guid, Response response) {
return true;
}
}
}