From f52186ac8cf42d7c564abde099f0848419e37c77 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 31 Oct 2016 18:33:06 -0200 Subject: [PATCH 1/2] Add unit tests for KeyManagerImpl and create TransportKeyManager interface and a factory for that. --- .../api/transport/TransportKeyManager.java | 23 +++ .../transport/TransportKeyManagerFactory.java | 10 + .../transport/KeyManagerImpl.java | 26 +-- .../TransportKeyManagerFactoryImpl.java | 43 ++++ ...ager.java => TransportKeyManagerImpl.java} | 17 +- .../transport/TransportModule.java | 7 + .../transport/KeyManagerImplTest.java | 186 +++++++++++++++++- .../transport/TransportKeyManagerTest.java | 25 ++- 8 files changed, 301 insertions(+), 36 deletions(-) create mode 100644 briar-api/src/org/briarproject/api/transport/TransportKeyManager.java create mode 100644 briar-api/src/org/briarproject/api/transport/TransportKeyManagerFactory.java create mode 100644 briar-core/src/org/briarproject/transport/TransportKeyManagerFactoryImpl.java rename briar-core/src/org/briarproject/transport/{TransportKeyManager.java => TransportKeyManagerImpl.java} (94%) diff --git a/briar-api/src/org/briarproject/api/transport/TransportKeyManager.java b/briar-api/src/org/briarproject/api/transport/TransportKeyManager.java new file mode 100644 index 000000000..dc3e22f9f --- /dev/null +++ b/briar-api/src/org/briarproject/api/transport/TransportKeyManager.java @@ -0,0 +1,23 @@ +package org.briarproject.api.transport; + +import org.briarproject.api.contact.ContactId; +import org.briarproject.api.crypto.SecretKey; +import org.briarproject.api.db.DbException; +import org.briarproject.api.db.Transaction; + +public interface TransportKeyManager { + + void start(Transaction txn) throws DbException; + + void addContact(Transaction txn, ContactId c, SecretKey master, + long timestamp, boolean alice) throws DbException; + + void removeContact(ContactId c); + + StreamContext getStreamContext(Transaction txn, ContactId c) + throws DbException; + + StreamContext getStreamContext(Transaction txn, byte[] tag) + throws DbException; + +} diff --git a/briar-api/src/org/briarproject/api/transport/TransportKeyManagerFactory.java b/briar-api/src/org/briarproject/api/transport/TransportKeyManagerFactory.java new file mode 100644 index 000000000..1b2f3a29b --- /dev/null +++ b/briar-api/src/org/briarproject/api/transport/TransportKeyManagerFactory.java @@ -0,0 +1,10 @@ +package org.briarproject.api.transport; + +import org.briarproject.api.TransportId; + +public interface TransportKeyManagerFactory { + + TransportKeyManager createTransportKeyManager(TransportId transportId, + long maxLatency); + +} diff --git a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java index 7d75fd3b3..e372cb928 100644 --- a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java +++ b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java @@ -3,7 +3,6 @@ package org.briarproject.transport; import org.briarproject.api.TransportId; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; -import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseExecutor; @@ -18,16 +17,16 @@ import org.briarproject.api.lifecycle.ServiceException; 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.transport.KeyManager; import org.briarproject.api.transport.StreamContext; +import org.briarproject.api.transport.TransportKeyManager; +import org.briarproject.api.transport.TransportKeyManagerFactory; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; -import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; @@ -41,26 +40,21 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { Logger.getLogger(KeyManagerImpl.class.getName()); private final DatabaseComponent db; - private final CryptoComponent crypto; private final Executor dbExecutor; - private final ScheduledExecutorService scheduler; private final PluginConfig pluginConfig; - private final Clock clock; + private final TransportKeyManagerFactory transportKeyManagerFactory; private final Map activeContacts; private final ConcurrentHashMap managers; private final AtomicBoolean used = new AtomicBoolean(false); @Inject - KeyManagerImpl(DatabaseComponent db, CryptoComponent crypto, - @DatabaseExecutor Executor dbExecutor, - ScheduledExecutorService scheduler, PluginConfig pluginConfig, - Clock clock) { + KeyManagerImpl(DatabaseComponent db, @DatabaseExecutor Executor dbExecutor, + PluginConfig pluginConfig, + TransportKeyManagerFactory transportKeyManagerFactory) { this.db = db; - this.crypto = crypto; this.dbExecutor = dbExecutor; - this.scheduler = scheduler; this.pluginConfig = pluginConfig; - this.clock = clock; + this.transportKeyManagerFactory = transportKeyManagerFactory; // Use a ConcurrentHashMap as a thread-safe set activeContacts = new ConcurrentHashMap(); managers = new ConcurrentHashMap(); @@ -83,9 +77,9 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { for (Entry e : transports.entrySet()) db.addTransport(txn, e.getKey(), e.getValue()); for (Entry e : transports.entrySet()) { - TransportKeyManager m = new TransportKeyManager(db, crypto, - dbExecutor, scheduler, clock, e.getKey(), - e.getValue()); + TransportKeyManager m = transportKeyManagerFactory + .createTransportKeyManager(e.getKey(), + e.getValue()); managers.put(e.getKey(), m); m.start(txn); } diff --git a/briar-core/src/org/briarproject/transport/TransportKeyManagerFactoryImpl.java b/briar-core/src/org/briarproject/transport/TransportKeyManagerFactoryImpl.java new file mode 100644 index 000000000..4efe40856 --- /dev/null +++ b/briar-core/src/org/briarproject/transport/TransportKeyManagerFactoryImpl.java @@ -0,0 +1,43 @@ +package org.briarproject.transport; + +import org.briarproject.api.TransportId; +import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.db.DatabaseExecutor; +import org.briarproject.api.system.Clock; +import org.briarproject.api.transport.TransportKeyManager; +import org.briarproject.api.transport.TransportKeyManagerFactory; + +import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; + +import javax.inject.Inject; + +public class TransportKeyManagerFactoryImpl implements + TransportKeyManagerFactory { + + private final DatabaseComponent db; + private final CryptoComponent crypto; + private final Executor dbExecutor; + private final ScheduledExecutorService scheduler; + private final Clock clock; + + @Inject + TransportKeyManagerFactoryImpl(DatabaseComponent db, CryptoComponent crypto, + @DatabaseExecutor Executor dbExecutor, + ScheduledExecutorService scheduler, Clock clock) { + this.db = db; + this.crypto = crypto; + this.dbExecutor = dbExecutor; + this.scheduler = scheduler; + this.clock = clock; + } + + @Override + public TransportKeyManager createTransportKeyManager( + TransportId transportId, long maxLatency) { + return new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, + clock, transportId, maxLatency); + } + +} diff --git a/briar-core/src/org/briarproject/transport/TransportKeyManager.java b/briar-core/src/org/briarproject/transport/TransportKeyManagerImpl.java similarity index 94% rename from briar-core/src/org/briarproject/transport/TransportKeyManager.java rename to briar-core/src/org/briarproject/transport/TransportKeyManagerImpl.java index 4210c31ed..4565849d8 100644 --- a/briar-core/src/org/briarproject/transport/TransportKeyManager.java +++ b/briar-core/src/org/briarproject/transport/TransportKeyManagerImpl.java @@ -10,6 +10,7 @@ import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; import org.briarproject.api.system.Clock; import org.briarproject.api.transport.StreamContext; +import org.briarproject.api.transport.TransportKeyManager; import org.briarproject.api.transport.TransportKeys; import org.briarproject.transport.ReorderingWindow.Change; @@ -28,10 +29,10 @@ import static org.briarproject.api.transport.TransportConstants.MAX_CLOCK_DIFFER import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH; import static org.briarproject.util.ByteUtils.MAX_32_BIT_UNSIGNED; -class TransportKeyManager { +class TransportKeyManagerImpl implements TransportKeyManager { private static final Logger LOG = - Logger.getLogger(TransportKeyManager.class.getName()); + Logger.getLogger(TransportKeyManagerImpl.class.getName()); private final DatabaseComponent db; private final CryptoComponent crypto; @@ -47,7 +48,7 @@ class TransportKeyManager { private final Map outContexts; private final Map keys; - TransportKeyManager(DatabaseComponent db, CryptoComponent crypto, + TransportKeyManagerImpl(DatabaseComponent db, CryptoComponent crypto, Executor dbExecutor, ScheduledExecutorService scheduler, Clock clock, TransportId transportId, long maxLatency) { this.db = db; @@ -63,7 +64,7 @@ class TransportKeyManager { keys = new HashMap(); } - void start(Transaction txn) throws DbException { + public void start(Transaction txn) throws DbException { long now = clock.currentTimeMillis(); lock.lock(); try { @@ -155,7 +156,7 @@ class TransportKeyManager { }); } - void addContact(Transaction txn, ContactId c, SecretKey master, + public void addContact(Transaction txn, ContactId c, SecretKey master, long timestamp, boolean alice) throws DbException { lock.lock(); try { @@ -176,7 +177,7 @@ class TransportKeyManager { } } - void removeContact(ContactId c) { + public void removeContact(ContactId c) { lock.lock(); try { // Remove mutable state for the contact @@ -191,7 +192,7 @@ class TransportKeyManager { } } - StreamContext getStreamContext(Transaction txn, ContactId c) + public StreamContext getStreamContext(Transaction txn, ContactId c) throws DbException { lock.lock(); try { @@ -213,7 +214,7 @@ class TransportKeyManager { } } - StreamContext getStreamContext(Transaction txn, byte[] tag) + public StreamContext getStreamContext(Transaction txn, byte[] tag) throws DbException { lock.lock(); try { diff --git a/briar-core/src/org/briarproject/transport/TransportModule.java b/briar-core/src/org/briarproject/transport/TransportModule.java index 4c614ddc6..c66865bdb 100644 --- a/briar-core/src/org/briarproject/transport/TransportModule.java +++ b/briar-core/src/org/briarproject/transport/TransportModule.java @@ -7,6 +7,7 @@ import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; +import org.briarproject.api.transport.TransportKeyManagerFactory; import javax.inject.Inject; import javax.inject.Singleton; @@ -34,6 +35,12 @@ public class TransportModule { return new StreamWriterFactoryImpl(streamEncrypterFactory); } + @Provides + TransportKeyManagerFactory provideTransportKeyManagerFactory( + TransportKeyManagerFactoryImpl transportKeyManagerFactory) { + return transportKeyManagerFactory; + } + @Provides @Singleton KeyManager provideKeyManager(LifecycleManager lifecycleManager, diff --git a/briar-tests/src/org/briarproject/transport/KeyManagerImplTest.java b/briar-tests/src/org/briarproject/transport/KeyManagerImplTest.java index d55771fcf..d7ff0f0ce 100644 --- a/briar-tests/src/org/briarproject/transport/KeyManagerImplTest.java +++ b/briar-tests/src/org/briarproject/transport/KeyManagerImplTest.java @@ -1,14 +1,192 @@ package org.briarproject.transport; import org.briarproject.BriarTestCase; +import org.briarproject.api.TransportId; +import org.briarproject.api.contact.Contact; +import org.briarproject.api.contact.ContactId; +import org.briarproject.api.crypto.SecretKey; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.db.Transaction; +import org.briarproject.api.event.ContactRemovedEvent; +import org.briarproject.api.event.ContactStatusChangedEvent; +import org.briarproject.api.identity.Author; +import org.briarproject.api.identity.AuthorId; +import org.briarproject.api.plugins.PluginConfig; +import org.briarproject.api.plugins.simplex.SimplexPluginFactory; +import org.briarproject.api.transport.StreamContext; +import org.briarproject.api.transport.TransportKeyManager; +import org.briarproject.api.transport.TransportKeyManagerFactory; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.lib.concurrent.DeterministicExecutor; +import org.junit.Before; import org.junit.Test; -import static org.junit.Assert.fail; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +import static org.briarproject.TestUtils.getRandomBytes; +import static org.briarproject.TestUtils.getRandomId; +import static org.briarproject.TestUtils.getSecretKey; +import static org.junit.Assert.assertEquals; public class KeyManagerImplTest extends BriarTestCase { - @Test - public void testUnitTestsExist() { - fail(); // FIXME: Write tests + private final Mockery context = new Mockery(); + private final KeyManagerImpl keyManager; + private final DatabaseComponent db = context.mock(DatabaseComponent.class); + private final PluginConfig pluginConfig = context.mock(PluginConfig.class); + private final TransportKeyManagerFactory transportKeyManagerFactory = + context.mock(TransportKeyManagerFactory.class); + private final TransportKeyManager transportKeyManager = + context.mock(TransportKeyManager.class); + private final DeterministicExecutor executor = new DeterministicExecutor(); + private final Transaction txn = new Transaction(null, false); + private final ContactId contactId = new ContactId(42); + private final ContactId inactiveContactId = new ContactId(43); + private final TransportId transportId = new TransportId("tId"); + private final StreamContext streamContext = + new StreamContext(contactId, transportId, getSecretKey(), + getSecretKey(), 1); + private final byte[] tag = getRandomBytes(42); + + public KeyManagerImplTest() { + keyManager = new KeyManagerImpl(db, executor, pluginConfig, + transportKeyManagerFactory); } + + @Before + public void testStartService() throws Exception { + final Transaction txn = new Transaction(null, false); + AuthorId remoteAuthorId = new AuthorId(getRandomId()); + Author remoteAuthor = new Author(remoteAuthorId, "author", + getRandomBytes(42)); + AuthorId localAuthorId = new AuthorId(getRandomId()); + final Collection contacts = new ArrayList<>(); + contacts.add(new Contact(contactId, remoteAuthor, localAuthorId, true, + true)); + contacts.add(new Contact(inactiveContactId, remoteAuthor, localAuthorId, + true, false)); + final SimplexPluginFactory pluginFactory = + context.mock(SimplexPluginFactory.class); + final Collection factories = Collections + .singletonList(pluginFactory); + final int maxLatency = 1337; + + context.checking(new Expectations() {{ + oneOf(pluginConfig).getSimplexFactories(); + will(returnValue(factories)); + oneOf(pluginFactory).getId(); + will(returnValue(transportId)); + oneOf(pluginFactory).getMaxLatency(); + will(returnValue(maxLatency)); + oneOf(db).addTransport(txn, transportId, maxLatency); + oneOf(transportKeyManagerFactory) + .createTransportKeyManager(transportId, maxLatency); + will(returnValue(transportKeyManager)); + oneOf(pluginConfig).getDuplexFactories(); + oneOf(db).startTransaction(false); + will(returnValue(txn)); + oneOf(db).getContacts(txn); + will(returnValue(contacts)); + oneOf(transportKeyManager).start(txn); + oneOf(db).commitTransaction(txn); + oneOf(db).endTransaction(txn); + }}); + + keyManager.startService(); + } + + @Test + public void testAddContact() throws Exception { + final SecretKey secretKey = getSecretKey(); + final long timestamp = 42L; + final boolean alice = true; + + context.checking(new Expectations() {{ + oneOf(transportKeyManager) + .addContact(txn, contactId, secretKey, timestamp, alice); + }}); + + keyManager.addContact(txn, contactId, secretKey, timestamp, alice); + context.assertIsSatisfied(); + } + + @Test + public void testGetStreamContextForContact() throws Exception { + assertEquals(null, + keyManager.getStreamContext(inactiveContactId, transportId)); + assertEquals(null, keyManager + .getStreamContext(inactiveContactId, new TransportId("id"))); + + context.checking(new Expectations() {{ + oneOf(db).startTransaction(false); + will(returnValue(txn)); + oneOf(transportKeyManager).getStreamContext(txn, contactId); + will(returnValue(streamContext)); + oneOf(db).commitTransaction(txn); + oneOf(db).endTransaction(txn); + }}); + + assertEquals(streamContext, + keyManager.getStreamContext(contactId, transportId)); + context.assertIsSatisfied(); + } + + @Test + public void testGetStreamContextForTag() throws Exception { + assertEquals(null, keyManager + .getStreamContext(new TransportId("id"), tag)); + + context.checking(new Expectations() {{ + oneOf(db).startTransaction(false); + will(returnValue(txn)); + oneOf(transportKeyManager).getStreamContext(txn, tag); + will(returnValue(streamContext)); + oneOf(db).commitTransaction(txn); + oneOf(db).endTransaction(txn); + }}); + + assertEquals(streamContext, + keyManager.getStreamContext(transportId, tag)); + context.assertIsSatisfied(); + } + + @Test + public void testContactRemovedEvent() throws Exception { + ContactRemovedEvent event = new ContactRemovedEvent(contactId); + + context.checking(new Expectations() {{ + oneOf(transportKeyManager).removeContact(contactId); + }}); + + keyManager.eventOccurred(event); + executor.runUntilIdle(); + assertEquals(null, keyManager.getStreamContext(contactId, transportId)); + + context.assertIsSatisfied(); + } + + @Test + public void testContactStatusChangedEvent() throws Exception { + ContactStatusChangedEvent event = + new ContactStatusChangedEvent(inactiveContactId, true); + + context.checking(new Expectations() {{ + oneOf(db).startTransaction(false); + will(returnValue(txn)); + oneOf(transportKeyManager).getStreamContext(txn, inactiveContactId); + will(returnValue(streamContext)); + oneOf(db).commitTransaction(txn); + oneOf(db).endTransaction(txn); + }}); + + keyManager.eventOccurred(event); + assertEquals(streamContext, + keyManager.getStreamContext(inactiveContactId, transportId)); + + context.assertIsSatisfied(); + } + } diff --git a/briar-tests/src/org/briarproject/transport/TransportKeyManagerTest.java b/briar-tests/src/org/briarproject/transport/TransportKeyManagerTest.java index b97d1786c..d1bc128f6 100644 --- a/briar-tests/src/org/briarproject/transport/TransportKeyManagerTest.java +++ b/briar-tests/src/org/briarproject/transport/TransportKeyManagerTest.java @@ -13,6 +13,7 @@ import org.briarproject.api.system.Clock; import org.briarproject.api.transport.IncomingKeys; import org.briarproject.api.transport.OutgoingKeys; import org.briarproject.api.transport.StreamContext; +import org.briarproject.api.transport.TransportKeyManager; import org.briarproject.api.transport.TransportKeys; import org.hamcrest.Description; import org.jmock.Expectations; @@ -96,7 +97,8 @@ public class TransportKeyManagerTest extends BriarTestCase { with(rotationPeriodLength - 1), with(MILLISECONDS)); }}); - TransportKeyManager transportKeyManager = new TransportKeyManager(db, + TransportKeyManager + transportKeyManager = new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, clock, transportId, maxLatency); transportKeyManager.start(txn); @@ -138,7 +140,8 @@ public class TransportKeyManagerTest extends BriarTestCase { oneOf(db).addTransportKeys(txn, contactId, rotated); }}); - TransportKeyManager transportKeyManager = new TransportKeyManager(db, + TransportKeyManager + transportKeyManager = new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, clock, transportId, maxLatency); // The timestamp is 1 ms before the start of rotation period 1000 long timestamp = rotationPeriodLength * 1000 - 1; @@ -161,7 +164,8 @@ public class TransportKeyManagerTest extends BriarTestCase { final Transaction txn = new Transaction(null, false); - TransportKeyManager transportKeyManager = new TransportKeyManager(db, + TransportKeyManager + transportKeyManager = new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, clock, transportId, maxLatency); assertNull(transportKeyManager.getStreamContext(txn, contactId)); @@ -205,7 +209,8 @@ public class TransportKeyManagerTest extends BriarTestCase { oneOf(db).addTransportKeys(txn, contactId, transportKeys); }}); - TransportKeyManager transportKeyManager = new TransportKeyManager(db, + TransportKeyManager + transportKeyManager = new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, clock, transportId, maxLatency); // The timestamp is at the start of rotation period 1000 long timestamp = rotationPeriodLength * 1000; @@ -254,7 +259,8 @@ public class TransportKeyManagerTest extends BriarTestCase { oneOf(db).incrementStreamCounter(txn, contactId, transportId, 1000); }}); - TransportKeyManager transportKeyManager = new TransportKeyManager(db, + TransportKeyManager + transportKeyManager = new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, clock, transportId, maxLatency); // The timestamp is at the start of rotation period 1000 long timestamp = rotationPeriodLength * 1000; @@ -310,7 +316,8 @@ public class TransportKeyManagerTest extends BriarTestCase { oneOf(db).addTransportKeys(txn, contactId, transportKeys); }}); - TransportKeyManager transportKeyManager = new TransportKeyManager(db, + TransportKeyManager + transportKeyManager = new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, clock, transportId, maxLatency); // The timestamp is at the start of rotation period 1000 long timestamp = rotationPeriodLength * 1000; @@ -365,7 +372,8 @@ public class TransportKeyManagerTest extends BriarTestCase { 1, new byte[REORDERING_WINDOW_SIZE / 8]); }}); - TransportKeyManager transportKeyManager = new TransportKeyManager(db, + TransportKeyManager + transportKeyManager = new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, clock, transportId, maxLatency); // The timestamp is at the start of rotation period 1000 long timestamp = rotationPeriodLength * 1000; @@ -456,7 +464,8 @@ public class TransportKeyManagerTest extends BriarTestCase { oneOf(db).endTransaction(txn1); }}); - TransportKeyManager transportKeyManager = new TransportKeyManager(db, + TransportKeyManager + transportKeyManager = new TransportKeyManagerImpl(db, crypto, dbExecutor, scheduler, clock, transportId, maxLatency); transportKeyManager.start(txn); From c36f5c795bb23470028fcea24d6a30d5a2e34bd3 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 4 Nov 2016 11:04:44 -0200 Subject: [PATCH 2/2] Address review comments for TransportKeyManagerImplTest --- .../transport/KeyManagerImpl.java | 2 -- .../transport/TransportKeyManager.java | 5 ++-- .../transport/TransportKeyManagerFactory.java | 4 +-- .../TransportKeyManagerFactoryImpl.java | 4 +-- .../transport/TransportKeyManagerImpl.java | 6 +++- .../transport/TransportModule.java | 1 - .../transport/KeyManagerImplTest.java | 29 +++++++++++++------ ....java => TransportKeyManagerImplTest.java} | 3 +- 8 files changed, 32 insertions(+), 22 deletions(-) rename {briar-api/src/org/briarproject/api => briar-core/src/org/briarproject}/transport/TransportKeyManager.java (82%) rename {briar-api/src/org/briarproject/api => briar-core/src/org/briarproject}/transport/TransportKeyManagerFactory.java (61%) rename briar-tests/src/org/briarproject/transport/{TransportKeyManagerTest.java => TransportKeyManagerImplTest.java} (99%) diff --git a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java index e372cb928..a6c8f1be1 100644 --- a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java +++ b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java @@ -19,8 +19,6 @@ import org.briarproject.api.plugins.duplex.DuplexPluginFactory; import org.briarproject.api.plugins.simplex.SimplexPluginFactory; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamContext; -import org.briarproject.api.transport.TransportKeyManager; -import org.briarproject.api.transport.TransportKeyManagerFactory; import java.util.HashMap; import java.util.Map; diff --git a/briar-api/src/org/briarproject/api/transport/TransportKeyManager.java b/briar-core/src/org/briarproject/transport/TransportKeyManager.java similarity index 82% rename from briar-api/src/org/briarproject/api/transport/TransportKeyManager.java rename to briar-core/src/org/briarproject/transport/TransportKeyManager.java index dc3e22f9f..56ed6b9ca 100644 --- a/briar-api/src/org/briarproject/api/transport/TransportKeyManager.java +++ b/briar-core/src/org/briarproject/transport/TransportKeyManager.java @@ -1,11 +1,12 @@ -package org.briarproject.api.transport; +package org.briarproject.transport; import org.briarproject.api.contact.ContactId; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; +import org.briarproject.api.transport.StreamContext; -public interface TransportKeyManager { +interface TransportKeyManager { void start(Transaction txn) throws DbException; diff --git a/briar-api/src/org/briarproject/api/transport/TransportKeyManagerFactory.java b/briar-core/src/org/briarproject/transport/TransportKeyManagerFactory.java similarity index 61% rename from briar-api/src/org/briarproject/api/transport/TransportKeyManagerFactory.java rename to briar-core/src/org/briarproject/transport/TransportKeyManagerFactory.java index 1b2f3a29b..ca1021a0c 100644 --- a/briar-api/src/org/briarproject/api/transport/TransportKeyManagerFactory.java +++ b/briar-core/src/org/briarproject/transport/TransportKeyManagerFactory.java @@ -1,8 +1,8 @@ -package org.briarproject.api.transport; +package org.briarproject.transport; import org.briarproject.api.TransportId; -public interface TransportKeyManagerFactory { +interface TransportKeyManagerFactory { TransportKeyManager createTransportKeyManager(TransportId transportId, long maxLatency); diff --git a/briar-core/src/org/briarproject/transport/TransportKeyManagerFactoryImpl.java b/briar-core/src/org/briarproject/transport/TransportKeyManagerFactoryImpl.java index 4efe40856..dbc05778b 100644 --- a/briar-core/src/org/briarproject/transport/TransportKeyManagerFactoryImpl.java +++ b/briar-core/src/org/briarproject/transport/TransportKeyManagerFactoryImpl.java @@ -5,15 +5,13 @@ import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.system.Clock; -import org.briarproject.api.transport.TransportKeyManager; -import org.briarproject.api.transport.TransportKeyManagerFactory; import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; -public class TransportKeyManagerFactoryImpl implements +class TransportKeyManagerFactoryImpl implements TransportKeyManagerFactory { private final DatabaseComponent db; diff --git a/briar-core/src/org/briarproject/transport/TransportKeyManagerImpl.java b/briar-core/src/org/briarproject/transport/TransportKeyManagerImpl.java index 4565849d8..3afd0ef92 100644 --- a/briar-core/src/org/briarproject/transport/TransportKeyManagerImpl.java +++ b/briar-core/src/org/briarproject/transport/TransportKeyManagerImpl.java @@ -10,7 +10,6 @@ import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; import org.briarproject.api.system.Clock; import org.briarproject.api.transport.StreamContext; -import org.briarproject.api.transport.TransportKeyManager; import org.briarproject.api.transport.TransportKeys; import org.briarproject.transport.ReorderingWindow.Change; @@ -64,6 +63,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { keys = new HashMap(); } + @Override public void start(Transaction txn) throws DbException { long now = clock.currentTimeMillis(); lock.lock(); @@ -156,6 +156,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { }); } + @Override public void addContact(Transaction txn, ContactId c, SecretKey master, long timestamp, boolean alice) throws DbException { lock.lock(); @@ -177,6 +178,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { } } + @Override public void removeContact(ContactId c) { lock.lock(); try { @@ -192,6 +194,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { } } + @Override public StreamContext getStreamContext(Transaction txn, ContactId c) throws DbException { lock.lock(); @@ -214,6 +217,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { } } + @Override public StreamContext getStreamContext(Transaction txn, byte[] tag) throws DbException { lock.lock(); diff --git a/briar-core/src/org/briarproject/transport/TransportModule.java b/briar-core/src/org/briarproject/transport/TransportModule.java index c66865bdb..461e1d8dc 100644 --- a/briar-core/src/org/briarproject/transport/TransportModule.java +++ b/briar-core/src/org/briarproject/transport/TransportModule.java @@ -7,7 +7,6 @@ import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.transport.KeyManager; import org.briarproject.api.transport.StreamReaderFactory; import org.briarproject.api.transport.StreamWriterFactory; -import org.briarproject.api.transport.TransportKeyManagerFactory; import javax.inject.Inject; import javax.inject.Singleton; diff --git a/briar-tests/src/org/briarproject/transport/KeyManagerImplTest.java b/briar-tests/src/org/briarproject/transport/KeyManagerImplTest.java index d7ff0f0ce..3ac7d5f1c 100644 --- a/briar-tests/src/org/briarproject/transport/KeyManagerImplTest.java +++ b/briar-tests/src/org/briarproject/transport/KeyManagerImplTest.java @@ -14,8 +14,6 @@ import org.briarproject.api.identity.AuthorId; import org.briarproject.api.plugins.PluginConfig; import org.briarproject.api.plugins.simplex.SimplexPluginFactory; import org.briarproject.api.transport.StreamContext; -import org.briarproject.api.transport.TransportKeyManager; -import org.briarproject.api.transport.TransportKeyManagerFactory; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.lib.concurrent.DeterministicExecutor; @@ -29,6 +27,7 @@ import java.util.Collections; import static org.briarproject.TestUtils.getRandomBytes; import static org.briarproject.TestUtils.getRandomId; import static org.briarproject.TestUtils.getSecretKey; +import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH; import static org.junit.Assert.assertEquals; public class KeyManagerImplTest extends BriarTestCase { @@ -46,10 +45,11 @@ public class KeyManagerImplTest extends BriarTestCase { private final ContactId contactId = new ContactId(42); private final ContactId inactiveContactId = new ContactId(43); private final TransportId transportId = new TransportId("tId"); + private final TransportId unknownTransportId = new TransportId("id"); private final StreamContext streamContext = new StreamContext(contactId, transportId, getSecretKey(), getSecretKey(), 1); - private final byte[] tag = getRandomBytes(42); + private final byte[] tag = getRandomBytes(TAG_LENGTH); public KeyManagerImplTest() { keyManager = new KeyManagerImpl(db, executor, pluginConfig, @@ -114,12 +114,19 @@ public class KeyManagerImplTest extends BriarTestCase { } @Test - public void testGetStreamContextForContact() throws Exception { + public void testGetStreamContextForInactiveContact() throws Exception { assertEquals(null, keyManager.getStreamContext(inactiveContactId, transportId)); - assertEquals(null, keyManager - .getStreamContext(inactiveContactId, new TransportId("id"))); + } + @Test + public void testGetStreamContextForUnknownTransport() throws Exception { + assertEquals(null, keyManager + .getStreamContext(contactId, unknownTransportId)); + } + + @Test + public void testGetStreamContextForContact() throws Exception { context.checking(new Expectations() {{ oneOf(db).startTransaction(false); will(returnValue(txn)); @@ -135,10 +142,14 @@ public class KeyManagerImplTest extends BriarTestCase { } @Test - public void testGetStreamContextForTag() throws Exception { - assertEquals(null, keyManager - .getStreamContext(new TransportId("id"), tag)); + public void testGetStreamContextForTagAndUnknownTransport() + throws Exception { + assertEquals(null, + keyManager.getStreamContext(unknownTransportId, tag)); + } + @Test + public void testGetStreamContextForTag() throws Exception { context.checking(new Expectations() {{ oneOf(db).startTransaction(false); will(returnValue(txn)); diff --git a/briar-tests/src/org/briarproject/transport/TransportKeyManagerTest.java b/briar-tests/src/org/briarproject/transport/TransportKeyManagerImplTest.java similarity index 99% rename from briar-tests/src/org/briarproject/transport/TransportKeyManagerTest.java rename to briar-tests/src/org/briarproject/transport/TransportKeyManagerImplTest.java index d1bc128f6..0f039dfda 100644 --- a/briar-tests/src/org/briarproject/transport/TransportKeyManagerTest.java +++ b/briar-tests/src/org/briarproject/transport/TransportKeyManagerImplTest.java @@ -13,7 +13,6 @@ import org.briarproject.api.system.Clock; import org.briarproject.api.transport.IncomingKeys; import org.briarproject.api.transport.OutgoingKeys; import org.briarproject.api.transport.StreamContext; -import org.briarproject.api.transport.TransportKeyManager; import org.briarproject.api.transport.TransportKeys; import org.hamcrest.Description; import org.jmock.Expectations; @@ -41,7 +40,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -public class TransportKeyManagerTest extends BriarTestCase { +public class TransportKeyManagerImplTest extends BriarTestCase { private final TransportId transportId = new TransportId("id"); private final long maxLatency = 30 * 1000; // 30 seconds