Add transports to DB during startup. #269

This commit is contained in:
akwizgran
2016-03-28 13:47:23 +01:00
parent 0417639410
commit 9714713d73
40 changed files with 276 additions and 402 deletions

View File

@@ -1,6 +1,7 @@
package org.briarproject.sync; package org.briarproject.sync;
import org.briarproject.TestDatabaseModule; import org.briarproject.TestDatabaseModule;
import org.briarproject.TestPluginsModule;
import org.briarproject.TestSystemModule; import org.briarproject.TestSystemModule;
import org.briarproject.api.contact.ContactManager; import org.briarproject.api.contact.ContactManager;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
@@ -23,6 +24,7 @@ import org.briarproject.event.EventModule;
import org.briarproject.identity.IdentityModule; import org.briarproject.identity.IdentityModule;
import org.briarproject.lifecycle.LifecycleModule; import org.briarproject.lifecycle.LifecycleModule;
import org.briarproject.messaging.MessagingModule; import org.briarproject.messaging.MessagingModule;
import org.briarproject.plugins.PluginsModule;
import org.briarproject.transport.TransportModule; import org.briarproject.transport.TransportModule;
import javax.inject.Singleton; import javax.inject.Singleton;
@@ -30,23 +32,37 @@ import javax.inject.Singleton;
import dagger.Component; import dagger.Component;
@Singleton @Singleton
@Component(modules = {TestDatabaseModule.class, TestSystemModule.class, @Component(modules = {TestDatabaseModule.class, TestPluginsModule.class,
LifecycleModule.class, ContactModule.class, CryptoModule.class, TestSystemModule.class, LifecycleModule.class, ContactModule.class,
DatabaseModule.class, EventModule.class, SyncModule.class, CryptoModule.class, DatabaseModule.class, EventModule.class,
DataModule.class, TransportModule.class, IdentityModule.class, SyncModule.class, DataModule.class, TransportModule.class,
MessagingModule.class, ClientsModule.class}) IdentityModule.class, MessagingModule.class, ClientsModule.class,
PluginsModule.class})
public interface SimplexMessagingComponent { public interface SimplexMessagingComponent {
void inject(SimplexMessagingIntegrationTest testCase); void inject(SimplexMessagingIntegrationTest testCase);
LifecycleManager getLifeCycleManager();
LifecycleManager getLifecycleManager();
DatabaseComponent getDatabaseComponent(); DatabaseComponent getDatabaseComponent();
IdentityManager getIdentityManager(); IdentityManager getIdentityManager();
ContactManager getContactManager(); ContactManager getContactManager();
MessagingManager getMessagingManager(); MessagingManager getMessagingManager();
KeyManager getKeyManager(); KeyManager getKeyManager();
PrivateMessageFactory getPrivateMessageFactory(); PrivateMessageFactory getPrivateMessageFactory();
PacketWriterFactory getPacketWriterFactory(); PacketWriterFactory getPacketWriterFactory();
EventBus getEventBus(); EventBus getEventBus();
StreamWriterFactory getStreamWriterFactory(); StreamWriterFactory getStreamWriterFactory();
StreamReaderFactory getStreamReaderFactory(); StreamReaderFactory getStreamReaderFactory();
PacketReaderFactory getPacketReaderFactory(); PacketReaderFactory getPacketReaderFactory();
} }

View File

@@ -4,12 +4,10 @@ import org.briarproject.BriarTestCase;
import org.briarproject.ImmediateExecutor; import org.briarproject.ImmediateExecutor;
import org.briarproject.TestDatabaseModule; import org.briarproject.TestDatabaseModule;
import org.briarproject.TestUtils; import org.briarproject.TestUtils;
import org.briarproject.api.TransportId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.contact.ContactManager; import org.briarproject.api.contact.ContactManager;
import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.crypto.SecretKey;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.Transaction;
import org.briarproject.api.event.Event; import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener; import org.briarproject.api.event.EventListener;
@@ -36,27 +34,26 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
public class SimplexMessagingIntegrationTest extends BriarTestCase { import static org.briarproject.TestPluginsModule.MAX_LATENCY;
import static org.briarproject.TestPluginsModule.TRANSPORT_ID;
import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
private static final int MAX_LATENCY = 2 * 60 * 1000; // 2 minutes public class SimplexMessagingIntegrationTest extends BriarTestCase {
private final File testDir = TestUtils.getTestDirectory(); private final File testDir = TestUtils.getTestDirectory();
private final File aliceDir = new File(testDir, "alice"); private final File aliceDir = new File(testDir, "alice");
private final File bobDir = new File(testDir, "bob"); private final File bobDir = new File(testDir, "bob");
private final TransportId transportId = new TransportId("id");
private final SecretKey master = TestUtils.createSecretKey(); private final SecretKey master = TestUtils.createSecretKey();
private final long timestamp = System.currentTimeMillis(); private final long timestamp = System.currentTimeMillis();
private final AuthorId aliceId = new AuthorId(TestUtils.getRandomId()); private final AuthorId aliceId = new AuthorId(TestUtils.getRandomId());
@@ -80,7 +77,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
private byte[] write() throws Exception { private byte[] write() throws Exception {
// Instantiate Alice's services // Instantiate Alice's services
LifecycleManager lifecycleManager = alice.getLifeCycleManager(); LifecycleManager lifecycleManager = alice.getLifecycleManager();
DatabaseComponent db = alice.getDatabaseComponent(); DatabaseComponent db = alice.getDatabaseComponent();
IdentityManager identityManager = alice.getIdentityManager(); IdentityManager identityManager = alice.getIdentityManager();
ContactManager contactManager = alice.getContactManager(); ContactManager contactManager = alice.getContactManager();
@@ -97,14 +94,6 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
// Start the lifecycle manager // Start the lifecycle manager
lifecycleManager.startServices(); lifecycleManager.startServices();
lifecycleManager.waitForStartup(); lifecycleManager.waitForStartup();
// Add a transport
Transaction txn = db.startTransaction();
try {
db.addTransport(txn, transportId, MAX_LATENCY);
txn.setComplete();
} finally {
db.endTransaction(txn);
}
// Add an identity for Alice // Add an identity for Alice
LocalAuthor aliceAuthor = new LocalAuthor(aliceId, "Alice", LocalAuthor aliceAuthor = new LocalAuthor(aliceId, "Alice",
new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp); new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp);
@@ -122,7 +111,8 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
groupId, timestamp, null, "text/plain", body); groupId, timestamp, null, "text/plain", body);
messagingManager.addLocalMessage(message); messagingManager.addLocalMessage(message);
// Get a stream context // Get a stream context
StreamContext ctx = keyManager.getStreamContext(contactId, transportId); StreamContext ctx = keyManager.getStreamContext(contactId,
TRANSPORT_ID);
assertNotNull(ctx); assertNotNull(ctx);
// Create a stream writer // Create a stream writer
ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -132,8 +122,8 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
PacketWriter packetWriter = packetWriterFactory.createPacketWriter( PacketWriter packetWriter = packetWriterFactory.createPacketWriter(
streamWriter); streamWriter);
SyncSession session = new SimplexOutgoingSession(db, SyncSession session = new SimplexOutgoingSession(db,
new ImmediateExecutor(), eventBus, contactId, transportId, new ImmediateExecutor(), eventBus, contactId, MAX_LATENCY,
MAX_LATENCY, packetWriter); packetWriter);
// Write whatever needs to be written // Write whatever needs to be written
session.run(); session.run();
streamWriter.close(); streamWriter.close();
@@ -148,7 +138,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
private void read(byte[] stream) throws Exception { private void read(byte[] stream) throws Exception {
// Instantiate Bob's services // Instantiate Bob's services
LifecycleManager lifecycleManager = bob.getLifeCycleManager(); LifecycleManager lifecycleManager = bob.getLifecycleManager();
DatabaseComponent db = bob.getDatabaseComponent(); DatabaseComponent db = bob.getDatabaseComponent();
IdentityManager identityManager = bob.getIdentityManager(); IdentityManager identityManager = bob.getIdentityManager();
ContactManager contactManager = bob.getContactManager(); ContactManager contactManager = bob.getContactManager();
@@ -162,14 +152,6 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
// Start the lifecyle manager // Start the lifecyle manager
lifecycleManager.startServices(); lifecycleManager.startServices();
lifecycleManager.waitForStartup(); lifecycleManager.waitForStartup();
// Add a transport
Transaction txn = db.startTransaction();
try {
db.addTransport(txn, transportId, MAX_LATENCY);
txn.setComplete();
} finally {
db.endTransaction(txn);
}
// Add an identity for Bob // Add an identity for Bob
LocalAuthor bobAuthor = new LocalAuthor(bobId, "Bob", LocalAuthor bobAuthor = new LocalAuthor(bobId, "Bob",
new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp); new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp);
@@ -188,7 +170,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
byte[] tag = new byte[TAG_LENGTH]; byte[] tag = new byte[TAG_LENGTH];
int read = in.read(tag); int read = in.read(tag);
assertEquals(tag.length, read); assertEquals(tag.length, read);
StreamContext ctx = keyManager.getStreamContext(transportId, tag); StreamContext ctx = keyManager.getStreamContext(TRANSPORT_ID, tag);
assertNotNull(ctx); assertNotNull(ctx);
// Create a stream reader // Create a stream reader
InputStream streamReader = streamReaderFactory.createStreamReader( InputStream streamReader = streamReaderFactory.createStreamReader(
@@ -197,7 +179,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
PacketReader packetReader = packetReaderFactory.createPacketReader( PacketReader packetReader = packetReaderFactory.createPacketReader(
streamReader); streamReader);
SyncSession session = new IncomingSession(db, new ImmediateExecutor(), SyncSession session = new IncomingSession(db, new ImmediateExecutor(),
eventBus, contactId, transportId, packetReader); eventBus, contactId, packetReader);
// No messages should have been added yet // No messages should have been added yet
assertFalse(listener.messageAdded); assertFalse(listener.messageAdded);
// Read whatever needs to be read // Read whatever needs to be read

View File

@@ -2,8 +2,8 @@ package org.briarproject.plugins.droidtooth;
import android.content.Context; import android.content.Context;
import org.briarproject.api.TransportId;
import org.briarproject.android.api.AndroidExecutor; import org.briarproject.android.api.AndroidExecutor;
import org.briarproject.api.TransportId;
import org.briarproject.api.plugins.Backoff; import org.briarproject.api.plugins.Backoff;
import org.briarproject.api.plugins.BackoffFactory; import org.briarproject.api.plugins.BackoffFactory;
import org.briarproject.api.plugins.duplex.DuplexPlugin; import org.briarproject.api.plugins.duplex.DuplexPlugin;
@@ -40,6 +40,10 @@ public class DroidtoothPluginFactory implements DuplexPluginFactory {
return DroidtoothPlugin.ID; return DroidtoothPlugin.ID;
} }
public int getMaxLatency() {
return MAX_LATENCY;
}
public DuplexPlugin createPlugin(DuplexPluginCallback callback) { public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
MAX_POLLING_INTERVAL, BACKOFF_BASE); MAX_POLLING_INTERVAL, BACKOFF_BASE);

View File

@@ -1,16 +1,16 @@
package org.briarproject.plugins.droidtooth; package org.briarproject.plugins.droidtooth;
import java.io.IOException; import android.bluetooth.BluetoothSocket;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicBoolean;
import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader; import org.briarproject.api.plugins.TransportConnectionReader;
import org.briarproject.api.plugins.TransportConnectionWriter; import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection; import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
import android.bluetooth.BluetoothSocket; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicBoolean;
class DroidtoothTransportConnection implements DuplexTransportConnection { class DroidtoothTransportConnection implements DuplexTransportConnection {
@@ -39,10 +39,6 @@ class DroidtoothTransportConnection implements DuplexTransportConnection {
private class Reader implements TransportConnectionReader { private class Reader implements TransportConnectionReader {
public long getMaxLatency() {
return plugin.getMaxLatency();
}
public InputStream getInputStream() throws IOException { public InputStream getInputStream() throws IOException {
return socket.getInputStream(); return socket.getInputStream();
} }

View File

@@ -34,6 +34,10 @@ public class AndroidLanTcpPluginFactory implements DuplexPluginFactory {
return LanTcpPlugin.ID; return LanTcpPlugin.ID;
} }
public int getMaxLatency() {
return MAX_LATENCY;
}
public DuplexPlugin createPlugin(DuplexPluginCallback callback) { public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
MAX_POLLING_INTERVAL, BACKOFF_BASE); MAX_POLLING_INTERVAL, BACKOFF_BASE);

View File

@@ -44,6 +44,10 @@ public class TorPluginFactory implements DuplexPluginFactory {
return TorPlugin.ID; return TorPlugin.ID;
} }
public int getMaxLatency() {
return MAX_LATENCY;
}
public DuplexPlugin createPlugin(DuplexPluginCallback callback) { public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
// Check that we have a Tor binary for this architecture // Check that we have a Tor binary for this architecture

View File

@@ -1,16 +1,16 @@
package org.briarproject.plugins.tor; package org.briarproject.plugins.tor;
import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.Socket; import java.net.Socket;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
class TorTransportConnection implements DuplexTransportConnection { class TorTransportConnection implements DuplexTransportConnection {
private final Plugin plugin; private final Plugin plugin;
@@ -38,10 +38,6 @@ class TorTransportConnection implements DuplexTransportConnection {
private class Reader implements TransportConnectionReader { private class Reader implements TransportConnectionReader {
public long getMaxLatency() {
return plugin.getMaxLatency();
}
public InputStream getInputStream() throws IOException { public InputStream getInputStream() throws IOException {
return socket.getInputStream(); return socket.getInputStream();
} }

View File

@@ -235,12 +235,6 @@ public interface DatabaseComponent {
Map<ContactId, TransportKeys> getTransportKeys(Transaction txn, Map<ContactId, TransportKeys> getTransportKeys(Transaction txn,
TransportId t) throws DbException; TransportId t) throws DbException;
/**
* Returns the maximum latencies in milliseconds of all transports.
*/
Map<TransportId, Integer> getTransportLatencies(Transaction txn)
throws DbException;
/** /**
* Increments the outgoing stream counter for the given contact and * Increments the outgoing stream counter for the given contact and
* transport in the given rotation period . * transport in the given rotation period .

View File

@@ -1,23 +0,0 @@
package org.briarproject.api.event;
import org.briarproject.api.TransportId;
/** An event that is broadcast when a transport is added. */
public class TransportAddedEvent extends Event {
private final TransportId transportId;
private final int maxLatency;
public TransportAddedEvent(TransportId transportId, int maxLatency) {
this.transportId = transportId;
this.maxLatency = maxLatency;
}
public TransportId getTransportId() {
return transportId;
}
public int getMaxLatency() {
return maxLatency;
}
}

View File

@@ -1,17 +0,0 @@
package org.briarproject.api.event;
import org.briarproject.api.TransportId;
/** An event that is broadcast when a transport is removed. */
public class TransportRemovedEvent extends Event {
private final TransportId transportId;
public TransportRemovedEvent(TransportId transportId) {
this.transportId = transportId;
}
public TransportId getTransportId() {
return transportId;
}
}

View File

@@ -9,10 +9,9 @@ import java.io.InputStream;
*/ */
public interface TransportConnectionReader { public interface TransportConnectionReader {
/** Returns the maximum latency of the transport in milliseconds. */ /**
long getMaxLatency(); * Returns an input stream for reading from the transport connection.
*/
/** Returns an input stream for reading from the transport connection. */
InputStream getInputStream() throws IOException; InputStream getInputStream() throws IOException;
/** /**
@@ -20,10 +19,13 @@ public interface TransportConnectionReader {
* simplex, the connection is closed. If the transport is duplex, the * simplex, the connection is closed. If the transport is duplex, the
* connection is closed if <tt>exception</tt> is true or the other side of * connection is closed if <tt>exception</tt> is true or the other side of
* the connection has been marked as closed. * the connection has been marked as closed.
* @param exception true if the connection is being closed because of an *
* exception. This may affect how resources are disposed of. * @param exception true if the connection is being closed because of an
* exception. This may affect how resources are disposed
* of.
* @param recognised true if the connection is definitely a Briar transport * @param recognised true if the connection is definitely a Briar transport
* connection. This may affect how resources are disposed of. * connection. This may affect how resources are disposed
* of.
*/ */
void dispose(boolean exception, boolean recognised) throws IOException; void dispose(boolean exception, boolean recognised) throws IOException;
} }

View File

@@ -2,12 +2,23 @@ package org.briarproject.api.plugins.duplex;
import org.briarproject.api.TransportId; import org.briarproject.api.TransportId;
/** Factory for creating a plugin for a duplex transport. */ /**
* Factory for creating a plugin for a duplex transport.
*/
public interface DuplexPluginFactory { public interface DuplexPluginFactory {
/** Returns the plugin's transport identifier. */ /**
* Returns the plugin's transport identifier.
*/
TransportId getId(); TransportId getId();
/** Creates and returns a plugin, or null if no plugin can be created. */ /**
* Returns the maximum latency of the transport in milliseconds.
*/
int getMaxLatency();
/**
* Creates and returns a plugin, or null if no plugin can be created.
*/
DuplexPlugin createPlugin(DuplexPluginCallback callback); DuplexPlugin createPlugin(DuplexPluginCallback callback);
} }

View File

@@ -2,12 +2,23 @@ package org.briarproject.api.plugins.simplex;
import org.briarproject.api.TransportId; import org.briarproject.api.TransportId;
/** Factory for creating a plugin for a simplex transport. */ /**
* Factory for creating a plugin for a simplex transport.
*/
public interface SimplexPluginFactory { public interface SimplexPluginFactory {
/** Returns the plugin's transport identifier. */ /**
* Returns the plugin's transport identifier.
*/
TransportId getId(); TransportId getId();
/** Creates and returns a plugin, or null if no plugin can be created. */ /**
* Returns the maximum latency of the transport in milliseconds.
*/
int getMaxLatency();
/**
* Creates and returns a plugin, or null if no plugin can be created.
*/
SimplexPlugin createPlugin(SimplexPluginCallback callback); SimplexPlugin createPlugin(SimplexPluginCallback callback);
} }

View File

@@ -1,6 +1,5 @@
package org.briarproject.api.sync; package org.briarproject.api.sync;
import org.briarproject.api.TransportId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import java.io.InputStream; import java.io.InputStream;
@@ -8,12 +7,11 @@ import java.io.OutputStream;
public interface SyncSessionFactory { public interface SyncSessionFactory {
SyncSession createIncomingSession(ContactId c, TransportId t, SyncSession createIncomingSession(ContactId c, InputStream in);
InputStream in);
SyncSession createSimplexOutgoingSession(ContactId c, TransportId t, SyncSession createSimplexOutgoingSession(ContactId c, int maxLatency,
int maxLatency, OutputStream out); OutputStream out);
SyncSession createDuplexOutgoingSession(ContactId c, TransportId t, SyncSession createDuplexOutgoingSession(ContactId c, int maxLatency,
int maxLatency, int maxIdleTime, OutputStream out); int maxIdleTime, OutputStream out);
} }

View File

@@ -324,11 +324,6 @@ interface Database<T> {
Map<ContactId, TransportKeys> getTransportKeys(T txn, TransportId t) Map<ContactId, TransportKeys> getTransportKeys(T txn, TransportId t)
throws DbException; throws DbException;
/**
* Returns the maximum latencies in milliseconds of all transports.
*/
Map<TransportId, Integer> getTransportLatencies(T txn) throws DbException;
/** /**
* Returns the IDs of all contacts to which the given group is visible. * Returns the IDs of all contacts to which the given group is visible.
*/ */

View File

@@ -33,8 +33,6 @@ import org.briarproject.api.event.MessageValidatedEvent;
import org.briarproject.api.event.MessagesAckedEvent; import org.briarproject.api.event.MessagesAckedEvent;
import org.briarproject.api.event.MessagesSentEvent; import org.briarproject.api.event.MessagesSentEvent;
import org.briarproject.api.event.SettingsUpdatedEvent; import org.briarproject.api.event.SettingsUpdatedEvent;
import org.briarproject.api.event.TransportAddedEvent;
import org.briarproject.api.event.TransportRemovedEvent;
import org.briarproject.api.identity.Author; import org.briarproject.api.identity.Author;
import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.AuthorId;
import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.identity.LocalAuthor;
@@ -192,10 +190,8 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
public void addTransport(Transaction transaction, TransportId t, public void addTransport(Transaction transaction, TransportId t,
int maxLatency) throws DbException { int maxLatency) throws DbException {
T txn = unbox(transaction); T txn = unbox(transaction);
if (!db.containsTransport(txn, t)) { if (!db.containsTransport(txn, t))
db.addTransport(txn, t, maxLatency); db.addTransport(txn, t, maxLatency);
transaction.attach(new TransportAddedEvent(t, maxLatency));
}
} }
public void addTransportKeys(Transaction transaction, ContactId c, public void addTransportKeys(Transaction transaction, ContactId c,
@@ -420,12 +416,6 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
return db.getTransportKeys(txn, t); return db.getTransportKeys(txn, t);
} }
public Map<TransportId, Integer> getTransportLatencies(
Transaction transaction) throws DbException {
T txn = unbox(transaction);
return db.getTransportLatencies(txn);
}
public void incrementStreamCounter(Transaction transaction, ContactId c, public void incrementStreamCounter(Transaction transaction, ContactId c,
TransportId t, long rotationPeriod) throws DbException { TransportId t, long rotationPeriod) throws DbException {
T txn = unbox(transaction); T txn = unbox(transaction);
@@ -579,7 +569,6 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
if (!db.containsTransport(txn, t)) if (!db.containsTransport(txn, t))
throw new NoSuchTransportException(); throw new NoSuchTransportException();
db.removeTransport(txn, t); db.removeTransport(txn, t);
transaction.attach(new TransportRemovedEvent(t));
} }
public void setContactActive(Transaction transaction, ContactId c, public void setContactActive(Transaction transaction, ContactId c,

View File

@@ -1542,30 +1542,6 @@ abstract class JdbcDatabase implements Database<Connection> {
} }
} }
public Map<TransportId, Integer> getTransportLatencies(Connection txn)
throws DbException {
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "SELECT transportId, maxLatency FROM transports";
ps = txn.prepareStatement(sql);
rs = ps.executeQuery();
Map<TransportId, Integer> latencies =
new HashMap<TransportId, Integer>();
while (rs.next()) {
TransportId id = new TransportId(rs.getString(1));
latencies.put(id, rs.getInt(2));
}
rs.close();
ps.close();
return Collections.unmodifiableMap(latencies);
} catch (SQLException e) {
tryToClose(rs);
tryToClose(ps);
throw new DbException(e);
}
}
public Collection<ContactId> getVisibility(Connection txn, GroupId g) public Collection<ContactId> getVisibility(Connection txn, GroupId g)
throws DbException { throws DbException {
PreparedStatement ps = null; PreparedStatement ps = null;

View File

@@ -6,7 +6,6 @@ import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.ShutdownEvent; import org.briarproject.api.event.ShutdownEvent;
import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.lifecycle.Service; import org.briarproject.api.lifecycle.Service;
import org.briarproject.api.system.Clock;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
@@ -30,7 +29,6 @@ class LifecycleManagerImpl implements LifecycleManager {
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(LifecycleManagerImpl.class.getName()); Logger.getLogger(LifecycleManagerImpl.class.getName());
private final Clock clock;
private final DatabaseComponent db; private final DatabaseComponent db;
private final EventBus eventBus; private final EventBus eventBus;
private final Collection<Service> services; private final Collection<Service> services;
@@ -41,8 +39,7 @@ class LifecycleManagerImpl implements LifecycleManager {
private final CountDownLatch shutdownLatch = new CountDownLatch(1); private final CountDownLatch shutdownLatch = new CountDownLatch(1);
@Inject @Inject
LifecycleManagerImpl(Clock clock, DatabaseComponent db, EventBus eventBus) { LifecycleManagerImpl(DatabaseComponent db, EventBus eventBus) {
this.clock = clock;
this.db = db; this.db = db;
this.eventBus = eventBus; this.eventBus = eventBus;
services = new CopyOnWriteArrayList<Service>(); services = new CopyOnWriteArrayList<Service>();
@@ -68,9 +65,9 @@ class LifecycleManagerImpl implements LifecycleManager {
} }
try { try {
LOG.info("Starting services"); LOG.info("Starting services");
long now = clock.currentTimeMillis(); long start = System.currentTimeMillis();
boolean reopened = db.open(); boolean reopened = db.open();
long duration = clock.currentTimeMillis() - now; long duration = System.currentTimeMillis() - start;
if (LOG.isLoggable(INFO)) { if (LOG.isLoggable(INFO)) {
if (reopened) if (reopened)
LOG.info("Reopening database took " + duration + " ms"); LOG.info("Reopening database took " + duration + " ms");
@@ -78,9 +75,9 @@ class LifecycleManagerImpl implements LifecycleManager {
} }
dbLatch.countDown(); dbLatch.countDown();
for (Service s : services) { for (Service s : services) {
now = clock.currentTimeMillis(); start = System.currentTimeMillis();
boolean started = s.start(); boolean started = s.start();
duration = clock.currentTimeMillis() - now; duration = System.currentTimeMillis() - start;
if (!started) { if (!started) {
if (LOG.isLoggable(WARNING)) { if (LOG.isLoggable(WARNING)) {
String name = s.getClass().getName(); String name = s.getClass().getName();

View File

@@ -1,6 +1,10 @@
package org.briarproject.lifecycle; package org.briarproject.lifecycle;
import static java.util.concurrent.TimeUnit.SECONDS; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.lifecycle.IoExecutor;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.lifecycle.ShutdownManager;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -12,16 +16,11 @@ import java.util.concurrent.ThreadPoolExecutor;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.lifecycle.IoExecutor;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.lifecycle.ShutdownManager;
import org.briarproject.api.system.Clock;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import static java.util.concurrent.TimeUnit.SECONDS;
@Module @Module
public class LifecycleModule { public class LifecycleModule {
@@ -51,9 +50,9 @@ public class LifecycleModule {
@Provides @Provides
@Singleton @Singleton
LifecycleManager provideLifeCycleManager(Clock clock, DatabaseComponent db, LifecycleManager provideLifecycleManager(DatabaseComponent db,
EventBus eventBus) { EventBus eventBus) {
return new LifecycleManagerImpl(clock, db, eventBus); return new LifecycleManagerImpl(db, eventBus);
} }
@Provides @Provides
@@ -63,5 +62,4 @@ public class LifecycleModule {
lifecycleManager.registerForShutdown(ioExecutor); lifecycleManager.registerForShutdown(ioExecutor);
return ioExecutor; return ioExecutor;
} }
} }

View File

@@ -90,8 +90,8 @@ class ConnectionManagerImpl implements ConnectionManager {
TransportConnectionReader r) throws IOException { TransportConnectionReader r) throws IOException {
InputStream streamReader = streamReaderFactory.createStreamReader( InputStream streamReader = streamReaderFactory.createStreamReader(
r.getInputStream(), ctx); r.getInputStream(), ctx);
return syncSessionFactory.createIncomingSession( return syncSessionFactory.createIncomingSession(ctx.getContactId(),
ctx.getContactId(), ctx.getTransportId(), streamReader); streamReader);
} }
private SyncSession createSimplexOutgoingSession(StreamContext ctx, private SyncSession createSimplexOutgoingSession(StreamContext ctx,
@@ -99,8 +99,7 @@ class ConnectionManagerImpl implements ConnectionManager {
OutputStream streamWriter = streamWriterFactory.createStreamWriter( OutputStream streamWriter = streamWriterFactory.createStreamWriter(
w.getOutputStream(), ctx); w.getOutputStream(), ctx);
return syncSessionFactory.createSimplexOutgoingSession( return syncSessionFactory.createSimplexOutgoingSession(
ctx.getContactId(), ctx.getTransportId(), w.getMaxLatency(), ctx.getContactId(), w.getMaxLatency(), streamWriter);
streamWriter);
} }
private SyncSession createDuplexOutgoingSession(StreamContext ctx, private SyncSession createDuplexOutgoingSession(StreamContext ctx,
@@ -108,8 +107,8 @@ class ConnectionManagerImpl implements ConnectionManager {
OutputStream streamWriter = streamWriterFactory.createStreamWriter( OutputStream streamWriter = streamWriterFactory.createStreamWriter(
w.getOutputStream(), ctx); w.getOutputStream(), ctx);
return syncSessionFactory.createDuplexOutgoingSession( return syncSessionFactory.createDuplexOutgoingSession(
ctx.getContactId(), ctx.getTransportId(), w.getMaxLatency(), ctx.getContactId(), w.getMaxLatency(), w.getMaxIdleTime(),
w.getMaxIdleTime(), streamWriter); streamWriter);
} }
private class ManageIncomingSimplexConnection implements Runnable { private class ManageIncomingSimplexConnection implements Runnable {

View File

@@ -2,9 +2,7 @@ package org.briarproject.plugins;
import org.briarproject.api.TransportId; import org.briarproject.api.TransportId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.db.Transaction;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.TransportDisabledEvent; import org.briarproject.api.event.TransportDisabledEvent;
import org.briarproject.api.event.TransportEnabledEvent; import org.briarproject.api.event.TransportEnabledEvent;
@@ -28,7 +26,6 @@ import org.briarproject.api.properties.TransportProperties;
import org.briarproject.api.properties.TransportPropertyManager; import org.briarproject.api.properties.TransportPropertyManager;
import org.briarproject.api.settings.Settings; import org.briarproject.api.settings.Settings;
import org.briarproject.api.settings.SettingsManager; import org.briarproject.api.settings.SettingsManager;
import org.briarproject.api.system.Clock;
import org.briarproject.api.ui.UiCallback; import org.briarproject.api.ui.UiCallback;
import java.io.IOException; import java.io.IOException;
@@ -56,8 +53,6 @@ class PluginManagerImpl implements PluginManager, Service {
private final Executor ioExecutor; private final Executor ioExecutor;
private final EventBus eventBus; private final EventBus eventBus;
private final PluginConfig pluginConfig; private final PluginConfig pluginConfig;
private final Clock clock;
private final DatabaseComponent db;
private final Poller poller; private final Poller poller;
private final ConnectionManager connectionManager; private final ConnectionManager connectionManager;
private final SettingsManager settingsManager; private final SettingsManager settingsManager;
@@ -69,8 +64,7 @@ class PluginManagerImpl implements PluginManager, Service {
@Inject @Inject
PluginManagerImpl(@IoExecutor Executor ioExecutor, EventBus eventBus, PluginManagerImpl(@IoExecutor Executor ioExecutor, EventBus eventBus,
PluginConfig pluginConfig, Clock clock, PluginConfig pluginConfig, Poller poller,
DatabaseComponent db, Poller poller,
ConnectionManager connectionManager, ConnectionManager connectionManager,
SettingsManager settingsManager, SettingsManager settingsManager,
TransportPropertyManager transportPropertyManager, TransportPropertyManager transportPropertyManager,
@@ -78,8 +72,6 @@ class PluginManagerImpl implements PluginManager, Service {
this.ioExecutor = ioExecutor; this.ioExecutor = ioExecutor;
this.eventBus = eventBus; this.eventBus = eventBus;
this.pluginConfig = pluginConfig; this.pluginConfig = pluginConfig;
this.clock = clock;
this.db = db;
this.poller = poller; this.poller = poller;
this.connectionManager = connectionManager; this.connectionManager = connectionManager;
this.settingsManager = settingsManager; this.settingsManager = settingsManager;
@@ -181,26 +173,9 @@ class PluginManagerImpl implements PluginManager, Service {
return; return;
} }
try { try {
long start = clock.currentTimeMillis(); long start = System.currentTimeMillis();
Transaction txn = db.startTransaction();
try {
db.addTransport(txn, id, plugin.getMaxLatency());
txn.setComplete();
} finally {
db.endTransaction(txn);
}
long duration = clock.currentTimeMillis() - start;
if (LOG.isLoggable(INFO))
LOG.info("Adding transport took " + duration + " ms");
} catch (DbException e) {
if (LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e);
return;
}
try {
long start = clock.currentTimeMillis();
boolean started = plugin.start(); boolean started = plugin.start();
long duration = clock.currentTimeMillis() - start; long duration = System.currentTimeMillis() - start;
if (started) { if (started) {
plugins.put(id, plugin); plugins.put(id, plugin);
simplexPlugins.add(plugin); simplexPlugins.add(plugin);
@@ -250,26 +225,9 @@ class PluginManagerImpl implements PluginManager, Service {
return; return;
} }
try { try {
long start = clock.currentTimeMillis(); long start = System.currentTimeMillis();
Transaction txn = db.startTransaction();
try {
db.addTransport(txn, id, plugin.getMaxLatency());
txn.setComplete();
} finally {
db.endTransaction(txn);
}
long duration = clock.currentTimeMillis() - start;
if (LOG.isLoggable(INFO))
LOG.info("Adding transport took " + duration + " ms");
} catch (DbException e) {
if (LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e);
return;
}
try {
long start = clock.currentTimeMillis();
boolean started = plugin.start(); boolean started = plugin.start();
long duration = clock.currentTimeMillis() - start; long duration = System.currentTimeMillis() - start;
if (started) { if (started) {
plugins.put(id, plugin); plugins.put(id, plugin);
duplexPlugins.add(plugin); duplexPlugins.add(plugin);
@@ -307,9 +265,9 @@ class PluginManagerImpl implements PluginManager, Service {
public void run() { public void run() {
try { try {
long start = clock.currentTimeMillis(); long start = System.currentTimeMillis();
plugin.stop(); plugin.stop();
long duration = clock.currentTimeMillis() - start; long duration = System.currentTimeMillis() - start;
if (LOG.isLoggable(INFO)) { if (LOG.isLoggable(INFO)) {
String name = plugin.getClass().getSimpleName(); String name = plugin.getClass().getSimpleName();
LOG.info("Stopping " + name + " took " + duration + " ms"); LOG.info("Stopping " + name + " took " + duration + " ms");

View File

@@ -1,8 +1,5 @@
package org.briarproject.plugins; package org.briarproject.plugins;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.IoExecutor;
import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.LifecycleManager;
@@ -19,10 +16,12 @@ import org.briarproject.api.transport.StreamWriterFactory;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
@Module @Module
public class PluginsModule { public class PluginsModule {
@@ -45,8 +44,8 @@ public class PluginsModule {
@Provides @Provides
ConnectionManager provideConnectionManager( ConnectionManager provideConnectionManager(
@IoExecutor Executor ioExecutor, @IoExecutor Executor ioExecutor, KeyManager keyManager,
KeyManager keyManager, StreamReaderFactory streamReaderFactory, StreamReaderFactory streamReaderFactory,
StreamWriterFactory streamWriterFactory, StreamWriterFactory streamWriterFactory,
SyncSessionFactory syncSessionFactory, SyncSessionFactory syncSessionFactory,
ConnectionRegistry connectionRegistry) { ConnectionRegistry connectionRegistry) {
@@ -61,7 +60,6 @@ public class PluginsModule {
return new ConnectionRegistryImpl(eventBus); return new ConnectionRegistryImpl(eventBus);
} }
@Provides @Provides
@Singleton @Singleton
PluginManager getPluginManager(LifecycleManager lifecycleManager, PluginManager getPluginManager(LifecycleManager lifecycleManager,
@@ -69,5 +67,4 @@ public class PluginsModule {
lifecycleManager.register(pluginManager); lifecycleManager.register(pluginManager);
return pluginManager; return pluginManager;
} }
} }

View File

@@ -1,13 +1,13 @@
package org.briarproject.plugins.file; package org.briarproject.plugins.file;
import static java.util.logging.Level.WARNING; import org.briarproject.api.plugins.TransportConnectionReader;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.briarproject.api.plugins.TransportConnectionReader; import static java.util.logging.Level.WARNING;
class FileTransportReader implements TransportConnectionReader { class FileTransportReader implements TransportConnectionReader {
@@ -24,10 +24,6 @@ class FileTransportReader implements TransportConnectionReader {
this.plugin = plugin; this.plugin = plugin;
} }
public long getMaxLatency() {
return plugin.getMaxLatency();
}
public InputStream getInputStream() { public InputStream getInputStream() {
return in; return in;
} }

View File

@@ -30,6 +30,10 @@ public class LanTcpPluginFactory implements DuplexPluginFactory {
return LanTcpPlugin.ID; return LanTcpPlugin.ID;
} }
public int getMaxLatency() {
return MAX_LATENCY;
}
public DuplexPlugin createPlugin(DuplexPluginCallback callback) { public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
MAX_POLLING_INTERVAL, BACKOFF_BASE); MAX_POLLING_INTERVAL, BACKOFF_BASE);

View File

@@ -1,16 +1,16 @@
package org.briarproject.plugins.tcp; package org.briarproject.plugins.tcp;
import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.Socket; import java.net.Socket;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
class TcpTransportConnection implements DuplexTransportConnection { class TcpTransportConnection implements DuplexTransportConnection {
private final Plugin plugin; private final Plugin plugin;
@@ -38,10 +38,6 @@ class TcpTransportConnection implements DuplexTransportConnection {
private class Reader implements TransportConnectionReader { private class Reader implements TransportConnectionReader {
public long getMaxLatency() {
return plugin.getMaxLatency();
}
public InputStream getInputStream() throws IOException { public InputStream getInputStream() throws IOException {
return socket.getInputStream(); return socket.getInputStream();
} }

View File

@@ -33,6 +33,10 @@ public class WanTcpPluginFactory implements DuplexPluginFactory {
return WanTcpPlugin.ID; return WanTcpPlugin.ID;
} }
public int getMaxLatency() {
return MAX_LATENCY;
}
public DuplexPlugin createPlugin(DuplexPluginCallback callback) { public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
MAX_POLLING_INTERVAL, BACKOFF_BASE); MAX_POLLING_INTERVAL, BACKOFF_BASE);

View File

@@ -1,6 +1,5 @@
package org.briarproject.sync; package org.briarproject.sync;
import org.briarproject.api.TransportId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
@@ -15,7 +14,6 @@ import org.briarproject.api.event.MessageSharedEvent;
import org.briarproject.api.event.MessageToAckEvent; import org.briarproject.api.event.MessageToAckEvent;
import org.briarproject.api.event.MessageToRequestEvent; import org.briarproject.api.event.MessageToRequestEvent;
import org.briarproject.api.event.ShutdownEvent; import org.briarproject.api.event.ShutdownEvent;
import org.briarproject.api.event.TransportRemovedEvent;
import org.briarproject.api.sync.Ack; import org.briarproject.api.sync.Ack;
import org.briarproject.api.sync.Offer; import org.briarproject.api.sync.Offer;
import org.briarproject.api.sync.PacketWriter; import org.briarproject.api.sync.PacketWriter;
@@ -59,7 +57,6 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
private final EventBus eventBus; private final EventBus eventBus;
private final Clock clock; private final Clock clock;
private final ContactId contactId; private final ContactId contactId;
private final TransportId transportId;
private final int maxLatency, maxIdleTime; private final int maxLatency, maxIdleTime;
private final PacketWriter packetWriter; private final PacketWriter packetWriter;
private final BlockingQueue<ThrowingRunnable<IOException>> writerTasks; private final BlockingQueue<ThrowingRunnable<IOException>> writerTasks;
@@ -67,15 +64,13 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
private volatile boolean interrupted = false; private volatile boolean interrupted = false;
DuplexOutgoingSession(DatabaseComponent db, Executor dbExecutor, DuplexOutgoingSession(DatabaseComponent db, Executor dbExecutor,
EventBus eventBus, Clock clock, ContactId contactId, EventBus eventBus, Clock clock, ContactId contactId, int maxLatency,
TransportId transportId, int maxLatency, int maxIdleTime, int maxIdleTime, PacketWriter packetWriter) {
PacketWriter packetWriter) {
this.db = db; this.db = db;
this.dbExecutor = dbExecutor; this.dbExecutor = dbExecutor;
this.eventBus = eventBus; this.eventBus = eventBus;
this.clock = clock; this.clock = clock;
this.contactId = contactId; this.contactId = contactId;
this.transportId = transportId;
this.maxLatency = maxLatency; this.maxLatency = maxLatency;
this.maxIdleTime = maxIdleTime; this.maxIdleTime = maxIdleTime;
this.packetWriter = packetWriter; this.packetWriter = packetWriter;
@@ -167,9 +162,6 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
dbExecutor.execute(new GenerateRequest()); dbExecutor.execute(new GenerateRequest());
} else if (e instanceof ShutdownEvent) { } else if (e instanceof ShutdownEvent) {
interrupt(); interrupt();
} else if (e instanceof TransportRemovedEvent) {
TransportRemovedEvent t = (TransportRemovedEvent) e;
if (t.getTransportId().equals(transportId)) interrupt();
} }
} }

View File

@@ -1,7 +1,6 @@
package org.briarproject.sync; package org.briarproject.sync;
import org.briarproject.api.FormatException; import org.briarproject.api.FormatException;
import org.briarproject.api.TransportId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
@@ -11,7 +10,6 @@ import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener; import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.ShutdownEvent; import org.briarproject.api.event.ShutdownEvent;
import org.briarproject.api.event.TransportRemovedEvent;
import org.briarproject.api.sync.Ack; import org.briarproject.api.sync.Ack;
import org.briarproject.api.sync.Message; import org.briarproject.api.sync.Message;
import org.briarproject.api.sync.Offer; import org.briarproject.api.sync.Offer;
@@ -37,19 +35,17 @@ class IncomingSession implements SyncSession, EventListener {
private final Executor dbExecutor; private final Executor dbExecutor;
private final EventBus eventBus; private final EventBus eventBus;
private final ContactId contactId; private final ContactId contactId;
private final TransportId transportId;
private final PacketReader packetReader; private final PacketReader packetReader;
private volatile boolean interrupted = false; private volatile boolean interrupted = false;
IncomingSession(DatabaseComponent db, Executor dbExecutor, IncomingSession(DatabaseComponent db, Executor dbExecutor,
EventBus eventBus, ContactId contactId, TransportId transportId, EventBus eventBus, ContactId contactId,
PacketReader packetReader) { PacketReader packetReader) {
this.db = db; this.db = db;
this.dbExecutor = dbExecutor; this.dbExecutor = dbExecutor;
this.eventBus = eventBus; this.eventBus = eventBus;
this.contactId = contactId; this.contactId = contactId;
this.transportId = transportId;
this.packetReader = packetReader; this.packetReader = packetReader;
} }
@@ -90,9 +86,6 @@ class IncomingSession implements SyncSession, EventListener {
if (c.getContactId().equals(contactId)) interrupt(); if (c.getContactId().equals(contactId)) interrupt();
} else if (e instanceof ShutdownEvent) { } else if (e instanceof ShutdownEvent) {
interrupt(); interrupt();
} else if (e instanceof TransportRemovedEvent) {
TransportRemovedEvent t = (TransportRemovedEvent) e;
if (t.getTransportId().equals(transportId)) interrupt();
} }
} }

View File

@@ -1,6 +1,5 @@
package org.briarproject.sync; package org.briarproject.sync;
import org.briarproject.api.TransportId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
@@ -10,7 +9,6 @@ import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener; import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.ShutdownEvent; import org.briarproject.api.event.ShutdownEvent;
import org.briarproject.api.event.TransportRemovedEvent;
import org.briarproject.api.sync.Ack; import org.briarproject.api.sync.Ack;
import org.briarproject.api.sync.PacketWriter; import org.briarproject.api.sync.PacketWriter;
import org.briarproject.api.sync.SyncSession; import org.briarproject.api.sync.SyncSession;
@@ -48,7 +46,6 @@ class SimplexOutgoingSession implements SyncSession, EventListener {
private final Executor dbExecutor; private final Executor dbExecutor;
private final EventBus eventBus; private final EventBus eventBus;
private final ContactId contactId; private final ContactId contactId;
private final TransportId transportId;
private final int maxLatency; private final int maxLatency;
private final PacketWriter packetWriter; private final PacketWriter packetWriter;
private final AtomicInteger outstandingQueries; private final AtomicInteger outstandingQueries;
@@ -57,13 +54,12 @@ class SimplexOutgoingSession implements SyncSession, EventListener {
private volatile boolean interrupted = false; private volatile boolean interrupted = false;
SimplexOutgoingSession(DatabaseComponent db, Executor dbExecutor, SimplexOutgoingSession(DatabaseComponent db, Executor dbExecutor,
EventBus eventBus, ContactId contactId, TransportId transportId, EventBus eventBus, ContactId contactId,
int maxLatency, PacketWriter packetWriter) { int maxLatency, PacketWriter packetWriter) {
this.db = db; this.db = db;
this.dbExecutor = dbExecutor; this.dbExecutor = dbExecutor;
this.eventBus = eventBus; this.eventBus = eventBus;
this.contactId = contactId; this.contactId = contactId;
this.transportId = transportId;
this.maxLatency = maxLatency; this.maxLatency = maxLatency;
this.packetWriter = packetWriter; this.packetWriter = packetWriter;
outstandingQueries = new AtomicInteger(2); // One per type of packet outstandingQueries = new AtomicInteger(2); // One per type of packet
@@ -108,9 +104,6 @@ class SimplexOutgoingSession implements SyncSession, EventListener {
if (c.getContactId().equals(contactId)) interrupt(); if (c.getContactId().equals(contactId)) interrupt();
} else if (e instanceof ShutdownEvent) { } else if (e instanceof ShutdownEvent) {
interrupt(); interrupt();
} else if (e instanceof TransportRemovedEvent) {
TransportRemovedEvent t = (TransportRemovedEvent) e;
if (t.getTransportId().equals(transportId)) interrupt();
} }
} }

View File

@@ -1,6 +1,5 @@
package org.briarproject.sync; package org.briarproject.sync;
import org.briarproject.api.TransportId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DatabaseExecutor;
@@ -41,24 +40,22 @@ class SyncSessionFactoryImpl implements SyncSessionFactory {
this.packetWriterFactory = packetWriterFactory; this.packetWriterFactory = packetWriterFactory;
} }
public SyncSession createIncomingSession(ContactId c, TransportId t, public SyncSession createIncomingSession(ContactId c, InputStream in) {
InputStream in) {
PacketReader packetReader = packetReaderFactory.createPacketReader(in); PacketReader packetReader = packetReaderFactory.createPacketReader(in);
return new IncomingSession(db, dbExecutor, eventBus, c, t, return new IncomingSession(db, dbExecutor, eventBus, c, packetReader);
packetReader);
} }
public SyncSession createSimplexOutgoingSession(ContactId c, TransportId t, public SyncSession createSimplexOutgoingSession(ContactId c,
int maxLatency, OutputStream out) { int maxLatency, OutputStream out) {
PacketWriter packetWriter = packetWriterFactory.createPacketWriter(out); PacketWriter packetWriter = packetWriterFactory.createPacketWriter(out);
return new SimplexOutgoingSession(db, dbExecutor, eventBus, c, t, return new SimplexOutgoingSession(db, dbExecutor, eventBus, c,
maxLatency, packetWriter); maxLatency, packetWriter);
} }
public SyncSession createDuplexOutgoingSession(ContactId c, TransportId t, public SyncSession createDuplexOutgoingSession(ContactId c, int maxLatency,
int maxLatency, int maxIdleTime, OutputStream out) { int maxIdleTime, OutputStream out) {
PacketWriter packetWriter = packetWriterFactory.createPacketWriter(out); PacketWriter packetWriter = packetWriterFactory.createPacketWriter(out);
return new DuplexOutgoingSession(db, dbExecutor, eventBus, clock, c, t, return new DuplexOutgoingSession(db, dbExecutor, eventBus, clock, c,
maxLatency, maxIdleTime, packetWriter); maxLatency, maxIdleTime, packetWriter);
} }
} }

View File

@@ -13,15 +13,17 @@ import org.briarproject.api.event.ContactRemovedEvent;
import org.briarproject.api.event.ContactStatusChangedEvent; import org.briarproject.api.event.ContactStatusChangedEvent;
import org.briarproject.api.event.Event; import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventListener; import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.TransportAddedEvent;
import org.briarproject.api.event.TransportRemovedEvent;
import org.briarproject.api.lifecycle.Service; import org.briarproject.api.lifecycle.Service;
import org.briarproject.api.plugins.PluginConfig;
import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
import org.briarproject.api.plugins.simplex.SimplexPluginFactory;
import org.briarproject.api.system.Clock; import org.briarproject.api.system.Clock;
import org.briarproject.api.system.Timer; import org.briarproject.api.system.Timer;
import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.KeyManager;
import org.briarproject.api.transport.StreamContext; import org.briarproject.api.transport.StreamContext;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@@ -40,6 +42,7 @@ class KeyManagerImpl implements KeyManager, Service, EventListener {
private final DatabaseComponent db; private final DatabaseComponent db;
private final CryptoComponent crypto; private final CryptoComponent crypto;
private final ExecutorService dbExecutor; private final ExecutorService dbExecutor;
private final PluginConfig pluginConfig;
private final Timer timer; private final Timer timer;
private final Clock clock; private final Clock clock;
private final Map<ContactId, Boolean> activeContacts; private final Map<ContactId, Boolean> activeContacts;
@@ -47,11 +50,12 @@ class KeyManagerImpl implements KeyManager, Service, EventListener {
@Inject @Inject
KeyManagerImpl(DatabaseComponent db, CryptoComponent crypto, KeyManagerImpl(DatabaseComponent db, CryptoComponent crypto,
@DatabaseExecutor ExecutorService dbExecutor, Timer timer, @DatabaseExecutor ExecutorService dbExecutor,
Clock clock) { PluginConfig pluginConfig, Timer timer, Clock clock) {
this.db = db; this.db = db;
this.crypto = crypto; this.crypto = crypto;
this.dbExecutor = dbExecutor; this.dbExecutor = dbExecutor;
this.pluginConfig = pluginConfig;
this.timer = timer; this.timer = timer;
this.clock = clock; this.clock = clock;
// Use a ConcurrentHashMap as a thread-safe set // Use a ConcurrentHashMap as a thread-safe set
@@ -61,21 +65,31 @@ class KeyManagerImpl implements KeyManager, Service, EventListener {
@Override @Override
public boolean start() { public boolean start() {
Map<TransportId, Integer> latencies =
new HashMap<TransportId, Integer>();
for (SimplexPluginFactory f : pluginConfig.getSimplexFactories())
latencies.put(f.getId(), f.getMaxLatency());
for (DuplexPluginFactory f : pluginConfig.getDuplexFactories())
latencies.put(f.getId(), f.getMaxLatency());
try { try {
Collection<Contact> contacts; Collection<Contact> contacts;
Map<TransportId, Integer> latencies;
Transaction txn = db.startTransaction(); Transaction txn = db.startTransaction();
try { try {
contacts = db.getContacts(txn); contacts = db.getContacts(txn);
latencies = db.getTransportLatencies(txn); for (Entry<TransportId, Integer> e : latencies.entrySet())
db.addTransport(txn, e.getKey(), e.getValue());
txn.setComplete(); txn.setComplete();
} finally { } finally {
db.endTransaction(txn); db.endTransaction(txn);
} }
for (Contact c : contacts) for (Contact c : contacts)
if (c.isActive()) activeContacts.put(c.getId(), true); if (c.isActive()) activeContacts.put(c.getId(), true);
for (Entry<TransportId, Integer> e : latencies.entrySet()) for (Entry<TransportId, Integer> e : latencies.entrySet()) {
addTransport(e.getKey(), e.getValue()); TransportKeyManager m = new TransportKeyManager(db, crypto,
timer, clock, e.getKey(), e.getValue());
managers.put(e.getKey(), m);
m.start();
}
} catch (DbException e) { } catch (DbException e) {
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
return false; return false;
@@ -125,12 +139,7 @@ class KeyManagerImpl implements KeyManager, Service, EventListener {
} }
public void eventOccurred(Event e) { public void eventOccurred(Event e) {
if (e instanceof TransportAddedEvent) { if (e instanceof ContactRemovedEvent) {
TransportAddedEvent t = (TransportAddedEvent) e;
addTransport(t.getTransportId(), t.getMaxLatency());
} else if (e instanceof TransportRemovedEvent) {
removeTransport(((TransportRemovedEvent) e).getTransportId());
} else if (e instanceof ContactRemovedEvent) {
removeContact(((ContactRemovedEvent) e).getContactId()); removeContact(((ContactRemovedEvent) e).getContactId());
} else if (e instanceof ContactStatusChangedEvent) { } else if (e instanceof ContactStatusChangedEvent) {
ContactStatusChangedEvent c = (ContactStatusChangedEvent) e; ContactStatusChangedEvent c = (ContactStatusChangedEvent) e;
@@ -139,21 +148,6 @@ class KeyManagerImpl implements KeyManager, Service, EventListener {
} }
} }
private void addTransport(final TransportId t, final int maxLatency) {
dbExecutor.execute(new Runnable() {
public void run() {
TransportKeyManager m = new TransportKeyManager(db, crypto,
timer, clock, t, maxLatency);
// Don't add transport twice if event is received during startup
if (managers.putIfAbsent(t, m) == null) m.start();
}
});
}
private void removeTransport(TransportId t) {
managers.remove(t);
}
private void removeContact(final ContactId c) { private void removeContact(final ContactId c) {
activeContacts.remove(c); activeContacts.remove(c);
dbExecutor.execute(new Runnable() { dbExecutor.execute(new Runnable() {

View File

@@ -1,10 +1,6 @@
package org.briarproject.lifecycle; package org.briarproject.lifecycle;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.lifecycle.ShutdownManager; import org.briarproject.api.lifecycle.ShutdownManager;
import org.briarproject.api.system.Clock;
import org.briarproject.util.OsUtils; import org.briarproject.util.OsUtils;
import javax.inject.Singleton; import javax.inject.Singleton;
@@ -15,22 +11,10 @@ import dagger.Provides;
@Module @Module
public class DesktopLifecycleModule extends LifecycleModule { public class DesktopLifecycleModule extends LifecycleModule {
@Provides
@Singleton
LifecycleManager provideLifecycleManager(Clock clock, DatabaseComponent db,
EventBus eventBus) {
return new LifecycleManagerImpl(clock, db, eventBus);
}
@Provides @Provides
@Singleton @Singleton
ShutdownManager provideDesktopShutdownManager() { ShutdownManager provideDesktopShutdownManager() {
if (OsUtils.isWindows()) { if (OsUtils.isWindows()) return new WindowsShutdownManagerImpl();
return new WindowsShutdownManagerImpl(); else return new ShutdownManagerImpl();
}
else {
return new ShutdownManagerImpl();
}
} }
} }

View File

@@ -32,6 +32,10 @@ public class BluetoothPluginFactory implements DuplexPluginFactory {
return BluetoothPlugin.ID; return BluetoothPlugin.ID;
} }
public int getMaxLatency() {
return MAX_LATENCY;
}
public DuplexPlugin createPlugin(DuplexPluginCallback callback) { public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
MAX_POLLING_INTERVAL, BACKOFF_BASE); MAX_POLLING_INTERVAL, BACKOFF_BASE);

View File

@@ -1,5 +1,10 @@
package org.briarproject.plugins.bluetooth; package org.briarproject.plugins.bluetooth;
import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@@ -7,11 +12,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import javax.microedition.io.StreamConnection; import javax.microedition.io.StreamConnection;
import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.TransportConnectionReader;
import org.briarproject.api.plugins.TransportConnectionWriter;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
class BluetoothTransportConnection implements DuplexTransportConnection { class BluetoothTransportConnection implements DuplexTransportConnection {
private final Plugin plugin; private final Plugin plugin;
@@ -39,10 +39,6 @@ class BluetoothTransportConnection implements DuplexTransportConnection {
private class Reader implements TransportConnectionReader { private class Reader implements TransportConnectionReader {
public long getMaxLatency() {
return plugin.getMaxLatency();
}
public InputStream getInputStream() throws IOException { public InputStream getInputStream() throws IOException {
return stream.openInputStream(); return stream.openInputStream();
} }

View File

@@ -24,6 +24,10 @@ public class RemovableDrivePluginFactory implements SimplexPluginFactory {
return RemovableDrivePlugin.ID; return RemovableDrivePlugin.ID;
} }
public int getMaxLatency() {
return MAX_LATENCY;
}
public SimplexPlugin createPlugin(SimplexPluginCallback callback) { public SimplexPlugin createPlugin(SimplexPluginCallback callback) {
RemovableDriveFinder finder; RemovableDriveFinder finder;
RemovableDriveMonitor monitor; RemovableDriveMonitor monitor;

View File

@@ -194,10 +194,6 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
private class Reader implements TransportConnectionReader { private class Reader implements TransportConnectionReader {
public long getMaxLatency() {
return ModemPlugin.this.getMaxLatency();
}
public InputStream getInputStream() throws IOException { public InputStream getInputStream() throws IOException {
return modem.getInputStream(); return modem.getInputStream();
} }

View File

@@ -1,7 +1,5 @@
package org.briarproject.plugins.modem; package org.briarproject.plugins.modem;
import java.util.concurrent.Executor;
import org.briarproject.api.TransportId; import org.briarproject.api.TransportId;
import org.briarproject.api.plugins.duplex.DuplexPlugin; import org.briarproject.api.plugins.duplex.DuplexPlugin;
import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
@@ -9,6 +7,8 @@ import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
import org.briarproject.api.reliability.ReliabilityLayerFactory; import org.briarproject.api.reliability.ReliabilityLayerFactory;
import org.briarproject.util.StringUtils; import org.briarproject.util.StringUtils;
import java.util.concurrent.Executor;
public class ModemPluginFactory implements DuplexPluginFactory { public class ModemPluginFactory implements DuplexPluginFactory {
private static final int MAX_LATENCY = 30 * 1000; // 30 seconds private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
@@ -26,6 +26,10 @@ public class ModemPluginFactory implements DuplexPluginFactory {
return ModemPlugin.ID; return ModemPlugin.ID;
} }
public int getMaxLatency() {
return MAX_LATENCY;
}
public DuplexPlugin createPlugin(DuplexPluginCallback callback) { public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
// This plugin is not enabled by default // This plugin is not enabled by default
String enabled = callback.getSettings().get("enabled"); String enabled = callback.getSettings().get("enabled");

View File

@@ -0,0 +1,55 @@
package org.briarproject;
import org.briarproject.api.TransportId;
import org.briarproject.api.plugins.PluginConfig;
import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
import org.briarproject.api.plugins.simplex.SimplexPlugin;
import org.briarproject.api.plugins.simplex.SimplexPluginCallback;
import org.briarproject.api.plugins.simplex.SimplexPluginFactory;
import java.util.Collection;
import java.util.Collections;
import dagger.Module;
import dagger.Provides;
@Module
public class TestPluginsModule {
public static final TransportId TRANSPORT_ID = new TransportId("id");
public static final int MAX_LATENCY = 2 * 60 * 1000; // 2 minutes
private final SimplexPluginFactory simplex = new SimplexPluginFactory() {
@Override
public TransportId getId() {
return TRANSPORT_ID;
}
@Override
public int getMaxLatency() {
return MAX_LATENCY;
}
@Override
public SimplexPlugin createPlugin(SimplexPluginCallback callback) {
return null;
}
};
@Provides
PluginConfig providePluginConfig() {
return new PluginConfig() {
@Override
public Collection<DuplexPluginFactory> getDuplexFactories() {
return Collections.emptyList();
}
@Override
public Collection<SimplexPluginFactory> getSimplexFactories() {
return Collections.singletonList(simplex);
}
};
}
}

View File

@@ -2,8 +2,6 @@ package org.briarproject.plugins;
import org.briarproject.BriarTestCase; import org.briarproject.BriarTestCase;
import org.briarproject.api.TransportId; import org.briarproject.api.TransportId;
import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.Transaction;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.plugins.ConnectionManager; import org.briarproject.api.plugins.ConnectionManager;
import org.briarproject.api.plugins.PluginConfig; import org.briarproject.api.plugins.PluginConfig;
@@ -15,9 +13,7 @@ import org.briarproject.api.plugins.simplex.SimplexPluginCallback;
import org.briarproject.api.plugins.simplex.SimplexPluginFactory; import org.briarproject.api.plugins.simplex.SimplexPluginFactory;
import org.briarproject.api.properties.TransportPropertyManager; import org.briarproject.api.properties.TransportPropertyManager;
import org.briarproject.api.settings.SettingsManager; import org.briarproject.api.settings.SettingsManager;
import org.briarproject.api.system.Clock;
import org.briarproject.api.ui.UiCallback; import org.briarproject.api.ui.UiCallback;
import org.briarproject.system.SystemClock;
import org.jmock.Expectations; import org.jmock.Expectations;
import org.jmock.Mockery; import org.jmock.Mockery;
import org.jmock.lib.concurrent.Synchroniser; import org.jmock.lib.concurrent.Synchroniser;
@@ -33,14 +29,12 @@ public class PluginManagerImplTest extends BriarTestCase {
@Test @Test
public void testStartAndStop() throws Exception { public void testStartAndStop() throws Exception {
Clock clock = new SystemClock();
Mockery context = new Mockery() {{ Mockery context = new Mockery() {{
setThreadingPolicy(new Synchroniser()); setThreadingPolicy(new Synchroniser());
}}; }};
final Executor ioExecutor = Executors.newSingleThreadExecutor(); final Executor ioExecutor = Executors.newSingleThreadExecutor();
final EventBus eventBus = context.mock(EventBus.class); final EventBus eventBus = context.mock(EventBus.class);
final PluginConfig pluginConfig = context.mock(PluginConfig.class); final PluginConfig pluginConfig = context.mock(PluginConfig.class);
final DatabaseComponent db = context.mock(DatabaseComponent.class);
final Poller poller = context.mock(Poller.class); final Poller poller = context.mock(Poller.class);
final ConnectionManager connectionManager = final ConnectionManager connectionManager =
context.mock(ConnectionManager.class); context.mock(ConnectionManager.class);
@@ -49,30 +43,27 @@ public class PluginManagerImplTest extends BriarTestCase {
final TransportPropertyManager transportPropertyManager = final TransportPropertyManager transportPropertyManager =
context.mock(TransportPropertyManager.class); context.mock(TransportPropertyManager.class);
final UiCallback uiCallback = context.mock(UiCallback.class); final UiCallback uiCallback = context.mock(UiCallback.class);
// Two simplex plugin factories: both create plugins, one fails to start // Two simplex plugin factories: both create plugins, one fails to start
final SimplexPluginFactory simplexFactory = final SimplexPluginFactory simplexFactory =
context.mock(SimplexPluginFactory.class); context.mock(SimplexPluginFactory.class);
final SimplexPlugin simplexPlugin = context.mock(SimplexPlugin.class); final SimplexPlugin simplexPlugin = context.mock(SimplexPlugin.class);
final TransportId simplexId = new TransportId("simplex"); final TransportId simplexId = new TransportId("simplex");
final int simplexLatency = 12345;
final Transaction simplexTxn = new Transaction(null);
final SimplexPluginFactory simplexFailFactory = final SimplexPluginFactory simplexFailFactory =
context.mock(SimplexPluginFactory.class, "simplexFailFactory"); context.mock(SimplexPluginFactory.class, "simplexFailFactory");
final SimplexPlugin simplexFailPlugin = final SimplexPlugin simplexFailPlugin =
context.mock(SimplexPlugin.class, "simplexFailPlugin"); context.mock(SimplexPlugin.class, "simplexFailPlugin");
final TransportId simplexFailId = new TransportId("simplex1"); final TransportId simplexFailId = new TransportId("simplex1");
final int simplexFailLatency = 23456;
final Transaction simplexFailTxn = new Transaction(null);
// Two duplex plugin factories: one creates a plugin, the other fails // Two duplex plugin factories: one creates a plugin, the other fails
final DuplexPluginFactory duplexFactory = final DuplexPluginFactory duplexFactory =
context.mock(DuplexPluginFactory.class); context.mock(DuplexPluginFactory.class);
final DuplexPlugin duplexPlugin = context.mock(DuplexPlugin.class); final DuplexPlugin duplexPlugin = context.mock(DuplexPlugin.class);
final TransportId duplexId = new TransportId("duplex"); final TransportId duplexId = new TransportId("duplex");
final int duplexLatency = 34567;
final Transaction duplexTxn = new Transaction(null);
final DuplexPluginFactory duplexFailFactory = final DuplexPluginFactory duplexFailFactory =
context.mock(DuplexPluginFactory.class, "duplexFailFactory"); context.mock(DuplexPluginFactory.class, "duplexFailFactory");
final TransportId duplexFailId = new TransportId("duplex1"); final TransportId duplexFailId = new TransportId("duplex1");
context.checking(new Expectations() {{ context.checking(new Expectations() {{
// First simplex plugin // First simplex plugin
oneOf(pluginConfig).getSimplexFactories(); oneOf(pluginConfig).getSimplexFactories();
@@ -83,12 +74,6 @@ public class PluginManagerImplTest extends BriarTestCase {
oneOf(simplexFactory).createPlugin(with(any( oneOf(simplexFactory).createPlugin(with(any(
SimplexPluginCallback.class))); SimplexPluginCallback.class)));
will(returnValue(simplexPlugin)); // Created will(returnValue(simplexPlugin)); // Created
oneOf(simplexPlugin).getMaxLatency();
will(returnValue(simplexLatency));
oneOf(db).startTransaction();
will(returnValue(simplexTxn));
oneOf(db).addTransport(simplexTxn, simplexId, simplexLatency);
oneOf(db).endTransaction(simplexTxn);
oneOf(simplexPlugin).start(); oneOf(simplexPlugin).start();
will(returnValue(true)); // Started will(returnValue(true)); // Started
oneOf(simplexPlugin).shouldPoll(); oneOf(simplexPlugin).shouldPoll();
@@ -100,13 +85,6 @@ public class PluginManagerImplTest extends BriarTestCase {
oneOf(simplexFailFactory).createPlugin(with(any( oneOf(simplexFailFactory).createPlugin(with(any(
SimplexPluginCallback.class))); SimplexPluginCallback.class)));
will(returnValue(simplexFailPlugin)); // Created will(returnValue(simplexFailPlugin)); // Created
oneOf(simplexFailPlugin).getMaxLatency();
will(returnValue(simplexFailLatency));
oneOf(db).startTransaction();
will(returnValue(simplexFailTxn));
oneOf(db).addTransport(simplexFailTxn, simplexFailId,
simplexFailLatency);
oneOf(db).endTransaction(simplexFailTxn);
oneOf(simplexFailPlugin).start(); oneOf(simplexFailPlugin).start();
will(returnValue(false)); // Failed to start will(returnValue(false)); // Failed to start
// First duplex plugin // First duplex plugin
@@ -117,12 +95,6 @@ public class PluginManagerImplTest extends BriarTestCase {
oneOf(duplexFactory).createPlugin(with(any( oneOf(duplexFactory).createPlugin(with(any(
DuplexPluginCallback.class))); DuplexPluginCallback.class)));
will(returnValue(duplexPlugin)); // Created will(returnValue(duplexPlugin)); // Created
oneOf(duplexPlugin).getMaxLatency();
will(returnValue(duplexLatency));
oneOf(db).startTransaction();
will(returnValue(duplexTxn));
oneOf(db).addTransport(duplexTxn, duplexId, duplexLatency);
oneOf(db).endTransaction(duplexTxn);
oneOf(duplexPlugin).start(); oneOf(duplexPlugin).start();
will(returnValue(true)); // Started will(returnValue(true)); // Started
oneOf(duplexPlugin).shouldPoll(); oneOf(duplexPlugin).shouldPoll();
@@ -139,13 +111,15 @@ public class PluginManagerImplTest extends BriarTestCase {
oneOf(simplexPlugin).stop(); oneOf(simplexPlugin).stop();
oneOf(duplexPlugin).stop(); oneOf(duplexPlugin).stop();
}}); }});
PluginManagerImpl p = new PluginManagerImpl(ioExecutor, eventBus, PluginManagerImpl p = new PluginManagerImpl(ioExecutor, eventBus,
pluginConfig, clock, db, poller, connectionManager, pluginConfig, poller, connectionManager, settingsManager,
settingsManager, transportPropertyManager, uiCallback); transportPropertyManager, uiCallback);
// Two plugins should be started and stopped // Two plugins should be started and stopped
assertTrue(p.start()); assertTrue(p.start());
assertTrue(p.stop()); assertTrue(p.stop());
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
} }

View File

@@ -3,7 +3,6 @@ package org.briarproject.sync;
import org.briarproject.BriarTestCase; import org.briarproject.BriarTestCase;
import org.briarproject.ImmediateExecutor; import org.briarproject.ImmediateExecutor;
import org.briarproject.TestUtils; import org.briarproject.TestUtils;
import org.briarproject.api.TransportId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.Transaction; import org.briarproject.api.db.Transaction;
@@ -28,7 +27,6 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
private final Executor dbExecutor; private final Executor dbExecutor;
private final EventBus eventBus; private final EventBus eventBus;
private final ContactId contactId; private final ContactId contactId;
private final TransportId transportId;
private final MessageId messageId; private final MessageId messageId;
private final int maxLatency; private final int maxLatency;
private final PacketWriter packetWriter; private final PacketWriter packetWriter;
@@ -40,7 +38,6 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
eventBus = context.mock(EventBus.class); eventBus = context.mock(EventBus.class);
packetWriter = context.mock(PacketWriter.class); packetWriter = context.mock(PacketWriter.class);
contactId = new ContactId(234); contactId = new ContactId(234);
transportId = new TransportId("id");
messageId = new MessageId(TestUtils.getRandomId()); messageId = new MessageId(TestUtils.getRandomId());
maxLatency = Integer.MAX_VALUE; maxLatency = Integer.MAX_VALUE;
} }
@@ -48,10 +45,10 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
@Test @Test
public void testNothingToSend() throws Exception { public void testNothingToSend() throws Exception {
final SimplexOutgoingSession session = new SimplexOutgoingSession(db, final SimplexOutgoingSession session = new SimplexOutgoingSession(db,
dbExecutor, eventBus, contactId, transportId, maxLatency, dbExecutor, eventBus, contactId, maxLatency, packetWriter);
packetWriter);
final Transaction noAckTxn = new Transaction(null); final Transaction noAckTxn = new Transaction(null);
final Transaction noMsgTxn = new Transaction(null); final Transaction noMsgTxn = new Transaction(null);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
// Add listener // Add listener
oneOf(eventBus).addListener(session); oneOf(eventBus).addListener(session);
@@ -73,7 +70,9 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
// Remove listener // Remove listener
oneOf(eventBus).removeListener(session); oneOf(eventBus).removeListener(session);
}}); }});
session.run(); session.run();
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
@@ -82,12 +81,12 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
final Ack ack = new Ack(Collections.singletonList(messageId)); final Ack ack = new Ack(Collections.singletonList(messageId));
final byte[] raw = new byte[1234]; final byte[] raw = new byte[1234];
final SimplexOutgoingSession session = new SimplexOutgoingSession(db, final SimplexOutgoingSession session = new SimplexOutgoingSession(db,
dbExecutor, eventBus, contactId, transportId, maxLatency, dbExecutor, eventBus, contactId, maxLatency, packetWriter);
packetWriter);
final Transaction ackTxn = new Transaction(null); final Transaction ackTxn = new Transaction(null);
final Transaction noAckTxn = new Transaction(null); final Transaction noAckTxn = new Transaction(null);
final Transaction msgTxn = new Transaction(null); final Transaction msgTxn = new Transaction(null);
final Transaction noMsgTxn = new Transaction(null); final Transaction noMsgTxn = new Transaction(null);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
// Add listener // Add listener
oneOf(eventBus).addListener(session); oneOf(eventBus).addListener(session);
@@ -124,7 +123,9 @@ public class SimplexOutgoingSessionTest extends BriarTestCase {
// Remove listener // Remove listener
oneOf(eventBus).removeListener(session); oneOf(eventBus).removeListener(session);
}}); }});
session.run(); session.run();
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
} }