merge of '27711f734eca9313f7e0742dc1a6df964b744b86'

and '4d27e2149e5bb50280599426f3884dfcc04f920a'
This commit is contained in:
kytv
2013-01-10 15:09:20 +00:00
5 changed files with 193 additions and 340 deletions

View File

@@ -6,41 +6,27 @@ import java.util.ArrayList;
import java.util.List;
import net.i2p.data.Hash;
import net.i2p.data.RouterIdentity;
import net.i2p.data.RouterInfo;
import net.i2p.data.TunnelId;
import net.i2p.data.i2np.DataMessage;
import net.i2p.data.i2np.I2NPMessage;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public abstract class GatewayTestBase {
public abstract class GatewayTestBase extends RouterTestBase {
protected static RouterContext _context;
protected static TunnelGatewayPumper _pumper;
protected static TunnelCreatorConfig _config;
protected TunnelGateway.QueuePreprocessor _preprocessor;
private static TunnelGatewayPumper _pumper;
private TunnelGateway.QueuePreprocessor _preprocessor;
protected TunnelGateway.Sender _sender;
protected TestReceiver _receiver;
protected TunnelGateway _gw;
private TunnelGateway _gw;
@BeforeClass
public static void globalSetUp() {
// order of these matters
Router r = new Router();
_context = new RouterContext(r);
_context.initAll();
r.runRouter();
RouterIdentity rIdentity = new TestRouterIdentity();
RouterInfo rInfo = new RouterInfo();
rInfo.setIdentity(rIdentity);
r.setRouterInfo(rInfo);
public static void gatewayClassSetup() {
_pumper = new TunnelGatewayPumper(_context);
_config = prepareConfig(8);
}
@Before
@@ -50,16 +36,105 @@ public abstract class GatewayTestBase {
_gw = new PumpedTunnelGateway(_context, _preprocessor, _sender, _receiver, _pumper);
}
/** sets up the sender and receiver. Subclasses must override */
protected abstract void setupSenderAndReceiver();
private static class TestRouterIdentity extends RouterIdentity {
@Override
public Hash getHash() {
return Hash.FAKE_HASH;
/**
* @return at which hop to start the decryption process
*/
protected abstract int getLastHop();
@Test
public void testSmall() throws Exception {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
messages.add(m);
_gw.add(m, null, null);
}
Thread.sleep(1000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
protected static DataMessage getTestMessage(int size) {
@Test
public void testRouter() throws Exception {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
Hash to = new Hash(new byte[Hash.HASH_LENGTH]);
java.util.Arrays.fill(to.getData(), (byte)0xFF);
messages.add(m);
_gw.add(m, to, null);
}
Thread.sleep(1000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
@Test
public void testTunnel() throws Exception {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
Hash to = new Hash(new byte[Hash.HASH_LENGTH]);
java.util.Arrays.fill(to.getData(), (byte)0xFF);
TunnelId tunnel = new TunnelId(42);
byte data[] = m.toByteArray();
messages.add(m);
_gw.add(m, to, tunnel);
}
Thread.sleep(1000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
@Test
public void testLarge() throws Exception {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(1024);
messages.add(m);
_gw.add(m, null, null);
}
Thread.sleep(1000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
private static DataMessage getTestMessage(int size) {
DataMessage m = new DataMessage(_context);
m.setData(new byte[size]);
java.util.Arrays.fill(m.getData(), (byte)0xFF);
@@ -82,7 +157,7 @@ public abstract class GatewayTestBase {
public long receiveEncrypted(byte[] encrypted) {
// fake all the hops...
for (int i = 1; i <= _config.getLength() - 2; i++) {
for (int i = 1; i <= _config.getLength() - getLastHop(); i++) {
HopProcessor hop = new HopProcessor(_context, _config.getConfig(i));
assertTrue(hop.process(encrypted, 0, encrypted.length, _config.getConfig(i).getReceiveFrom()));
}
@@ -110,38 +185,4 @@ public abstract class GatewayTestBase {
return null;
}
}
private static TunnelCreatorConfig prepareConfig(int numHops) {
Hash peers[] = new Hash[numHops];
byte tunnelIds[][] = new byte[numHops][4];
for (int i = 0; i < numHops; i++) {
peers[i] = new Hash();
peers[i].setData(new byte[Hash.HASH_LENGTH]);
_context.random().nextBytes(peers[i].getData());
_context.random().nextBytes(tunnelIds[i]);
}
TunnelCreatorConfig config = new TunnelCreatorConfig(_context, numHops, false);
for (int i = 0; i < numHops; i++) {
config.setPeer(i, peers[i]);
HopConfig cfg = config.getConfig(i);
cfg.setExpiration(_context.clock().now() + 60000);
cfg.setIVKey(_context.keyGenerator().generateSessionKey());
cfg.setLayerKey(_context.keyGenerator().generateSessionKey());
if (i > 0)
cfg.setReceiveFrom(peers[i-1]);
else
cfg.setReceiveFrom(null);
cfg.setReceiveTunnelId(tunnelIds[i]);
if (i < numHops - 1) {
cfg.setSendTo(peers[i+1]);
cfg.setSendTunnelId(tunnelIds[i+1]);
} else {
cfg.setSendTo(null);
cfg.setSendTunnelId(null);
}
}
return config;
}
}

View File

@@ -8,16 +8,8 @@ package net.i2p.router.tunnel;
*
*/
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import static junit.framework.TestCase.*;
import net.i2p.data.Hash;
import net.i2p.data.TunnelId;
import net.i2p.data.i2np.DataMessage;
import net.i2p.data.i2np.I2NPMessage;
/**
* Quick unit test for base functionality of inbound tunnel
@@ -32,93 +24,9 @@ public class InboundGatewayTest extends GatewayTestBase {
_receiver = new InboundTestReceiver(_config);
}
@Test
public void testSmall() throws Exception {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
messages.add(m);
_gw.add(m, null, null);
}
Thread.sleep(1000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
@Test
public void testRouter() throws Exception{
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
Hash to = new Hash(new byte[Hash.HASH_LENGTH]);
java.util.Arrays.fill(to.getData(), (byte)0xFF);
messages.add(m);
_gw.add(m, to, null);
}
Thread.sleep(1000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
@Test
public void testTunnel() throws Exception {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
Hash to = new Hash(new byte[Hash.HASH_LENGTH]);
java.util.Arrays.fill(to.getData(), (byte)0xFF);
TunnelId tunnel = new TunnelId(42);
messages.add(m);
_gw.add(m, to, tunnel);
}
Thread.sleep(1000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
@Test
public void testLarge() throws Exception {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(1024);
messages.add(m);
_gw.add(m, null, null);
}
Thread.sleep(1000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
@Override
protected int getLastHop() {
return 2;
}
private class InboundTestReceiver extends TestReceiver {

View File

@@ -8,78 +8,42 @@ package net.i2p.router.tunnel;
*
*/
import junit.framework.TestCase;
import net.i2p.I2PAppContext;
import org.junit.Test;
import net.i2p.data.DataHelper;
import net.i2p.data.Hash;
import net.i2p.router.RouterContext;
import static junit.framework.Assert.assertTrue;
/**
* Quick unit test for base functionality of inbound tunnel
* operation
*
*/
public class InboundTest extends TestCase{
private RouterContext _context;
public void setUp() {
_context = new RouterContext(null);
}
public class InboundTest extends RouterTestBase {
@Test
public void testInbound() {
int numHops = 8;
TunnelCreatorConfig config = prepareConfig(numHops);
byte orig[] = new byte[128];
byte message[] = new byte[128];
_context.random().nextBytes(orig); // might as well fill the IV
System.arraycopy(orig, 0, message, 0, message.length);
InboundGatewayProcessor p = new InboundGatewayProcessor(_context, config.getConfig(0));
InboundGatewayProcessor p = new InboundGatewayProcessor(_context, _config.getConfig(0));
p.process(message, 0, message.length, null);
for (int i = 1; i < numHops-1; i++) {
HopProcessor hop = new HopProcessor(_context, config.getConfig(i));
Hash prev = config.getConfig(i).getReceiveFrom();
HopProcessor hop = new HopProcessor(_context, _config.getConfig(i));
Hash prev = _config.getConfig(i).getReceiveFrom();
assertTrue(hop.process(message, 0, message.length, prev));
}
InboundEndpointProcessor end = new InboundEndpointProcessor(_context, config);
assertTrue(end.retrievePreprocessedData(message, 0, message.length, config.getPeer(numHops-2)));
InboundEndpointProcessor end = new InboundEndpointProcessor(_context, _config);
assertTrue(end.retrievePreprocessedData(message, 0, message.length, _config.getPeer(numHops-2)));
assertTrue(DataHelper.eq(orig, 16, message, 16, orig.length - 16));
}
private TunnelCreatorConfig prepareConfig(int numHops) {
Hash peers[] = new Hash[numHops];
byte tunnelIds[][] = new byte[numHops][4];
for (int i = 0; i < numHops; i++) {
peers[i] = new Hash();
peers[i].setData(new byte[Hash.HASH_LENGTH]);
_context.random().nextBytes(peers[i].getData());
_context.random().nextBytes(tunnelIds[i]);
}
TunnelCreatorConfig config = new TunnelCreatorConfig(_context, numHops, false);
for (int i = 0; i < numHops; i++) {
config.setPeer(i, peers[i]);
HopConfig cfg = config.getConfig(i);
cfg.setExpiration(_context.clock().now() + 60000);
cfg.setIVKey(_context.keyGenerator().generateSessionKey());
cfg.setLayerKey(_context.keyGenerator().generateSessionKey());
if (i > 0)
cfg.setReceiveFrom(peers[i-1]);
else
cfg.setReceiveFrom(null);
cfg.setReceiveTunnelId(tunnelIds[i]);
if (i < numHops - 1) {
cfg.setSendTo(peers[i+1]);
cfg.setSendTunnelId(tunnelIds[i+1]);
} else {
cfg.setSendTo(null);
cfg.setSendTunnelId(null);
}
}
return config;
}
}

View File

@@ -8,17 +8,6 @@ package net.i2p.router.tunnel;
*
*/
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import static junit.framework.TestCase.*;
import net.i2p.data.Hash;
import net.i2p.data.TunnelId;
import net.i2p.data.i2np.DataMessage;
import net.i2p.data.i2np.I2NPMessage;
/**
* Quick unit test for base functionality of outbound tunnel
* operation
@@ -31,131 +20,8 @@ public class OutboundGatewayTest extends GatewayTestBase {
_receiver = new TestReceiver(_config);
}
@Test
public void testSmall() throws Exception {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
messages.add(m);
_gw.add(m, null, null);
}
Thread.sleep(10000);
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
@Test
public void testRouter() {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
Hash to = new Hash(new byte[Hash.HASH_LENGTH]);
java.util.Arrays.fill(to.getData(), (byte)0xFF);
messages.add(m);
_gw.add(m, to, null);
}
long time = _context.clock().now() - start;
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
@Test
public void testTunnel() {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(64);
Hash to = new Hash(new byte[Hash.HASH_LENGTH]);
java.util.Arrays.fill(to.getData(), (byte)0xFF);
TunnelId tunnel = new TunnelId(42);
byte data[] = m.toByteArray();
messages.add(m);
_gw.add(m, to, tunnel);
}
long time = _context.clock().now() - start;
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
@Test
public void testLarge() {
int runCount = 1;
List messages = new ArrayList(runCount);
long start = _context.clock().now();
for (int i = 0; i < runCount; i++) {
DataMessage m = getTestMessage(1024);
messages.add(m);
_gw.add(m, null, null);
}
long time = _context.clock().now() - start;
//try { Thread.sleep(60*1000); } catch (Exception e) {}
List received = _receiver.clearReceived();
for (int i = 0; i < messages.size(); i++) {
assertTrue(received.contains(((I2NPMessage)messages.get(i))));
}
}
private class TestReceiverr implements TunnelGateway.Receiver, FragmentHandler.DefragmentedReceiver {
private TunnelCreatorConfig _config;
private FragmentHandler _handler;
private List _received;
public TestReceiverr(TunnelCreatorConfig config) {
_config = config;
_handler = new FragmentHandler(_context, TestReceiverr.this);
_received = new ArrayList(1000);
}
public long receiveEncrypted(byte[] encrypted) {
// fake all the hops...
for (int i = 1; i < _config.getLength(); i++) {
HopProcessor hop = new HopProcessor(_context, _config.getConfig(i));
assertTrue(hop.process(encrypted, 0, encrypted.length, _config.getConfig(i).getReceiveFrom()));
}
_handler.receiveTunnelMessage(encrypted, 0, encrypted.length);
return -1; // or do we need to return the real message ID?
}
public void receiveComplete(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) {
_received.add(msg);
}
public List clearReceived() {
List rv = _received;
_received = new ArrayList();
return rv;
}
@Override
public Hash getSendTo() {
// TODO Auto-generated method stub
return null;
}
@Override
protected int getLastHop() {
return 1;
}
}

View File

@@ -0,0 +1,74 @@
package net.i2p.router.tunnel;
import net.i2p.data.Hash;
import net.i2p.data.RouterIdentity;
import net.i2p.data.RouterInfo;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import org.junit.BeforeClass;
/**
* Base class for tests that need a functioning router set up.
*
* @author zab
*/
public abstract class RouterTestBase {
protected static RouterContext _context;
protected static TunnelCreatorConfig _config;
@BeforeClass
public static void routerClassSetup() {
// order of these matters
Router r = new Router();
_context = new RouterContext(r);
_context.initAll();
r.runRouter();
RouterIdentity rIdentity = new TestRouterIdentity();
RouterInfo rInfo = new RouterInfo();
rInfo.setIdentity(rIdentity);
r.setRouterInfo(rInfo);
_config = prepareConfig(8);
}
private static TunnelCreatorConfig prepareConfig(int numHops) {
Hash peers[] = new Hash[numHops];
byte tunnelIds[][] = new byte[numHops][4];
for (int i = 0; i < numHops; i++) {
peers[i] = new Hash();
peers[i].setData(new byte[Hash.HASH_LENGTH]);
_context.random().nextBytes(peers[i].getData());
_context.random().nextBytes(tunnelIds[i]);
}
TunnelCreatorConfig config = new TunnelCreatorConfig(_context, numHops, false);
for (int i = 0; i < numHops; i++) {
config.setPeer(i, peers[i]);
HopConfig cfg = config.getConfig(i);
cfg.setExpiration(_context.clock().now() + 60000);
cfg.setIVKey(_context.keyGenerator().generateSessionKey());
cfg.setLayerKey(_context.keyGenerator().generateSessionKey());
if (i > 0)
cfg.setReceiveFrom(peers[i-1]);
else
cfg.setReceiveFrom(null);
cfg.setReceiveTunnelId(tunnelIds[i]);
if (i < numHops - 1) {
cfg.setSendTo(peers[i+1]);
cfg.setSendTunnelId(tunnelIds[i+1]);
} else {
cfg.setSendTo(null);
cfg.setSendTunnelId(null);
}
}
return config;
}
private static class TestRouterIdentity extends RouterIdentity {
@Override
public Hash getHash() {
return Hash.FAKE_HASH;
}
}
}