package com.limegroup.gnutella;
import java.io.File;
import java.net.DatagramSocket;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import junit.framework.Test;
import com.limegroup.gnutella.messages.FeatureSearchData;
import com.limegroup.gnutella.messages.Message;
import com.limegroup.gnutella.messages.QueryReply;
import com.limegroup.gnutella.messages.QueryRequest;
import com.limegroup.gnutella.settings.SharingSettings;
import com.limegroup.gnutella.stubs.ActivityCallbackStub;
import com.limegroup.gnutella.util.CommonUtils;
import com.limegroup.gnutella.util.PrivilegedAccessor;
/**
* Checks whether Meta-Queries are correctly answered, etc.
*/
public class ServerSideMetaQueryTest extends ClientSideTestCase {
/**
* Ultrapeer 1 UDP connection.
*/
private static DatagramSocket[] UDP_ACCESS;
public ServerSideMetaQueryTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(ServerSideMetaQueryTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
private static void doSettings() {
TIMEOUT = 1250;
SharingSettings.EXTENSIONS_TO_SHARE.setValue("txt;mp3;wmv;png;bin");
// get the resource file for com/limegroup/gnutella
File mp3 =
CommonUtils.getResourceFile("com/limegroup/gnutella/metadata/mpg1layIII_0h_58k-VBRq30_frame1211_44100hz_joint_XingTAG_sample.mp3");
// now move them to the share dir
CommonUtils.copy(mp3, new File(_sharedDir, "berkeley.mp3"));
mp3 =
CommonUtils.getResourceFile("com/limegroup/gnutella/ByteOrderTest.java");
// now move them to the share dir
CommonUtils.copy(mp3, new File(_sharedDir, "meta audio.mp3"));
mp3 =
CommonUtils.getResourceFile("com/limegroup/gnutella/Backend.java");
// now move them to the share dir
CommonUtils.copy(mp3, new File(_sharedDir, "meta video.wmv"));
mp3 =
CommonUtils.getResourceFile("com/limegroup/gnutella/Base32Test.java");
// now move them to the share dir
CommonUtils.copy(mp3, new File(_sharedDir, "meta doc.txt"));
mp3 =
CommonUtils.getResourceFile("com/limegroup/gnutella/GUIDTest.java");
// now move them to the share dir
CommonUtils.copy(mp3, new File(_sharedDir, "meta image.png"));
mp3 =
CommonUtils.getResourceFile("com/limegroup/gnutella/MediaTypeTest.java");
// now move them to the share dir
CommonUtils.copy(mp3, new File(_sharedDir, "meta program txt.bin"));
}
//////////////////////////////////////////////////////////////////
public static Integer numUPs() {
return new Integer(3);
}
private static byte[] myIP() {
return new byte[] { (byte)127, (byte)0, 0, 1 };
}
public static ActivityCallback getActivityCallback() {
return new MyCallback();
}
public static class MyCallback extends ActivityCallbackStub {
public GUID aliveGUID = null;
public void setGUID(GUID guid) { aliveGUID = guid; }
public void clearGUID() { aliveGUID = null; }
public boolean isQueryAlive(GUID guid) {
if (aliveGUID != null)
return (aliveGUID.equals(guid));
return false;
}
}
///////////////////////// Actual Tests ////////////////////////////
public void testMediaTypeAggregator() throws Exception {
{
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "whatever", "", null,
null, null, true, Message.N_TCP, false, 0, false,
0);
MediaType.Aggregator filter = MediaType.getAggregator(query);
assertNull(filter);
}
int[] flags = new int[6];
flags[0] = QueryRequest.AUDIO_MASK;
flags[1] = QueryRequest.VIDEO_MASK;
flags[2] = QueryRequest.DOC_MASK;
flags[3] = QueryRequest.IMAGE_MASK;
flags[4] = QueryRequest.WIN_PROG_MASK;
flags[5] = QueryRequest.LIN_PROG_MASK;
for (int i = 0; i < flags.length; i++) {
testAggregator(0 | flags[i]);
for (int j = 0; j < flags.length; j++) {
if (j == i) continue;
testAggregator(0 | flags[i] | flags[j]);
for (int k = 0; k < flags.length; k++) {
if (k == j) continue;
testAggregator(0 | flags[i] | flags[j] | flags[k]);
for (int l = 0; l < flags.length; l++) {
if (l == k) continue;
testAggregator(0 | flags[i] | flags[j] | flags[k] |
flags[l]);
for (int m = 0; m < flags.length; m++) {
if (m == l) continue;
testAggregator(0 | flags[i] | flags[j] | flags[k] |
flags[l] | flags[m]);
}
}
}
}
}
}
private void testAggregator(int flag) throws Exception {
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "whatever", "", null,
null, null, true, Message.N_TCP, false, 0, false,
flag);
MediaType.Aggregator filter = MediaType.getAggregator(query);
assertNotNull(filter);
List filterList = (List) PrivilegedAccessor.getValue(filter,
"_filters");
int numFilters = 0;
if ((flag & QueryRequest.AUDIO_MASK) > 0) numFilters++;
if ((flag & QueryRequest.VIDEO_MASK) > 0) numFilters++;
if ((flag & QueryRequest.DOC_MASK) > 0) numFilters++;
if ((flag & QueryRequest.IMAGE_MASK) > 0) numFilters++;
if ((flag & QueryRequest.WIN_PROG_MASK) > 0) numFilters++;
if ((flag & QueryRequest.LIN_PROG_MASK) > 0) numFilters++;
assertEquals(numFilters, filterList.size());
assertEquals(((flag & QueryRequest.AUDIO_MASK) > 0),
filter.allow("susheel.mp3"));
assertEquals(((flag & QueryRequest.VIDEO_MASK) > 0),
filter.allow("susheel.wmv"));
assertEquals(((flag & QueryRequest.DOC_MASK) > 0),
filter.allow("susheel.txt"));
assertEquals(((flag & QueryRequest.IMAGE_MASK) > 0),
filter.allow("susheel.png"));
assertEquals(((flag & QueryRequest.WIN_PROG_MASK) > 0),
filter.allow("susheel.exe"));
assertEquals(((flag & QueryRequest.LIN_PROG_MASK) > 0),
filter.allow("susheel.csh"));
}
public void testMetaFlagQuery() throws Exception {
drainAll();
{
// first test a normal query with no meta flag info
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "berkeley", "", null,
null, null, false, Message.N_TCP, false, 0, false,
0);
testUP[0].send(query);
testUP[0].flush();
Thread.sleep(250);
// we should get a reply with 2 responses
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[0],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(2, results.size());
}
{
// test a query for audio
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "berkeley", "", null,
null, null, false, Message.N_TCP, false, 0, false,
0 | QueryRequest.AUDIO_MASK);
testUP[1].send(query);
testUP[1].flush();
Thread.sleep(250);
// we should get a reply with 1 response
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[1],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(1, results.size());
Response resp = (Response) results.get(0);
assertEquals("berkeley.mp3", resp.getName());
}
{
// test a query for documents
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "berkeley", "", null,
null, null, false, Message.N_TCP, false, 0, false,
0 | QueryRequest.DOC_MASK);
testUP[2].send(query);
testUP[2].flush();
Thread.sleep(250);
// we should get a reply with 1 response
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[2],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(1, results.size());
Response resp = (Response) results.get(0);
assertEquals("berkeley.txt", resp.getName());
}
}
public void testAdvancedMetaQuery() throws Exception {
drainAll();
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "meta", "", null,
null, null, false, Message.N_TCP, false, 0, false,
0 |
QueryRequest.AUDIO_MASK |
QueryRequest.DOC_MASK |
QueryRequest.VIDEO_MASK |
QueryRequest.IMAGE_MASK |
QueryRequest.LIN_PROG_MASK);
testUP[0].send(query);
testUP[0].flush();
Thread.sleep(250);
// we should get a reply with 5 responses
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[0],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(5, results.size());
Set names = new HashSet();
for (Iterator iter = results.iterator(); iter.hasNext(); )
names.add(((Response)iter.next()).getName());
assertTrue(names.contains("meta audio.mp3"));
assertTrue(names.contains("meta video.wmv"));
assertTrue(names.contains("meta image.png"));
assertTrue(names.contains("meta doc.txt"));
assertTrue(names.contains("meta program txt.bin"));
}
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "meta", "", null,
null, null, false, Message.N_TCP, false, 0, false,
0 |
QueryRequest.AUDIO_MASK |
QueryRequest.DOC_MASK |
QueryRequest.IMAGE_MASK |
QueryRequest.LIN_PROG_MASK);
testUP[1].send(query);
testUP[1].flush();
Thread.sleep(250);
// we should get a reply with 4 responses
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[1],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(4, results.size());
Set names = new HashSet();
for (Iterator iter = results.iterator(); iter.hasNext(); )
names.add(((Response)iter.next()).getName());
assertTrue(names.contains("meta audio.mp3"));
assertTrue(names.contains("meta image.png"));
assertTrue(names.contains("meta doc.txt"));
assertTrue(names.contains("meta program txt.bin"));
}
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "txt", "", null,
null, null, false, Message.N_TCP, false, 0, false,
0 |
QueryRequest.DOC_MASK |
QueryRequest.IMAGE_MASK);
testUP[2].send(query);
testUP[2].flush();
Thread.sleep(250);
// we should get a reply with 3 responses
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[2],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(3, results.size());
Set names = new HashSet();
for (Iterator iter = results.iterator(); iter.hasNext(); )
names.add(((Response)iter.next()).getName());
assertTrue(names.contains("meta doc.txt"));
assertTrue(names.contains("berkeley.txt"));
assertTrue(names.contains("susheel.txt"));
}
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "txt", "", null,
null, null, false, Message.N_TCP, false, 0, false,
0 |
QueryRequest.LIN_PROG_MASK |
QueryRequest.IMAGE_MASK);
testUP[1].send(query);
testUP[1].flush();
Thread.sleep(250);
// we should get a reply with 1 responses
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[1],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(1, results.size());
Response resp = (Response) results.get(0);
assertEquals("meta program txt.bin", resp.getName());
}
}
public void testStarvingMetaQuery() throws Exception {
drainAll();
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3, "susheel", "", null,
null, null, false, Message.N_TCP, false, 0, false,
0 | QueryRequest.AUDIO_MASK);
testUP[0].send(query);
testUP[0].flush();
Thread.sleep(250);
// we should get no responses because of the filter
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[0],
QueryReply.class);
assertNull(reply);
}
}
public void testWhatIsNewMetaQuery() throws Exception {
drainAll();
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3,
QueryRequest.WHAT_IS_NEW_QUERY_STRING, "", null,
null, null, false, Message.N_TCP, false,
FeatureSearchData.WHAT_IS_NEW, false,
0);
testUP[0].send(query);
testUP[0].flush();
Thread.sleep(250);
// we should get no responses because of the filter
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[0],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(3, results.size());
}
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3,
QueryRequest.WHAT_IS_NEW_QUERY_STRING, "", null,
null, null, false, Message.N_TCP, false,
FeatureSearchData.WHAT_IS_NEW, false,
0 | QueryRequest.AUDIO_MASK);
testUP[1].send(query);
testUP[1].flush();
Thread.sleep(250);
// we should get no responses because of the filter
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[1],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(2, results.size());
Set names = new HashSet();
for (Iterator iter = results.iterator(); iter.hasNext(); )
names.add(((Response)iter.next()).getName());
assertTrue(names.contains("meta audio.mp3"));
assertTrue(names.contains("berkeley.mp3"));
}
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3,
QueryRequest.WHAT_IS_NEW_QUERY_STRING, "", null,
null, null, false, Message.N_TCP, false,
FeatureSearchData.WHAT_IS_NEW, false,
0 | QueryRequest.DOC_MASK);
testUP[2].send(query);
testUP[2].flush();
Thread.sleep(250);
// we should get no responses because of the filter
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[2],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(3, results.size());
Set names = new HashSet();
for (Iterator iter = results.iterator(); iter.hasNext(); )
names.add(((Response)iter.next()).getName());
assertTrue(names.contains("berkeley.txt"));
assertTrue(names.contains("susheel.txt"));
assertTrue(names.contains("meta doc.txt"));
}
{
// first test a normal query with several meta flags
QueryRequest query =
new QueryRequest(GUID.makeGuid(), (byte)3,
QueryRequest.WHAT_IS_NEW_QUERY_STRING, "", null,
null, null, false, Message.N_TCP, false,
FeatureSearchData.WHAT_IS_NEW, false,
0 | QueryRequest.LIN_PROG_MASK);
testUP[1].send(query);
testUP[1].flush();
Thread.sleep(250);
// we should get no responses because of the filter
QueryReply reply =
(QueryReply)getFirstInstanceOfMessageType(testUP[1],
QueryReply.class);
assertNotNull(reply);
List results = reply.getResultsAsList();
assertEquals(1, results.size());
Set names = new HashSet();
for (Iterator iter = results.iterator(); iter.hasNext(); )
names.add(((Response)iter.next()).getName());
assertTrue(names.contains("meta program txt.bin"));
}
}
}