package com.limegroup.gnutella;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import junit.framework.Test;
import com.limegroup.gnutella.handshaking.HeaderNames;
import com.limegroup.gnutella.handshaking.UltrapeerHeaders;
import com.limegroup.gnutella.messages.Message;
import com.limegroup.gnutella.messages.QueryReply;
import com.limegroup.gnutella.messages.QueryRequest;
import com.limegroup.gnutella.settings.ConnectionSettings;
import com.limegroup.gnutella.settings.PingPongSettings;
import com.limegroup.gnutella.settings.SearchSettings;
import com.limegroup.gnutella.settings.UltrapeerSettings;
import com.limegroup.gnutella.stubs.ActivityCallbackStub;
import com.limegroup.gnutella.util.CommonUtils;
import com.limegroup.gnutella.util.EmptyResponder;
import com.limegroup.gnutella.util.I18NConvert;
import com.limegroup.gnutella.xml.LimeXMLDocument;
import com.limegroup.gnutella.xml.LimeXMLReplyCollection;
import com.limegroup.gnutella.xml.SchemaReplyCollectionMapper;
public class I18NSendReceiveTest
extends com.limegroup.gnutella.util.BaseTestCase {
private static Connection CONN_1;
private static final int TEST_PORT = 6667;
private static RouterService ROUTER_SERVICE;
//test file names that should be in the shared dir and returned as
//replies
private static final String FILE_0 = "hello_0.txt";
private static final String FILE_1 =
"\uff8a\uff9b\uff70\u5143\u6c17\u3067\u3059\u304b\uff1f_\u30d5\u30a3\u30b7\u30e5_1.txt";
private static final String FILE_2 =
"\uff34\uff25\uff33\uff34\uff34\uff28\uff29\uff33\uff3f\uff26\uff29\uff2c\uff25\uff3f\uff2e\uff21\uff2d\uff25_2.txt";
private static final String FILE_3 =
"\u7206\u98a8\uff3ftestth\u00ccs_\uff27\uff2f_3.txt";
private static final String FILE_4 =
"t\u00e9stthis_\u334d_\uff2d\uff21\uff2c\uff23\uff2f\uff2d\u3000\uff38\uff3f\uff8f\uff99\uff7a\uff91_4.txt";
//these test file names are used for testing xml search
private static final String META_FILE_0 = "meta1.mpg";
private static final String META_FILE_1 =
"\u30e1\u30bf\u60c5\u5831\u30c6\u30b9\u30c8.mpg";
private static final String META_FILE_2 =
"\uff2d\uff25\uff34\uff21\u60c5\u5831\u30c6\u30b9\u30c8.mpg";
//array of file names, used in the setup stage
private static final String[] FILES = {
FILE_0, FILE_1, FILE_2, FILE_3, FILE_4, META_FILE_0, META_FILE_1,
META_FILE_2};
public I18NSendReceiveTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(I18NSendReceiveTest.class);
}
private static void doSettings() throws Exception {
ConnectionSettings.PORT.setValue(TEST_PORT);
ConnectionSettings.CONNECT_ON_STARTUP.setValue(false);
UltrapeerSettings.EVER_ULTRAPEER_CAPABLE.setValue(false);
UltrapeerSettings.DISABLE_ULTRAPEER_MODE.setValue(true);
UltrapeerSettings.FORCE_ULTRAPEER_MODE.setValue(false);
ConnectionSettings.NUM_CONNECTIONS.setValue(4);
ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false);
ConnectionSettings.WATCHDOG_ACTIVE.setValue(false);
PingPongSettings.PINGS_ACTIVE.setValue(false);
setUpFiles();
SearchSettings.MINIMUM_SEARCH_QUALITY.setValue(-2);
}
private static void setUpFiles() throws Exception {
File dir = new File("com/limegroup/gnutella/");
if (!dir.exists()) {
dir.mkdirs();
}
for(int i = 0; i < FILES.length; i++) {
File f = new File(dir, FILES[i]);
if(!f.exists()) {
f.createNewFile();
//make sure its not 0kb
FileOutputStream fo = new FileOutputStream(f);
BufferedWriter buf = new BufferedWriter(new OutputStreamWriter(fo));
buf.write("a");
buf.flush();
buf.close();
}
CommonUtils.copy(f, new File(_sharedDir, FILES[i]));
}
}
public static void globalSetUp() throws Exception {
doSettings();
ROUTER_SERVICE = new RouterService(new ActivityCallbackStub());
ROUTER_SERVICE.start();
RouterService.connect();
connect();
}
public static void globalTearDown() throws Exception {
drain(CONN_1);
CONN_1.close();
RouterService.disconnect();
}
private static void connect() throws Exception {
UltrapeerHeaders headers = new UltrapeerHeaders("localhost");
headers.put(HeaderNames.X_DEGREE,"42");
CONN_1 = new Connection("localhost", TEST_PORT);
CONN_1.initialize(headers, new EmptyResponder());
drain(CONN_1);
}
/**
* tests that we get a query reply from a file with the normalized
* name and also that we receive the actual file name in the queryreply
*/
public void testSendReceive() throws Exception {
//test random query
QueryRequest qr = QueryRequest.createQuery("asdfadf", (byte)2);
CONN_1.send(qr);
CONN_1.flush();
Message m = getFirstQueryReply(CONN_1);
assertNull("should not have received a QueryReply", m);
drain(CONN_1);
List expectedReply = new ArrayList();
//should find FILE_0
addExpectedReply(expectedReply, FILE_0);
sendCheckQuery(expectedReply, "hello");
//should find FILE_2, FILE_3, FILE_4
addExpectedReply(expectedReply, FILE_2);
addExpectedReply(expectedReply, FILE_3);
addExpectedReply(expectedReply, FILE_4);
sendCheckQuery(expectedReply, "testthis");
//should find FILE_3
addExpectedReply(expectedReply, FILE_3);
sendCheckQuery(expectedReply, "\u7206\u98a8");
//should find FILE_1
addExpectedReply(expectedReply, FILE_1);
sendCheckQuery(expectedReply, "\u5143\u6c17");
//should find FILE_4
addExpectedReply(expectedReply, FILE_4);
sendCheckQuery(expectedReply, "malcom testthis \u30e1\u30fc\u30c8\u30eb");
}
/**
* Adds an expected reply to the expected reply list.
*/
private void addExpectedReply(List list, String name) throws Exception {
File f = new File("com/limegroup/gnutella/" + name);
assertTrue("file: " + name + " doesn't exist", f.exists());
f = f.getCanonicalFile(); // necessary to get the name as it is on disk
list.add(I18NConvert.instance().compose(f.getName()));
}
/**
* checks that files specified in List are all in the QueryReply created
* by the keyword 'q'
*/
private void sendCheckQuery(List expectedReply, String q) throws Exception {
sendCheckQueryXML(expectedReply, q, "");
}
/**
* checks that files specified in List are all in the QueryReply created
* by the keyword 'q' and the xml string 'xml'
*/
private void sendCheckQueryXML(List expectedReply, String q, String xml)
throws Exception {
int size = expectedReply.size();
QueryRequest qr
= QueryRequest.createQuery(q, xml);
CONN_1.send(qr);
CONN_1.flush();
QueryReply rp = getFirstQueryReply(CONN_1);
assertTrue("we should of received a QueryReply", rp != null);
assertEquals("should have " + size + " result(s)",
size,
rp.getResultCount());
for(Iterator iter = rp.getResults(); iter.hasNext(); ) {
Response res = (Response)iter.next();
assertTrue("got qr: " + res.getName() + ", expected something in : " + expectedReply,
expectedReply.remove(res.getName()));
}
expectedReply.clear();
}
//variables used for xml query test
private final String director1 = "thetestdirector";
private final String director2 = "\u30e9\u30a4\u30e0\u30ef\u30a4\u30e4\u30fc";
private final String studio = "\u30d6\u30ed\u30fc\u30c9\u30a6\u30a7\u30a4";
private final String studio2 = "\u30ab\u30ca\u30eb\u8857";
/**
* test that XML queries are sent and replies using the correct name
*/
public void testSendReceiveXML() throws Exception {
drain(CONN_1);
setUpMetaData();
I18NConvert normer = I18NConvert.instance();
List expectedReply = new ArrayList();
addExpectedReply(expectedReply, META_FILE_0);
sendCheckQueryXML(expectedReply, director1,
buildXMLString("director=\"" +
normer.getNorm(director1) +
"\""));
addExpectedReply(expectedReply, META_FILE_1);
addExpectedReply(expectedReply, META_FILE_2);
sendCheckQueryXML(expectedReply, director2,
buildXMLString("director=\"" +
normer.getNorm(director2) +
"\""));
addExpectedReply(expectedReply, META_FILE_2);
sendCheckQueryXML(expectedReply, director2,
buildXMLString("director=\""
+ normer.getNorm(director2)
+ "\" "
+ "studio=\""
+ normer.getNorm(studio2)
+ "\""));
}
/**
* adds metadata information to the test files
*/
private void setUpMetaData() throws Exception {
addMetaData(META_FILE_0, "director=\"" + director1 + "\"");
addMetaData(META_FILE_1,
"director=\"" + director2
+ "\" studio=\"" + studio + "\"");
addMetaData(META_FILE_2,
"director=\"" + director2
+ "\" studio=\"" + studio2 + "\"");
}
/**
* add the metadata
*/
private void addMetaData(String fname, String xmlstr) throws Exception {
FileManager fm = RouterService.getFileManager();
FileDesc fd =
fm.getFileDescForFile(new File(_sharedDir, fname));
LimeXMLDocument newDoc =
new LimeXMLDocument(buildXMLString(xmlstr));
SchemaReplyCollectionMapper map =
SchemaReplyCollectionMapper.instance();
String uri = newDoc.getSchemaURI();
LimeXMLReplyCollection collection = map.getReplyCollection(uri);
Assert.that(collection != null,
"Cant add doc to nonexistent collection");
collection.addReply(fd, newDoc);
assertTrue("error commiting xml", collection.writeMapToDisk());
}
// build xml string for video
private String buildXMLString(String keyname) {
return "<?xml version=\"1.0\"?><videos xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/video.xsd\"><video "
+ keyname
+ "></video></videos>";
}
}