package com.limegroup.gnutella; import java.io.File; import java.util.Iterator; import junit.framework.Test; import com.limegroup.gnutella.messages.QueryReply; import com.limegroup.gnutella.messages.QueryRequest; import com.limegroup.gnutella.routing.QueryRouteTable; import com.limegroup.gnutella.routing.RouteTableMessage; import com.limegroup.gnutella.settings.SharingSettings; import com.limegroup.gnutella.stubs.ActivityCallbackStub; import com.limegroup.gnutella.util.CommonUtils; /** * Tests that a Ultrapeer correctly sends XML Replies. * * ULTRAPEER_1 ---- CENTRAL TEST ULTRAPEER ---- ULTRAPEER_2 * | * | * | * LEAF * * This test should cover the case for leaves too, since there is no difference * between Leaf and UP when it comes to this behavior. */ public final class ServerSideXMLReplyTest extends ServerSideTestCase { /** * The timeout value for sockets -- how much time we wait to accept * individual messages before giving up. */ private static final int TIMEOUT = 2000; public ServerSideXMLReplyTest(String name) { super(name); } public static Test suite() { return buildTestSuite(ServerSideXMLReplyTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static Integer numUPs() { return new Integer(1); } public static Integer numLeaves() { return new Integer(1); } public static ActivityCallback getActivityCallback() { return new ActivityCallbackStub(); } public static void setSettings() { SharingSettings.EXTENSIONS_TO_SHARE.setValue("mp3;"); // get the resource file for com/limegroup/gnutella File mp3 = CommonUtils.getResourceFile("com/limegroup/gnutella/metadata/mpg2layII_1504h_16k_frame56_24000hz_joint_CRCOrigID3v1&2_test27.mp3"); assertTrue(mp3.exists()); // now move them to the share dir CommonUtils.copy(mp3, new File(_sharedDir, "metadata.mp3")); } public static void setUpQRPTables() throws Exception { //3. routed leaf, with route table for "test" QueryRouteTable qrt = new QueryRouteTable(); qrt.add("berkeley"); qrt.add("susheel"); qrt.addIndivisible(HugeTestUtils.UNIQUE_SHA1.toString()); for (Iterator iter=qrt.encode(null).iterator(); iter.hasNext(); ) { LEAF[0].send((RouteTableMessage)iter.next()); LEAF[0].flush(); } // for Ultrapeer 1 qrt = new QueryRouteTable(); qrt.add("leehsus"); qrt.add("berkeley"); for (Iterator iter=qrt.encode(null).iterator(); iter.hasNext(); ) { ULTRAPEER[0].send((RouteTableMessage)iter.next()); ULTRAPEER[0].flush(); } } // BEGIN TESTS // ------------------------------------------------------ public void testXMLReturned1() throws Exception { drainAll(); // send a query QueryRequest query = QueryRequest.createQuery("metadata"); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that result has heXML. QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNotNull(reply); assertNotNull(reply.getXMLBytes()); assertTrue("xml length = " + reply.getXMLBytes().length, reply.getXMLBytes().length > 10); } public void testXMLReturned2() throws Exception { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio genre=\"Ambient\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("Ambient", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that result has heXML. QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNotNull(reply); assertNotNull(reply.getXMLBytes()); assertTrue("xml length = " + reply.getXMLBytes().length, reply.getXMLBytes().length > 10); } public void testBitrateExclusion() throws Exception { // test that a mismatching artist name doesn't return a result { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio bitrate=\"16\" artist=\"junk\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("junk 16", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that we don't get a result QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNull(reply); } // test that a matching artist name does return a result { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio bitrate=\"16\" artist=\"Test\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("Test 16", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that we do get a result QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNotNull(reply); assertNotNull(reply.getXMLBytes()); assertTrue("xml length = " + reply.getXMLBytes().length, reply.getXMLBytes().length > 10); } // test that a null price value doesn't return a result { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio bitrate=\"16\" price=\"$19.99\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("$19.99 16", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that we don't get a result QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNull(reply); } // 3 fields - bitrate matches, but only one other, so no return { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio bitrate=\"16\" artist=\"Test\" title=\"junk\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("Test junk 16", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that we don't get a result QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNull(reply); } // 3 fields - all match, should return { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio bitrate=\"16\" artist=\"Test\" title=\"Test mpg\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("Test mpg 16", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that we do get a result QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNotNull(reply); assertNotNull(reply.getXMLBytes()); assertTrue("xml length = " + reply.getXMLBytes().length, reply.getXMLBytes().length > 10); } // 3 fields - 1 match, 1 null, should return { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio bitrate=\"16\" artist=\"Test\" type=\"Audiobook\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("Test Audiobook 16", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that we do get a result QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNotNull(reply); assertNotNull(reply.getXMLBytes()); assertTrue("xml length = " + reply.getXMLBytes().length, reply.getXMLBytes().length > 10); } // 3 fields - 2 null, should not return { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio bitrate=\"16\" price=\"$19.99\" type=\"Audiobook\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("$19.99 Audiobook 16", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that we don't get a result QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNull(reply); } // 3 fields - 1 null, 1 mismatch, should not return { drainAll(); String richQuery = "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio bitrate=\"16\" price=\"$19.99\" artist=\"Tester\"></audio></audios>"; // send a query QueryRequest query = QueryRequest.createQuery("$19.99 Tester 16", richQuery); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // wait for processing Thread.sleep(750); // confirm that we don't get a result QueryReply reply = getFirstQueryReply(ULTRAPEER[0]); assertNull(reply); } } }