package net.i2p.router.tunnel; import static junit.framework.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import net.i2p.data.Hash; import net.i2p.data.TunnelId; import net.i2p.data.i2np.DataMessage; import net.i2p.data.i2np.I2NPMessage; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public abstract class GatewayTestBase extends RouterTestBase { private static TunnelGatewayPumper _pumper; private TunnelGateway.QueuePreprocessor _preprocessor; protected TunnelGateway.Sender _sender; protected TestReceiver _receiver; private TunnelGateway _gw; @BeforeClass public static void gatewayClassSetup() { _pumper = new TunnelGatewayPumper(_context); } @Before public void baseSetUp() { _preprocessor = new BatchedPreprocessor(_context,"test pre-processor"); setupSenderAndReceiver(); _gw = new PumpedTunnelGateway(_context, _preprocessor, _sender, _receiver, _pumper); } /** sets up the sender and receiver. Subclasses must override */ protected abstract void setupSenderAndReceiver(); /** * @return at which hop to start the decryption process */ protected abstract int getLastHop(); @Test public void testSmall() throws Exception { int runCount = 1; List<DataMessage> messages = new ArrayList<DataMessage>(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<I2NPMessage> 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<DataMessage> messages = new ArrayList<DataMessage>(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<I2NPMessage> 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<DataMessage> messages = new ArrayList<DataMessage>(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<I2NPMessage> 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<DataMessage> messages = new ArrayList<DataMessage>(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<I2NPMessage> 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); m.setMessageExpiration(_context.clock().now() + 60*1000); m.setUniqueId(_context.random().nextLong(I2NPMessage.MAX_ID_VALUE)); byte [] data = m.toByteArray(); // not sure why, maybe side-effect? --zab return m; } protected class TestReceiver implements TunnelGateway.Receiver, FragmentHandler.DefragmentedReceiver { private TunnelCreatorConfig _config; private FragmentHandler _handler; private volatile List<I2NPMessage> _received; public TestReceiver(TunnelCreatorConfig config) { _config = config; _handler = new FragmentHandler(_context, TestReceiver.this); _received = new ArrayList<I2NPMessage>(1000); } public long receiveEncrypted(byte[] encrypted) { // fake all the hops... 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())); } handleAtEndpoint(encrypted); _handler.receiveTunnelMessage(encrypted, 0, encrypted.length); return -1; // or do we need to return the real message ID? } protected void handleAtEndpoint(byte [] encrypted) { } public void receiveComplete(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) { _received.add(msg); } public List<I2NPMessage> clearReceived() { List<I2NPMessage> rv = _received; _received = new ArrayList<I2NPMessage>(); return rv; } @Override public Hash getSendTo() { // TODO Auto-generated method stub return null; } } }