package com.limegroup.gnutella.licenses;
import java.io.*;
import java.util.*;
import java.net.*;
import junit.framework.Test;
import com.limegroup.gnutella.*;
import com.limegroup.gnutella.util.*;
import com.limegroup.gnutella.metadata.*;
import com.limegroup.gnutella.xml.*;
import com.limegroup.gnutella.settings.*;
import com.limegroup.gnutella.stubs.*;
import com.limegroup.gnutella.messages.*;
import com.limegroup.gnutella.routing.*;
public final class LicenseSharingTest extends ClientSideTestCase {
public LicenseSharingTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(LicenseSharingTest.class);
}
/**
* Runs this test individually.
*/
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
// needed by ClientSideTestCase
public static ActivityCallback getActivityCallback() {
return new ActivityCallbackStub();
}
// needed by ClientSideTestCase
public static Integer numUPs() {
return new Integer(3);
}
// used by ClientSideTestCase
private static void doSettings() {
SharingSettings.EXTENSIONS_TO_SHARE.setValue("mp3;ogg;wma");
// get the resource file for com/limegroup/gnutella
File cc1 = CommonUtils.getResourceFile("com/limegroup/gnutella/licenses/ccverifytest0.mp3");
File cc2 = CommonUtils.getResourceFile("com/limegroup/gnutella/licenses/ccverifytest1.mp3");
File cc3 = CommonUtils.getResourceFile("com/limegroup/gnutella/licenses/cc1.mp3");
File cc4 = CommonUtils.getResourceFile("com/limegroup/gnutella/licenses/ccverifytest0.ogg");
File wma5 = CommonUtils.getResourceFile("com/limegroup/gnutella/licenses/weed-PUSA-LoveEverybody.wma");
assertTrue(cc1.exists());
assertTrue(cc2.exists());
assertTrue(cc3.exists());
assertTrue(cc4.exists());
assertTrue(wma5.exists());
// now move them to the share dir
CommonUtils.copy(cc1, new File(_sharedDir, "cc1.mp3"));
CommonUtils.copy(cc2, new File(_sharedDir, "cc2.mp3"));
CommonUtils.copy(cc3, new File(_sharedDir, "cc3.mp3"));
CommonUtils.copy(cc4, new File(_sharedDir, "cc4.ogg"));
CommonUtils.copy(wma5, new File(_sharedDir, "wma5.wma"));
}
public void testFileDescKnowsLicense() throws Exception {
FileManager fm = RouterService.getFileManager();
FileDesc[] fds = fm.getAllSharedFileDescriptors();
assertEquals(5, fds.length);
for(int i = 0; i < fds.length; i++)
assertTrue(fds[i].toString(), fds[i].isLicensed());
}
public void testQRPExchange() throws Exception {
assertEquals(5, rs.getNumSharedFiles());
for (int i = 0; i < testUP.length; i++) {
assertTrue("should be open", testUP[i].isOpen());
assertTrue("should be up -> leaf", testUP[i].isSupernodeClientConnection());
if (i != testUP.length - 1)
drain(testUP[i], 500);
}
final int upIndex = testUP.length - 1;
QueryRouteTable qrt = new QueryRouteTable();
assertEquals(0.0, qrt.getPercentFull(), 0);
// need to wait for QRP table to be sent
Thread.sleep(15000);
try {
Message m = null;
while (true) {
m = testUP[upIndex].receive(500);
if (m instanceof ResetTableMessage)
qrt.reset((ResetTableMessage) m);
else if (m instanceof PatchTableMessage)
qrt.patch((PatchTableMessage) m);
}
} catch (InterruptedIOException bad) {}
assertGreaterThan(0, qrt.getPercentFull());
// send a query that should hit in the qrt
// Check CC
String richQuery = "<?xml version=\"1.0\"?><audios><audio licensetype=\"creativecommons.org/licenses/\"/></audios>";
new LimeXMLDocument(richQuery); // make sure it can be constructed.
QueryRequest query = QueryRequest.createQuery("", richQuery);
assertTrue(qrt.contains(query));
// Check Weed
richQuery = "<?xml version=\"1.0\"?><audios><audio licensetype=\"http://www.shmedlic.com/license/3play.aspx\"/></audios>";
new LimeXMLDocument(richQuery); // make sure it can be constructed.
query = QueryRequest.createQuery("", richQuery);
assertTrue(qrt.contains(query));
}
public void testCCResultsXMLSearch() throws Exception {
setAcceptedIncoming();
String richQuery = "<?xml version=\"1.0\"?><audios><audio licensetype=\"creativecommons.org/licenses/\"/></audios>";
new LimeXMLDocument(richQuery);
// we should send a query to the leaf and get results.
QueryRequest query = QueryRequest.createQuery("", richQuery);
testUP[1].send(query);
testUP[1].flush();
QueryReply reply = getFirstQueryReply(testUP[1]);
assertNotNull(reply);
assertEquals(query.getGUID(), reply.getGUID());
assertEquals(reply.getResultsAsList().toString(), 4, reply.getResultCount());
if(!addXMLToResponses(reply))
fail("Couldn't add XML to response. :(");
for(Iterator i = reply.getResults(); i.hasNext(); ) {
Response r = (Response)i.next();
assertNotNull(r.getDocument());
LimeXMLDocument doc = r.getDocument();
assertTrue(r.toString(), doc.isLicenseAvailable());
assertNotNull(r.toString(), doc.getLicense());
assertInstanceof(CCLicense.class, doc.getLicense());
}
}
public void testWeedResultsXMLSearch() throws Exception {
setAcceptedIncoming();
String richQuery = "<?xml version=\"1.0\"?><audios><audio licensetype=\"http://www.shmedlic.com/license/3play.aspx\"/></audios>";
new LimeXMLDocument(richQuery);
// we should send a query to the leaf and get results.
QueryRequest query = QueryRequest.createQuery("", richQuery);
testUP[1].send(query);
testUP[1].flush();
QueryReply reply = getFirstQueryReply(testUP[1]);
assertNotNull(reply);
assertEquals(query.getGUID(), reply.getGUID());
assertEquals(reply.getResultsAsList().toString(), 1, reply.getResultCount());
if(!addXMLToResponses(reply))
fail("Couldn't add XML to response. :(");
for(Iterator i = reply.getResults(); i.hasNext(); ) {
Response r = (Response)i.next();
LimeXMLDocument doc = r.getDocument();
assertNotNull(doc);
assertTrue(r.toString(), doc.isLicenseAvailable());
assertNotNull(r.toString(), doc.getLicense());
assertInstanceof(WeedLicense.class, doc.getLicense());
}
}
/**
* Tests whether a search with a license in the query returns results
* without a matching license.
*/
public void testLicenseRequiredXMLSearch() throws Exception {
setAcceptedIncoming();
String richQuery = "<?xml version=\"1.0\"?><audios><audio title=\"love\" licensetype=\"http://www.shmedlic.com/license/3play.aspx\"/></audios>";
new LimeXMLDocument(richQuery);
// we should send a query to the leaf and get results.
QueryRequest query = QueryRequest.createQuery("", richQuery);
testUP[1].send(query);
testUP[1].flush();
QueryReply reply = getFirstQueryReply(testUP[1]);
assertNotNull(reply);
assertEquals(query.getGUID(), reply.getGUID());
assertEquals(reply.getResultsAsList().toString(), 1, reply.getResultCount());
if (!addXMLToResponses(reply))
fail("Couldn't add XML to response. :(");
for (Iterator i = reply.getResults(); i.hasNext(); ) {
Response r = (Response)i.next();
LimeXMLDocument doc = r.getDocument();
assertNotNull(doc);
assertTrue(r.toString(), doc.isLicenseAvailable());
assertNotNull(r.toString(), doc.getLicense());
assertInstanceof(WeedLicense.class, doc.getLicense());
}
}
/**
* Tests whether a search without a license returns results
* with both licenses.
*/
public void testLicenselessXMLSearch() throws Exception {
setAcceptedIncoming();
String richQuery = "<?xml version=\"1.0\"?><audios><audio title=\"love\"/></audios>";
new LimeXMLDocument(richQuery);
// we should send a query to the leaf and get results.
QueryRequest query = QueryRequest.createQuery("", richQuery);
testUP[1].send(query);
testUP[1].flush();
QueryReply reply = getFirstQueryReply(testUP[1]);
assertNotNull(reply);
assertEquals(query.getGUID(), reply.getGUID());
assertEquals(reply.getResultsAsList().toString(), 2, reply.getResultCount());
if (!addXMLToResponses(reply))
fail("Couldn't add XML to response. :(");
for (Iterator i = reply.getResults(); i.hasNext(); ) {
Response r = (Response)i.next();
LimeXMLDocument doc = r.getDocument();
assertNotNull(doc);
assertTrue(r.toString(), doc.isLicenseAvailable());
assertNotNull(r.toString(), doc.getLicense());
}
}
private void setAcceptedIncoming() throws Exception {
Acceptor ac = RouterService.getAcceptor();
PrivilegedAccessor.setValue(ac, "_acceptedIncoming", Boolean.TRUE);
}
private boolean addXMLToResponses(QueryReply qr) throws Exception {
return ((Boolean)PrivilegedAccessor.invokeMethod(
ForMeReplyHandler.instance(), "addXMLToResponses", qr)).booleanValue();
}
}