package com.limegroup.gnutella.xml;
import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import com.limegroup.gnutella.Response;
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.FileManagerEvent;
import com.limegroup.gnutella.messages.QueryRequest;
import com.limegroup.gnutella.routing.QueryRouteTable;
import com.limegroup.gnutella.settings.ConnectionSettings;
import com.limegroup.gnutella.settings.SharingSettings;
import com.limegroup.gnutella.util.I18NConvert;
import com.limegroup.gnutella.util.PrivilegedAccessor;
/**
* Tests the MetaFileManager. Subclass FileManagerTest so that
* the same tests ran for SimpleFileManager can be run for
* MetaFileManager.
*/
public class MetaFileManagerTest extends com.limegroup.gnutella.FileManagerTest {
public MetaFileManagerTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(MetaFileManagerTest.class);
}
public static void globalSetUp() throws Exception {
ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false);
try {
RouterService.getAcceptor().setAddress(InetAddress.getLocalHost());
} catch (UnknownHostException e) {
} catch (SecurityException e) {
}
}
public void setUp() throws Exception {
SharingSettings.EXTENSIONS_TO_SHARE.setValue(EXTENSION);
ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false);
cleanFiles(_sharedDir, false);
fman = new MetaFileManager();
PrivilegedAccessor.setValue(RouterService.class, "fileManager", fman);
PrivilegedAccessor.setValue(RouterService.class, "callback", new FManCallback());
}
public void testMetaQueriesWithConflictingMatches() throws Exception {
waitForLoad();
// test a query where the filename is meaningless but XML matches.
File f1 = createNewNamedTestFile(10, "meaningless");
LimeXMLDocument d1 = new LimeXMLDocument(buildAudioXMLString(
"artist=\"Sammy B\" album=\"Jazz in G\""));
List l1 = new ArrayList(); l1.add(d1);
FileManagerEvent result = addIfShared(f1, l1);
assertTrue(result.toString(), result.isAddEvent());
assertEquals(d1, result.getFileDescs()[0].getLimeXMLDocuments().get(0));
Response[] r1 = fman.query(QueryRequest.createQuery("sam",
buildAudioXMLString("artist=\"sam\"")));
assertNotNull(r1);
assertEquals(1, r1.length);
assertEquals(d1.getXMLString(), r1[0].getDocument().getXMLString());
// test a match where 50% matches -- should get no matches.
Response[] r2 = fman.query(QueryRequest.createQuery("sam jazz in c",
buildAudioXMLString("artist=\"sam\" album=\"jazz in c\"")));
if(r2 != null)
assertEquals(0, r2.length);
// test where the keyword matches only.
Response[] r3 = fman.query(QueryRequest.createQuery("meaningles"));
assertNotNull(r3);
assertEquals(1, r3.length);
assertEquals(d1.getXMLString(), r3[0].getDocument().getXMLString());
// test where keyword matches, but xml doesn't.
Response[] r4 = fman.query(QueryRequest.createQuery("meaningles",
buildAudioXMLString("artist=\"bob\"")));
if(r4 != null)
assertEquals(0, r4.length);
// more ambiguous tests -- a pure keyword search for "jazz in d"
// will work, but a keyword search that included XML will fail for
// the same.
File f2 = createNewNamedTestFile(10, "jazz in d");
LimeXMLDocument d2 = new LimeXMLDocument(buildAudioXMLString(
"album=\"jazz in e\""));
List l2 = new ArrayList(); l2.add(d2);
result = addIfShared(f2, l2);
assertTrue(result.toString(), result.isAddEvent());
assertEquals(d2, result.getFileDescs()[0].getLimeXMLDocuments().get(0));
// pure keyword.
Response[] r5 = fman.query(QueryRequest.createQuery("jazz in d"));
assertNotNull(r5);
assertEquals(1, r5.length);
assertEquals(d2.getXMLString(), r5[0].getDocument().getXMLString());
// keyword, but has XML to check more efficiently.
Response[] r6 = fman.query(QueryRequest.createQuery("jazz in d",
buildAudioXMLString("album=\"jazz in d\"")));
if(r6 != null)
assertEquals(0, r6.length);
}
public void testMetaQRT() throws Exception {
String dir2 = "director=\"francis loopola\"";
File f1 = createNewNamedTestFile(10, "hello");
QueryRouteTable qrt = fman.getQRT();
assertFalse("should not be in QRT", qrt.contains(get_qr(f1)));
waitForLoad();
//make sure QRP contains the file f1
qrt = fman.getQRT();
assertTrue("expected in QRT", qrt.contains(get_qr(f1)));
//now test xml metadata in the QRT
File f2 = createNewNamedTestFile(11, "metadatafile2");
LimeXMLDocument newDoc2 = new LimeXMLDocument(buildVideoXMLString(dir2));
List l2 = new ArrayList();
l2.add(newDoc2);
FileManagerEvent result = addIfShared(f2, l2);
assertTrue(result.toString(), result.isAddEvent());
assertEquals(newDoc2, result.getFileDescs()[0].getLimeXMLDocuments().get(0));
qrt = fman.getQRT();
assertTrue("expected in QRT", qrt.contains (get_qr(buildVideoXMLString(dir2))));
assertFalse("should not be in QRT", qrt.contains(get_qr(buildVideoXMLString("director=\"sasami juzo\""))));
//now remove the file and make sure the xml gets deleted.
fman.removeFileIfShared(f2);
qrt = fman.getQRT();
assertFalse("should not be in QRT", qrt.contains(get_qr(buildVideoXMLString(dir2))));
}
public void testMetaQueries() throws Exception {
waitForLoad();
String dir1 = "director=\"loopola\"";
//make sure there's nothing with this xml query
Response[] res = fman.query(QueryRequest.createQuery("", buildVideoXMLString(dir1)));
assertEquals("there should be no matches", 0, res.length);
File f1 = createNewNamedTestFile(10, "test_this");
LimeXMLDocument newDoc1 = new LimeXMLDocument(buildVideoXMLString(dir1));
List l1 = new ArrayList();
l1.add(newDoc1);
String dir2 = "director=\"\u5bae\u672c\u6b66\u8535\u69d8\"";
File f2 = createNewNamedTestFile(11, "hmm");
LimeXMLDocument newDoc2 = new LimeXMLDocument(buildVideoXMLString(dir2));
List l2 = new ArrayList();
l2.add(newDoc2);
String dir3 = "director=\"\u5bae\u672c\u6b66\u8535\u69d8\"";
File f3 = createNewNamedTestFile(12, "testtesttest");
LimeXMLDocument newDoc3 =
new LimeXMLDocument(buildVideoXMLString(dir3));
List l3 = new ArrayList();
l3.add(newDoc3);
//add files and check they are returned as responses
FileManagerEvent result = addIfShared(f1, l1);
assertTrue(result.toString(), result.isAddEvent());
assertEquals(newDoc1, result.getFileDescs()[0].getLimeXMLDocuments().get(0));
result = addIfShared(f2, l2);
assertTrue(result.toString(), result.isAddEvent());
assertEquals(newDoc2, result.getFileDescs()[0].getLimeXMLDocuments().get(0));
result = addIfShared(f3, l3);
assertTrue(result.toString(), result.isAddEvent());
assertEquals(newDoc3, result.getFileDescs()[0].getLimeXMLDocuments().get(0));
res = fman.query(QueryRequest.createQuery("", buildVideoXMLString(dir1)));
assertEquals("there should be one match", 1, res.length);
res = fman.query(QueryRequest.createQuery("", buildVideoXMLString(dir2)));
assertEquals("there should be two matches", 2, res.length);
//remove a file
fman.removeFileIfShared(f1);
res = fman.query(QueryRequest.createQuery("", buildVideoXMLString(dir1)));
assertEquals("there should be no matches", 0, res.length);
//make sure the two other files are there
res = fman.query(QueryRequest.createQuery("", buildVideoXMLString(dir2)));
assertEquals("there should be two matches", 2, res.length);
//remove another and check we still have on left
fman.removeFileIfShared(f2);
res = fman.query(QueryRequest.createQuery("",buildVideoXMLString(dir3)));
assertEquals("there should be one match", 1, res.length);
//remove the last file and make sure we get no replies
fman.removeFileIfShared(f3);
res = fman.query(QueryRequest.createQuery("", buildVideoXMLString(dir3)));
assertEquals("there should be no matches", 0, res.length);
}
private QueryRequest get_qr(File f) {
return
QueryRequest.createQuery
(I18NConvert.instance().getNorm(f.getName()));
}
private QueryRequest get_qr(String xml) {
return
QueryRequest.createQuery("", xml);
}
// build xml string for video
private String buildVideoXMLString(String keyname) {
return "<?xml version=\"1.0\"?><videos xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/video.xsd\"><video "
+ keyname
+ "></video></videos>";
}
private String buildAudioXMLString(String keyname) {
return "<?xml version=\"1.0\"?><audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\"><audio "
+ keyname
+ "></audio></audios>";
}
protected FileManagerEvent addIfShared(File f, List l) throws Exception {
Listener fel = new Listener();
synchronized(fel) {
fman.addFileIfShared(f, l, fel);
fel.wait(5000);
}
return fel.evt;
}
}