mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-21 07:09:56 +01:00
Add transports to DB during startup. #269
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 .
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
55
briar-tests/src/org/briarproject/TestPluginsModule.java
Normal file
55
briar-tests/src/org/briarproject/TestPluginsModule.java
Normal 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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user