package com.limegroup.gnutella.search; import java.util.Iterator; import java.util.Map; import java.util.Set; import junit.framework.Test; import com.limegroup.gnutella.ReplyHandler; import com.limegroup.gnutella.RouterService; import com.limegroup.gnutella.messages.QueryRequest; import com.limegroup.gnutella.stubs.ActivityCallbackStub; import com.limegroup.gnutella.stubs.ReplyHandlerStub; import com.limegroup.gnutella.util.BaseTestCase; import com.limegroup.gnutella.util.PrivilegedAccessor; import com.limegroup.gnutella.util.TestResultCounter; /** * This class tests the dispatching of dynamic queries for ourselves * (as Ultrapeer) and on behalf of our leaves. */ public class QueryDispatcherTest extends BaseTestCase { public QueryDispatcherTest(String name) { super(name); } public static Test suite() { return buildTestSuite(QueryDispatcherTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } /** * Test to make sure that <tt>ReplyHandler</tt>s are removed correctly * from the query dispatcher. */ public void testRemoveReplyHandler() throws Exception { new RouterService(new ActivityCallbackStub()); QueryDispatcher qd = QueryDispatcher.instance(); Map queries = (Map)PrivilegedAccessor.getValue(qd, "QUERIES"); assertEquals("should not be any queries", 0, queries.size()); QueryRequest qr = QueryRequest.createQuery("test"); ReplyHandler rh = new TestReplyHandler(); QueryHandler handler = QueryHandler.createHandlerForNewLeaf(qr, rh, new TestResultCounter(0)); qd.addQuery(handler); qd.addQuery(handler); Thread.sleep(3000); assertEquals("unexpected queries size", 1, queries.size()); qd.removeReplyHandler(rh); assertEquals("should not be any queries", 0, queries.size()); // now add two different queries and make sure everything is koser QueryRequest qrAlt = QueryRequest.createQuery("test 2"); QueryHandler handlerAlt = QueryHandler.createHandlerForNewLeaf(qrAlt, rh, new TestResultCounter(0)); qd.addQuery(handler); qd.addQuery(handlerAlt); Thread.sleep(3000); assertEquals("unexpected queries size", 2, queries.size()); qd.removeReplyHandler(rh); assertEquals("should not be any queries", 0, queries.size()); // one more test - make sure different RHs don't effect each other QueryRequest qrOther = QueryRequest.createQuery("test other"); ReplyHandler rhOther = new TestReplyHandler(); QueryHandler handlerOther = QueryHandler.createHandlerForNewLeaf(qrOther, rhOther, new TestResultCounter(0)); qd.addQuery(handler); qd.addQuery(handlerAlt); qd.addQuery(handlerOther); Thread.sleep(3000); assertEquals("unexpected queries size", 3, queries.size()); qd.removeReplyHandler(rh); assertEquals("should only be Other queries", 1, queries.size()); qd.removeReplyHandler(rhOther); assertEquals("should not be any queries", 0, queries.size()); } /** * tests that user stopped queries via _toRemove set are stopped and * removed correctly */ public void testRemoveStoppedQuery() throws Exception { new RouterService(new ActivityCallbackStub()); QueryDispatcher qd = QueryDispatcher.instance(); Map queries = (Map)PrivilegedAccessor.getValue(qd, "QUERIES"); QueryRequest qr = QueryRequest.createQuery("test"); ReplyHandler rh = new TestReplyHandler(); QueryHandler qhand = QueryHandler.createHandlerForNewLeaf(qr, rh, new TestResultCounter(0)); QueryRequest qr2 = QueryRequest.createQuery("test2"); QueryHandler qhand2 = QueryHandler.createHandlerForNewLeaf(qr2, rh, new TestResultCounter(0)); qd.addQuery(qhand); qd.addQuery(qhand2); Thread.sleep(3000); assertEquals("there should be 2 queries", 2, queries.size()); qd.addToRemove(qhand.getGUID()); Thread.sleep(1000); assertEquals("there should now be only 1 query", 1, queries.size()); //now make sure the right query got deleted Iterator iter = queries.values().iterator(); assertEquals("the wrong query got removed", qhand2.getGUID(), ((QueryHandler)iter.next()).getGUID()); } private static final class TestReplyHandler extends ReplyHandlerStub { public boolean isSupernodeClientConnection() { return true; } } }