package com.limegroup.gnutella.guess;
import java.io.ByteArrayOutputStream;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Random;
import junit.framework.Test;
import com.limegroup.gnutella.messages.GGEP;
import com.limegroup.gnutella.util.PrivilegedAccessor;
public class QueryKeyTest extends com.limegroup.gnutella.util.BaseTestCase {
public QueryKeyTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(QueryKeyTest.class);
}
public void testConstruction() throws Exception {
try {
QueryKey.getQueryKey(new byte[3], false);
fail("exception should have been thrown.");
}
catch (IllegalArgumentException ignored) {}
try {
QueryKey.getQueryKey(new byte[17], false);
fail("exception should have been thrown.");
}
catch (IllegalArgumentException ignored) {}
byte[] qk = new byte[8];
Random rand = new Random();
Arrays.sort(qk);
while (Arrays.binarySearch(qk, (byte) 0x1c) < 0) {
rand.nextBytes(qk);
Arrays.sort(qk);
}
QueryKey key1 = null, key2 = null, key3 = null;
key1 = QueryKey.getQueryKey(qk, true);
key2 = QueryKey.getQueryKey(qk, true);
key3 = QueryKey.getQueryKey(qk, false);
assertEquals(key1,key2);
assertNotEquals(key1,key3);
assertEquals(key1.hashCode(), key2.hashCode());
// don't test key1.hashCode() vs. key3.hashCode() - they may very easily
// conflict
}
public void testSimpleGeneration() throws Exception {
QueryKeyGenerator secretKey = QueryKey.createKeyGenerator();
InetAddress ip = null;
ip = InetAddress.getByName("www.limewire.com");
int port = 6346;
QueryKey qk1 = QueryKey.getQueryKey(ip, port, secretKey);
QueryKey qk2 = QueryKey.getQueryKey(ip, port, secretKey);
assertEquals(qk1,qk2);
ip = InetAddress.getByName("10.254.0.42");
qk1 = QueryKey.getQueryKey(ip, port, secretKey);
qk2 = QueryKey.getQueryKey(ip, port, secretKey);
assertEquals(qk1,qk2);
ip = InetAddress.getByName("127.0.0.1");
qk1 = QueryKey.getQueryKey(ip, port, secretKey);
qk2 = QueryKey.getQueryKey(ip, port, secretKey);
assertEquals(qk1,qk2);
}
// Makes sure QueryKeys have no problem going in and out of GGEP blocks
public void testQueryKeysAndGGEP() throws Exception {
Random rand = new Random();
for (int i = 4; i < 17; i++) {
byte[] qk = new byte[i];
Arrays.sort(qk);
// make sure the bytes have offensive characters....
while ((Arrays.binarySearch(qk, (byte) 0x1c) < 0) ||
(Arrays.binarySearch(qk, (byte) 0x00) < 0)) {
rand.nextBytes(qk);
Arrays.sort(qk);
}
QueryKey queryKey = QueryKey.getQueryKey(qk, true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
queryKey.write(baos);
GGEP in = new GGEP(false);
in.put(GGEP.GGEP_HEADER_QUERY_KEY_SUPPORT,
baos.toByteArray());
baos = new ByteArrayOutputStream();
in.write(baos);
GGEP out = new GGEP(baos.toByteArray(), 0, null);
QueryKey queryKey2 =
QueryKey.getQueryKey(out.getBytes(GGEP.GGEP_HEADER_QUERY_KEY_SUPPORT), false);
assertEquals("qks not equal, i = " + i,
queryKey, queryKey2);
}
}
public void testOddsAndEnds() throws Exception {
// test to make clover 100% for QK
QueryKey qk = QueryKey.getQueryKey(InetAddress.getLocalHost(), 6346);
assertFalse(qk.equals(new Object()));
qk.toString();
}
}