mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-14 03:39:05 +01:00
Accept connections asynchronously.
This commit is contained in:
@@ -14,6 +14,8 @@ import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import net.sf.briar.api.ContactId;
|
||||
@@ -62,8 +64,10 @@ import net.sf.briar.transport.stream.TransportStreamModule;
|
||||
import org.bouncycastle.util.Arrays;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
|
||||
public class ProtocolIntegrationTest extends TestCase {
|
||||
|
||||
@@ -90,7 +94,14 @@ public class ProtocolIntegrationTest extends TestCase {
|
||||
|
||||
public ProtocolIntegrationTest() throws Exception {
|
||||
super();
|
||||
Injector i = Guice.createInjector(new CryptoModule(),
|
||||
Module testModule = new AbstractModule() {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(Executor.class).toInstance(
|
||||
new ScheduledThreadPoolExecutor(5));
|
||||
}
|
||||
};
|
||||
Injector i = Guice.createInjector(testModule, new CryptoModule(),
|
||||
new DatabaseModule(), new ProtocolModule(),
|
||||
new ProtocolWritersModule(), new SerialModule(),
|
||||
new TestDatabaseModule(), new TransportBatchModule(),
|
||||
|
||||
@@ -13,6 +13,8 @@ import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@@ -54,8 +56,10 @@ import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
|
||||
public class H2DatabaseTest extends TestCase {
|
||||
|
||||
@@ -93,7 +97,14 @@ public class H2DatabaseTest extends TestCase {
|
||||
|
||||
public H2DatabaseTest() throws Exception {
|
||||
super();
|
||||
Injector i = Guice.createInjector(new CryptoModule(),
|
||||
Module testModule = new AbstractModule() {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(Executor.class).toInstance(
|
||||
new ScheduledThreadPoolExecutor(5));
|
||||
}
|
||||
};
|
||||
Injector i = Guice.createInjector(testModule, new CryptoModule(),
|
||||
new DatabaseModule(), new ProtocolModule(),
|
||||
new ProtocolWritersModule(), new SerialModule(),
|
||||
new TransportBatchModule(), new TransportModule(),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.sf.briar.plugins;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
@@ -36,9 +37,10 @@ public class PluginManagerImplTest extends TestCase {
|
||||
allowing(db).setLocalProperties(with(any(TransportId.class)),
|
||||
with(any(TransportProperties.class)));
|
||||
}});
|
||||
Executor executor = new ImmediateExecutor();
|
||||
Poller poller = new PollerImpl();
|
||||
PluginManagerImpl p = new PluginManagerImpl(db, poller, dispatcher,
|
||||
uiCallback);
|
||||
PluginManagerImpl p = new PluginManagerImpl(db, executor, poller,
|
||||
dispatcher, uiCallback);
|
||||
// The Bluetooth plugin will not start without a Bluetooth device, so
|
||||
// we expect two plugins to be started
|
||||
assertEquals(2, p.startPlugins());
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
|
||||
@@ -15,12 +16,16 @@ import net.sf.briar.api.ContactId;
|
||||
import net.sf.briar.api.crypto.CryptoComponent;
|
||||
import net.sf.briar.api.crypto.ErasableKey;
|
||||
import net.sf.briar.api.db.DatabaseComponent;
|
||||
import net.sf.briar.api.db.DbException;
|
||||
import net.sf.briar.api.protocol.Transport;
|
||||
import net.sf.briar.api.protocol.TransportId;
|
||||
import net.sf.briar.api.protocol.TransportIndex;
|
||||
import net.sf.briar.api.transport.ConnectionContext;
|
||||
import net.sf.briar.api.transport.ConnectionRecogniser;
|
||||
import net.sf.briar.api.transport.ConnectionRecogniser.Callback;
|
||||
import net.sf.briar.api.transport.ConnectionWindow;
|
||||
import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.plugins.ImmediateExecutor;
|
||||
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.Mockery;
|
||||
@@ -72,9 +77,22 @@ public class ConnectionRecogniserImplTest extends TestCase {
|
||||
oneOf(db).getConnectionWindow(contactId, remoteIndex);
|
||||
will(returnValue(connectionWindow));
|
||||
}});
|
||||
final ConnectionRecogniserImpl c =
|
||||
new ConnectionRecogniserImpl(crypto, db);
|
||||
assertNull(c.acceptConnection(transportId, new byte[IV_LENGTH]));
|
||||
Executor e = new ImmediateExecutor();
|
||||
ConnectionRecogniser c = new ConnectionRecogniserImpl(crypto, db, e);
|
||||
c.acceptConnection(transportId, new byte[IV_LENGTH], new Callback() {
|
||||
|
||||
public void connectionAccepted(ConnectionContext ctx) {
|
||||
fail();
|
||||
}
|
||||
|
||||
public void connectionRejected() {
|
||||
// Expected
|
||||
}
|
||||
|
||||
public void handleException(DbException e) {
|
||||
fail();
|
||||
}
|
||||
});
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
|
||||
@@ -109,19 +127,57 @@ public class ConnectionRecogniserImplTest extends TestCase {
|
||||
oneOf(db).setConnectionWindow(contactId, remoteIndex,
|
||||
connectionWindow);
|
||||
}});
|
||||
final ConnectionRecogniserImpl c =
|
||||
new ConnectionRecogniserImpl(crypto, db);
|
||||
Executor e = new ImmediateExecutor();
|
||||
ConnectionRecogniser c = new ConnectionRecogniserImpl(crypto, db, e);
|
||||
// The IV should not be expected by the wrong transport
|
||||
TransportId wrong = new TransportId(TestUtils.getRandomId());
|
||||
assertNull(c.acceptConnection(wrong, encryptedIv));
|
||||
c.acceptConnection(wrong, encryptedIv, new Callback() {
|
||||
|
||||
public void connectionAccepted(ConnectionContext ctx) {
|
||||
fail();
|
||||
}
|
||||
|
||||
public void connectionRejected() {
|
||||
// Expected
|
||||
}
|
||||
|
||||
public void handleException(DbException e) {
|
||||
fail();
|
||||
}
|
||||
});
|
||||
// The IV should be expected by the right transport
|
||||
ConnectionContext ctx = c.acceptConnection(transportId, encryptedIv);
|
||||
assertNotNull(ctx);
|
||||
assertEquals(contactId, ctx.getContactId());
|
||||
assertEquals(remoteIndex, ctx.getTransportIndex());
|
||||
assertEquals(3L, ctx.getConnectionNumber());
|
||||
c.acceptConnection(transportId, encryptedIv, new Callback() {
|
||||
|
||||
public void connectionAccepted(ConnectionContext ctx) {
|
||||
assertNotNull(ctx);
|
||||
assertEquals(contactId, ctx.getContactId());
|
||||
assertEquals(remoteIndex, ctx.getTransportIndex());
|
||||
assertEquals(3L, ctx.getConnectionNumber());
|
||||
}
|
||||
|
||||
public void connectionRejected() {
|
||||
fail();
|
||||
}
|
||||
|
||||
public void handleException(DbException e) {
|
||||
fail();
|
||||
}
|
||||
});
|
||||
// The IV should no longer be expected
|
||||
assertNull(c.acceptConnection(transportId, encryptedIv));
|
||||
c.acceptConnection(transportId, encryptedIv, new Callback() {
|
||||
|
||||
public void connectionAccepted(ConnectionContext ctx) {
|
||||
fail();
|
||||
}
|
||||
|
||||
public void connectionRejected() {
|
||||
// Expected
|
||||
}
|
||||
|
||||
public void handleException(DbException e) {
|
||||
fail();
|
||||
}
|
||||
});
|
||||
// The window should have advanced
|
||||
Map<Long, byte[]> unseen = connectionWindow.getUnseen();
|
||||
assertEquals(19, unseen.size());
|
||||
|
||||
@@ -5,6 +5,8 @@ import static net.sf.briar.api.transport.TransportConstants.MIN_CONNECTION_LENGT
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import net.sf.briar.TestDatabaseModule;
|
||||
@@ -24,8 +26,10 @@ import net.sf.briar.transport.stream.TransportStreamModule;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
|
||||
public class ConnectionWriterTest extends TestCase {
|
||||
|
||||
@@ -38,7 +42,14 @@ public class ConnectionWriterTest extends TestCase {
|
||||
|
||||
public ConnectionWriterTest() throws Exception {
|
||||
super();
|
||||
Injector i = Guice.createInjector(new CryptoModule(),
|
||||
Module testModule = new AbstractModule() {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(Executor.class).toInstance(
|
||||
new ScheduledThreadPoolExecutor(5));
|
||||
}
|
||||
};
|
||||
Injector i = Guice.createInjector(testModule, new CryptoModule(),
|
||||
new DatabaseModule(), new ProtocolModule(),
|
||||
new ProtocolWritersModule(), new SerialModule(),
|
||||
new TestDatabaseModule(), new TransportBatchModule(),
|
||||
|
||||
@@ -10,12 +10,16 @@ import java.io.OutputStream;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import net.sf.briar.TestDatabaseModule;
|
||||
import net.sf.briar.TestUtils;
|
||||
import net.sf.briar.api.ContactId;
|
||||
import net.sf.briar.api.db.DatabaseComponent;
|
||||
import net.sf.briar.api.db.DbException;
|
||||
import net.sf.briar.api.db.event.DatabaseEvent;
|
||||
import net.sf.briar.api.db.event.DatabaseListener;
|
||||
import net.sf.briar.api.db.event.MessagesAddedEvent;
|
||||
@@ -32,6 +36,7 @@ import net.sf.briar.api.transport.BatchTransportWriter;
|
||||
import net.sf.briar.api.transport.ConnectionContext;
|
||||
import net.sf.briar.api.transport.ConnectionReaderFactory;
|
||||
import net.sf.briar.api.transport.ConnectionRecogniser;
|
||||
import net.sf.briar.api.transport.ConnectionRecogniser.Callback;
|
||||
import net.sf.briar.api.transport.ConnectionWriterFactory;
|
||||
import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.db.DatabaseModule;
|
||||
@@ -45,8 +50,10 @@ import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
|
||||
public class BatchConnectionReadWriteTest extends TestCase {
|
||||
|
||||
@@ -75,17 +82,31 @@ public class BatchConnectionReadWriteTest extends TestCase {
|
||||
public void setUp() {
|
||||
testDir.mkdirs();
|
||||
// Create Alice's injector
|
||||
alice = Guice.createInjector(new CryptoModule(), new DatabaseModule(),
|
||||
new ProtocolModule(), new ProtocolWritersModule(),
|
||||
new SerialModule(), new TestDatabaseModule(aliceDir),
|
||||
new TransportBatchModule(), new TransportModule(),
|
||||
new TransportStreamModule());
|
||||
Module aliceTestModule = new AbstractModule() {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(Executor.class).toInstance(
|
||||
new ScheduledThreadPoolExecutor(5));
|
||||
}
|
||||
};
|
||||
alice = Guice.createInjector(aliceTestModule, new CryptoModule(),
|
||||
new DatabaseModule(), new ProtocolModule(),
|
||||
new ProtocolWritersModule(), new SerialModule(),
|
||||
new TestDatabaseModule(aliceDir), new TransportBatchModule(),
|
||||
new TransportModule(), new TransportStreamModule());
|
||||
// Create Bob's injector
|
||||
bob = Guice.createInjector(new CryptoModule(), new DatabaseModule(),
|
||||
new ProtocolModule(), new ProtocolWritersModule(),
|
||||
new SerialModule(), new TestDatabaseModule(bobDir),
|
||||
new TransportBatchModule(), new TransportModule(),
|
||||
new TransportStreamModule());
|
||||
Module bobTestModule = new AbstractModule() {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(Executor.class).toInstance(
|
||||
new ScheduledThreadPoolExecutor(5));
|
||||
}
|
||||
};
|
||||
bob = Guice.createInjector(bobTestModule, new CryptoModule(),
|
||||
new DatabaseModule(), new ProtocolModule(),
|
||||
new ProtocolWritersModule(), new SerialModule(),
|
||||
new TestDatabaseModule(bobDir), new TransportBatchModule(),
|
||||
new TransportModule(), new TransportStreamModule());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -159,7 +180,10 @@ public class BatchConnectionReadWriteTest extends TestCase {
|
||||
byte[] encryptedIv = new byte[IV_LENGTH];
|
||||
int read = in.read(encryptedIv);
|
||||
assertEquals(encryptedIv.length, read);
|
||||
ConnectionContext ctx = rec.acceptConnection(transportId, encryptedIv);
|
||||
TestCallback callback = new TestCallback();
|
||||
rec.acceptConnection(transportId, encryptedIv, callback);
|
||||
callback.latch.await();
|
||||
ConnectionContext ctx = callback.ctx;
|
||||
assertNotNull(ctx);
|
||||
assertEquals(contactId, ctx.getContactId());
|
||||
assertEquals(transportIndex, ctx.getTransportIndex());
|
||||
@@ -234,4 +258,25 @@ public class BatchConnectionReadWriteTest extends TestCase {
|
||||
assertTrue(success);
|
||||
}
|
||||
}
|
||||
|
||||
private static class TestCallback implements Callback {
|
||||
|
||||
private final CountDownLatch latch = new CountDownLatch(1);
|
||||
private ConnectionContext ctx = null;
|
||||
|
||||
public void connectionAccepted(ConnectionContext ctx) {
|
||||
this.ctx = ctx;
|
||||
latch.countDown();
|
||||
}
|
||||
|
||||
public void connectionRejected() {
|
||||
fail();
|
||||
latch.countDown();
|
||||
}
|
||||
|
||||
public void handleException(DbException e) {
|
||||
fail();
|
||||
latch.countDown();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user