From e846a13f50b790643b41eb7e7117584b05d83d93 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 26 Oct 2018 09:52:05 +0100 Subject: [PATCH] Use transactional database API in Bramble. --- .../org/briarproject/bramble/api/Maybe.java | 33 ++ .../org/briarproject/bramble/api/Pair.java | 26 + .../bramble/client/ClientHelperImpl.java | 88 +-- .../contact/ContactExchangeTaskImpl.java | 17 +- .../bramble/contact/ContactManagerImpl.java | 62 +- .../bramble/identity/IdentityManagerImpl.java | 21 +- .../lifecycle/LifecycleManagerImpl.java | 13 +- .../TransportPropertyManagerImpl.java | 53 +- .../bramble/settings/SettingsManagerImpl.java | 19 +- .../bramble/sync/DuplexOutgoingSession.java | 69 +-- .../bramble/sync/IncomingSession.java | 37 +- .../bramble/sync/SimplexOutgoingSession.java | 40 +- .../bramble/sync/ValidationManagerImpl.java | 148 ++--- .../bramble/transport/KeyManagerImpl.java | 30 +- .../transport/TransportKeyManagerImpl.java | 8 +- .../ClientVersioningManagerImpl.java | 8 +- .../bramble/client/ClientHelperImplTest.java | 57 +- .../contact/ContactManagerImplTest.java | 71 +-- .../bramble/db/DatabaseComponentImplTest.java | 542 ++++++------------ .../identity/IdentityManagerImplTest.java | 19 +- .../TransportPropertyManagerImplTest.java | 57 +- .../sync/SimplexOutgoingSessionTest.java | 42 +- .../sync/ValidationManagerImplTest.java | 343 +++-------- .../bramble/transport/KeyManagerImplTest.java | 41 +- .../TransportKeyManagerImplTest.java | 11 +- .../ClientVersioningManagerImplTest.java | 31 +- 26 files changed, 577 insertions(+), 1309 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/Maybe.java create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/Pair.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/Maybe.java b/bramble-api/src/main/java/org/briarproject/bramble/api/Maybe.java new file mode 100644 index 000000000..1b75eec20 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/Maybe.java @@ -0,0 +1,33 @@ +package org.briarproject.bramble.api; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import java.util.NoSuchElementException; + +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; + +/** + * Minimal stand-in for `java.util.Optional`. Functionality from `Optional` + * can be added as needed. + */ +@Immutable +@NotNullByDefault +public class Maybe { + + @Nullable + private final T value; + + public Maybe(@Nullable T value) { + this.value = value; + } + + public boolean isPresent() { + return value != null; + } + + public T get() { + if (value == null) throw new NoSuchElementException(); + return value; + } +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/Pair.java b/bramble-api/src/main/java/org/briarproject/bramble/api/Pair.java new file mode 100644 index 000000000..f41244886 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/Pair.java @@ -0,0 +1,26 @@ +package org.briarproject.bramble.api; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; + +@Immutable +@NotNullByDefault +public class Pair { + + private final A first; + private final B second; + + public Pair(A first, B second) { + this.first = first; + this.second = second; + } + + public A getFirst() { + return first; + } + + public B getSecond() { + return second; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/client/ClientHelperImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/client/ClientHelperImpl.java index 0a66aacf6..1062b9b69 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/client/ClientHelperImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/client/ClientHelperImpl.java @@ -82,13 +82,7 @@ class ClientHelperImpl implements ClientHelper { @Override public void addLocalMessage(Message m, BdfDictionary metadata, boolean shared) throws DbException, FormatException { - Transaction txn = db.startTransaction(false); - try { - addLocalMessage(txn, m, metadata, shared); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, txn -> addLocalMessage(txn, m, metadata, shared)); } @Override @@ -113,15 +107,7 @@ class ClientHelperImpl implements ClientHelper { @Override public Message getMessage(MessageId m) throws DbException { - Message message; - Transaction txn = db.startTransaction(true); - try { - message = getMessage(txn, m); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return message; + return db.transactionWithResult(true, txn -> getMessage(txn, m)); } @Override @@ -132,15 +118,7 @@ class ClientHelperImpl implements ClientHelper { @Override public BdfList getMessageAsList(MessageId m) throws DbException, FormatException { - BdfList list; - Transaction txn = db.startTransaction(true); - try { - list = getMessageAsList(txn, m); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return list; + return db.transactionWithResult(true, txn -> getMessageAsList(txn, m)); } @Override @@ -152,15 +130,8 @@ class ClientHelperImpl implements ClientHelper { @Override public BdfDictionary getGroupMetadataAsDictionary(GroupId g) throws DbException, FormatException { - BdfDictionary dictionary; - Transaction txn = db.startTransaction(true); - try { - dictionary = getGroupMetadataAsDictionary(txn, g); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return dictionary; + return db.transactionWithResult(true, txn -> + getGroupMetadataAsDictionary(txn, g)); } @Override @@ -173,15 +144,8 @@ class ClientHelperImpl implements ClientHelper { @Override public BdfDictionary getMessageMetadataAsDictionary(MessageId m) throws DbException, FormatException { - BdfDictionary dictionary; - Transaction txn = db.startTransaction(true); - try { - dictionary = getMessageMetadataAsDictionary(txn, m); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return dictionary; + return db.transactionWithResult(true, + txn -> getMessageMetadataAsDictionary(txn, m)); } @Override @@ -194,15 +158,8 @@ class ClientHelperImpl implements ClientHelper { @Override public Map getMessageMetadataAsDictionary( GroupId g) throws DbException, FormatException { - Map map; - Transaction txn = db.startTransaction(true); - try { - map = getMessageMetadataAsDictionary(txn, g); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return map; + return db.transactionWithResult(true, + txn -> getMessageMetadataAsDictionary(txn, g)); } @Override @@ -219,15 +176,8 @@ class ClientHelperImpl implements ClientHelper { public Map getMessageMetadataAsDictionary( GroupId g, BdfDictionary query) throws DbException, FormatException { - Map map; - Transaction txn = db.startTransaction(true); - try { - map = getMessageMetadataAsDictionary(txn, g, query); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return map; + return db.transactionWithResult(true, + txn -> getMessageMetadataAsDictionary(txn, g, query)); } @Override @@ -245,13 +195,7 @@ class ClientHelperImpl implements ClientHelper { @Override public void mergeGroupMetadata(GroupId g, BdfDictionary metadata) throws DbException, FormatException { - Transaction txn = db.startTransaction(false); - try { - mergeGroupMetadata(txn, g, metadata); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, txn -> mergeGroupMetadata(txn, g, metadata)); } @Override @@ -263,13 +207,7 @@ class ClientHelperImpl implements ClientHelper { @Override public void mergeMessageMetadata(MessageId m, BdfDictionary metadata) throws DbException, FormatException { - Transaction txn = db.startTransaction(false); - try { - mergeMessageMetadata(txn, m, metadata); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, txn -> mergeMessageMetadata(txn, m, metadata)); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java index 69a543058..696097962 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java @@ -13,7 +13,6 @@ import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.db.ContactExistsException; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; @@ -158,7 +157,8 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { streamWriterFactory.createContactExchangeStreamWriter(out, alice ? aliceHeaderKey : bobHeaderKey); RecordWriter recordWriter = - recordWriterFactory.createRecordWriter(streamWriter.getOutputStream()); + recordWriterFactory + .createRecordWriter(streamWriter.getOutputStream()); // Derive the nonces to be signed byte[] aliceNonce = crypto.mac(ALICE_NONCE_LABEL, masterSecret, @@ -287,19 +287,14 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { private ContactId addContact(Author remoteAuthor, long timestamp, Map remoteProperties) throws DbException { - ContactId contactId; - Transaction txn = db.startTransaction(false); - try { - contactId = contactManager.addContact(txn, remoteAuthor, + return db.transactionWithResult(false, txn -> { + ContactId contactId = contactManager.addContact(txn, remoteAuthor, localAuthor.getId(), masterSecret, timestamp, alice, true, true); transportPropertyManager.addRemoteProperties(txn, contactId, remoteProperties); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return contactId; + return contactId; + }); } private void tryToClose(DuplexTransportConnection conn) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index f7e03c5c4..c5c91eded 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -79,42 +79,21 @@ class ContactManagerImpl implements ContactManager { public ContactId addContact(Author remote, AuthorId local, SecretKey master, long timestamp, boolean alice, boolean verified, boolean active) throws DbException { - ContactId c; - Transaction txn = db.startTransaction(false); - try { - c = addContact(txn, remote, local, master, timestamp, alice, - verified, active); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return c; + return db.transactionWithResult(false, + txn -> addContact(txn, remote, local, master, timestamp, alice, + verified, active)); } @Override public Contact getContact(ContactId c) throws DbException { - Contact contact; - Transaction txn = db.startTransaction(true); - try { - contact = db.getContact(txn, c); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return contact; + return db.transactionWithResult(true, txn -> db.getContact(txn, c)); } @Override public Contact getContact(AuthorId remoteAuthorId, AuthorId localAuthorId) throws DbException { - Transaction txn = db.startTransaction(true); - try { - Contact c = getContact(txn, remoteAuthorId, localAuthorId); - db.commitTransaction(txn); - return c; - } finally { - db.endTransaction(txn); - } + return db.transactionWithResult(true, + txn -> getContact(txn, remoteAuthorId, localAuthorId)); } @Override @@ -132,14 +111,8 @@ class ContactManagerImpl implements ContactManager { @Override public Collection getActiveContacts() throws DbException { - Collection contacts; - Transaction txn = db.startTransaction(true); - try { - contacts = db.getContacts(txn); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Collection contacts = + db.transactionWithResult(true, db::getContacts); List active = new ArrayList<>(contacts.size()); for (Contact c : contacts) if (c.isActive()) active.add(c); return active; @@ -147,13 +120,7 @@ class ContactManagerImpl implements ContactManager { @Override public void removeContact(ContactId c) throws DbException { - Transaction txn = db.startTransaction(false); - try { - removeContact(txn, c); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, txn -> removeContact(txn, c)); } @Override @@ -188,15 +155,8 @@ class ContactManagerImpl implements ContactManager { @Override public boolean contactExists(AuthorId remoteAuthorId, AuthorId localAuthorId) throws DbException { - boolean exists; - Transaction txn = db.startTransaction(true); - try { - exists = contactExists(txn, remoteAuthorId, localAuthorId); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return exists; + return db.transactionWithResult(true, + txn -> contactExists(txn, remoteAuthorId, localAuthorId)); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java index 783ed336a..d98f5d503 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java @@ -67,27 +67,16 @@ class IdentityManagerImpl implements IdentityManager { LOG.info("No local author to store"); return; } - Transaction txn = db.startTransaction(false); - try { - db.addLocalAuthor(txn, cached); - db.commitTransaction(txn); - LOG.info("Local author stored"); - } finally { - db.endTransaction(txn); - } + db.transaction(false, txn -> db.addLocalAuthor(txn, cached)); + LOG.info("Local author stored"); } @Override public LocalAuthor getLocalAuthor() throws DbException { if (cachedAuthor == null) { - Transaction txn = db.startTransaction(true); - try { - cachedAuthor = loadLocalAuthor(txn); - LOG.info("Local author loaded"); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + cachedAuthor = + db.transactionWithResult(true, this::loadLocalAuthor); + LOG.info("Local author loaded"); } LocalAuthor cached = cachedAuthor; if (cached == null) throw new AssertionError(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleManagerImpl.java index f158a690f..da55a780c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleManagerImpl.java @@ -6,7 +6,6 @@ import org.briarproject.bramble.api.db.DataTooOldException; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.MigrationListener; -import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; @@ -115,20 +114,16 @@ class LifecycleManagerImpl implements LifecycleManager, MigrationListener { dbLatch.countDown(); eventBus.broadcast(new LifecycleEvent(STARTING_SERVICES)); - Transaction txn = db.startTransaction(false); - try { + db.transaction(false, txn -> { for (Client c : clients) { - start = now(); + long start1 = now(); c.createLocalState(txn); if (LOG.isLoggable(FINE)) { logDuration(LOG, "Starting client " - + c.getClass().getSimpleName(), start); + + c.getClass().getSimpleName(), start1); } } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + }); for (Service s : services) { start = now(); s.startService(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java index 3c933669e..4b4be0437 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java @@ -142,15 +142,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, @Override public Map getLocalProperties() throws DbException { - Map local; - Transaction txn = db.startTransaction(true); - try { - local = getLocalProperties(txn); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return local; + return db.transactionWithResult(true, this::getLocalProperties); } @Override @@ -176,9 +168,8 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, public TransportProperties getLocalProperties(TransportId t) throws DbException { try { - TransportProperties p = null; - Transaction txn = db.startTransaction(true); - try { + return db.transactionWithResult(true, txn -> { + TransportProperties p = null; // Find the latest local update LatestUpdate latest = findLatest(txn, localGroup.getId(), t, true); @@ -188,11 +179,8 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, latest.messageId); p = parseProperties(message); } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return p == null ? new TransportProperties() : p; + return p == null ? new TransportProperties() : p; + }); } catch (FormatException e) { throw new DbException(e); } @@ -201,16 +189,12 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, @Override public Map getRemoteProperties( TransportId t) throws DbException { - Map remote = new HashMap<>(); - Transaction txn = db.startTransaction(true); - try { + return db.transactionWithResult(true, txn -> { + Map remote = new HashMap<>(); for (Contact c : db.getContacts(txn)) remote.put(c.getId(), getRemoteProperties(txn, c, t)); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return remote; + return remote; + }); } private TransportProperties getRemoteProperties(Transaction txn, Contact c, @@ -234,23 +218,15 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, @Override public TransportProperties getRemoteProperties(ContactId c, TransportId t) throws DbException { - TransportProperties p; - Transaction txn = db.startTransaction(true); - try { - p = getRemoteProperties(txn, db.getContact(txn, c), t); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return p; + return db.transactionWithResult(true, + txn -> getRemoteProperties(txn, db.getContact(txn, c), t)); } @Override public void mergeLocalProperties(TransportId t, TransportProperties p) throws DbException { try { - Transaction txn = db.startTransaction(false); - try { + db.transaction(false, txn -> { // Merge the new properties with any existing properties TransportProperties merged; boolean changed; @@ -287,10 +263,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, db.removeMessage(txn, latest.messageId); } } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + }); } catch (FormatException e) { throw new DbException(e); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/settings/SettingsManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/settings/SettingsManagerImpl.java index 13d2c6a25..d27b7f16e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/settings/SettingsManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/settings/SettingsManagerImpl.java @@ -23,15 +23,8 @@ class SettingsManagerImpl implements SettingsManager { @Override public Settings getSettings(String namespace) throws DbException { - Settings s; - Transaction txn = db.startTransaction(true); - try { - s = db.getSettings(txn, namespace); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return s; + return db.transactionWithResult(true, + txn -> db.getSettings(txn, namespace)); } @Override @@ -42,12 +35,6 @@ class SettingsManagerImpl implements SettingsManager { @Override public void mergeSettings(Settings s, String namespace) throws DbException { - Transaction txn = db.startTransaction(false); - try { - db.mergeSettings(txn, s, namespace); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, txn -> db.mergeSettings(txn, s, namespace)); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java index 462be735b..91e4ddabf 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java @@ -1,11 +1,11 @@ package org.briarproject.bramble.sync; +import org.briarproject.bramble.api.Maybe; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventListener; @@ -230,17 +230,12 @@ class DuplexOutgoingSession implements SyncSession, EventListener { if (interrupted) return; if (!generateAckQueued.getAndSet(false)) throw new AssertionError(); try { - Ack a; - Transaction txn = db.startTransaction(false); - try { - a = db.generateAck(txn, contactId, MAX_MESSAGE_IDS); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Maybe a = db.transactionWithResult(false, + txn -> new Maybe<>(db.generateAck(txn, contactId, + MAX_MESSAGE_IDS))); if (LOG.isLoggable(INFO)) - LOG.info("Generated ack: " + (a != null)); - if (a != null) writerTasks.add(new WriteAck(a)); + LOG.info("Generated ack: " + a.isPresent()); + if (a.isPresent()) writerTasks.add(new WriteAck(a.get())); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -275,19 +270,16 @@ class DuplexOutgoingSession implements SyncSession, EventListener { if (!generateBatchQueued.getAndSet(false)) throw new AssertionError(); try { - Collection b; - Transaction txn = db.startTransaction(false); - try { - b = db.generateRequestedBatch(txn, contactId, - MAX_RECORD_PAYLOAD_BYTES, maxLatency); + Maybe> + b = db.transactionWithResult(false, txn -> { + Collection batch = db.generateRequestedBatch(txn, + contactId, MAX_RECORD_PAYLOAD_BYTES, maxLatency); setNextSendTime(db.getNextSendTime(txn, contactId)); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + return new Maybe<>(batch); + }); if (LOG.isLoggable(INFO)) - LOG.info("Generated batch: " + (b != null)); - if (b != null) writerTasks.add(new WriteBatch(b)); + LOG.info("Generated batch: " + b.isPresent()); + if (b.isPresent()) writerTasks.add(new WriteBatch(b.get())); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -322,19 +314,15 @@ class DuplexOutgoingSession implements SyncSession, EventListener { if (!generateOfferQueued.getAndSet(false)) throw new AssertionError(); try { - Offer o; - Transaction txn = db.startTransaction(false); - try { - o = db.generateOffer(txn, contactId, MAX_MESSAGE_IDS, - maxLatency); + Maybe o = db.transactionWithResult(false, txn -> { + Offer offer = db.generateOffer(txn, contactId, + MAX_MESSAGE_IDS, maxLatency); setNextSendTime(db.getNextSendTime(txn, contactId)); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + return new Maybe<>(offer); + }); if (LOG.isLoggable(INFO)) - LOG.info("Generated offer: " + (o != null)); - if (o != null) writerTasks.add(new WriteOffer(o)); + LOG.info("Generated offer: " + o.isPresent()); + if (o.isPresent()) writerTasks.add(new WriteOffer(o.get())); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -369,17 +357,12 @@ class DuplexOutgoingSession implements SyncSession, EventListener { if (!generateRequestQueued.getAndSet(false)) throw new AssertionError(); try { - Request r; - Transaction txn = db.startTransaction(false); - try { - r = db.generateRequest(txn, contactId, MAX_MESSAGE_IDS); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Maybe r = db.transactionWithResult(false, + txn -> new Maybe<>(db.generateRequest(txn, contactId, + MAX_MESSAGE_IDS))); if (LOG.isLoggable(INFO)) - LOG.info("Generated request: " + (r != null)); - if (r != null) writerTasks.add(new WriteRequest(r)); + LOG.info("Generated request: " + r.isPresent()); + if (r.isPresent()) writerTasks.add(new WriteRequest(r.get())); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/IncomingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/IncomingSession.java index 93ad805e1..e41006a78 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/IncomingSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/IncomingSession.java @@ -6,7 +6,6 @@ import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventListener; @@ -120,13 +119,8 @@ class IncomingSession implements SyncSession, EventListener { @Override public void run() { try { - Transaction txn = db.startTransaction(false); - try { - db.receiveAck(txn, contactId, ack); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, + txn -> db.receiveAck(txn, contactId, ack)); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -146,13 +140,8 @@ class IncomingSession implements SyncSession, EventListener { @Override public void run() { try { - Transaction txn = db.startTransaction(false); - try { - db.receiveMessage(txn, contactId, message); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, + txn -> db.receiveMessage(txn, contactId, message)); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -172,13 +161,8 @@ class IncomingSession implements SyncSession, EventListener { @Override public void run() { try { - Transaction txn = db.startTransaction(false); - try { - db.receiveOffer(txn, contactId, offer); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, + txn -> db.receiveOffer(txn, contactId, offer)); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -198,13 +182,8 @@ class IncomingSession implements SyncSession, EventListener { @Override public void run() { try { - Transaction txn = db.startTransaction(false); - try { - db.receiveRequest(txn, contactId, request); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, + txn -> db.receiveRequest(txn, contactId, request)); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java index 7f12065a8..7cb127b9c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java @@ -1,11 +1,11 @@ package org.briarproject.bramble.sync; +import org.briarproject.bramble.api.Maybe; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventListener; @@ -47,7 +47,8 @@ class SimplexOutgoingSession implements SyncSession, EventListener { private static final Logger LOG = Logger.getLogger(SimplexOutgoingSession.class.getName()); - private static final ThrowingRunnable CLOSE = () -> {}; + private static final ThrowingRunnable CLOSE = () -> { + }; private final DatabaseComponent db; private final Executor dbExecutor; @@ -128,18 +129,13 @@ class SimplexOutgoingSession implements SyncSession, EventListener { public void run() { if (interrupted) return; try { - Ack a; - Transaction txn = db.startTransaction(false); - try { - a = db.generateAck(txn, contactId, MAX_MESSAGE_IDS); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Maybe a = db.transactionWithResult(false, + txn -> new Maybe<>(db.generateAck(txn, contactId, + MAX_MESSAGE_IDS))); if (LOG.isLoggable(INFO)) - LOG.info("Generated ack: " + (a != null)); - if (a == null) decrementOutstandingQueries(); - else writerTasks.add(new WriteAck(a)); + LOG.info("Generated ack: " + a.isPresent()); + if (a.isPresent()) writerTasks.add(new WriteAck(a.get())); + else decrementOutstandingQueries(); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); @@ -172,19 +168,13 @@ class SimplexOutgoingSession implements SyncSession, EventListener { public void run() { if (interrupted) return; try { - Collection b; - Transaction txn = db.startTransaction(false); - try { - b = db.generateBatch(txn, contactId, - MAX_RECORD_PAYLOAD_BYTES, maxLatency); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Maybe> b = db.transactionWithResult(false, + txn -> new Maybe<>(db.generateBatch(txn, contactId, + MAX_RECORD_PAYLOAD_BYTES, maxLatency))); if (LOG.isLoggable(INFO)) - LOG.info("Generated batch: " + (b != null)); - if (b == null) decrementOutstandingQueries(); - else writerTasks.add(new WriteBatch(b)); + LOG.info("Generated batch: " + b.isPresent()); + if (b.isPresent()) writerTasks.add(new WriteBatch(b.get())); + else decrementOutstandingQueries(); } catch (DbException e) { logException(LOG, WARNING, e); interrupt(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java index 99d3335e7..5cdc03f66 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.sync; +import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; @@ -97,14 +98,8 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private void validateOutstandingMessages() { try { - Queue unvalidated = new LinkedList<>(); - Transaction txn = db.startTransaction(true); - try { - unvalidated.addAll(db.getMessagesToValidate(txn)); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Queue unvalidated = new LinkedList<>( + db.transactionWithResult(true, db::getMessagesToValidate)); validateNextMessageAsync(unvalidated); } catch (DbException e) { logException(LOG, WARNING, e); @@ -119,18 +114,14 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private void validateNextMessage(Queue unvalidated) { try { - Message m; - Group g; - Transaction txn = db.startTransaction(true); - try { + Pair mg = db.transactionWithResult(true, txn -> { MessageId id = unvalidated.poll(); - m = db.getMessage(txn, id); - g = db.getGroup(txn, m.getGroupId()); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - validateMessageAsync(m, g); + if (id == null) throw new AssertionError(); + Message m = db.getMessage(txn, id); + Group g = db.getGroup(txn, m.getGroupId()); + return new Pair<>(m, g); + }); + validateMessageAsync(mg.getFirst(), mg.getSecond()); validateNextMessageAsync(unvalidated); } catch (NoSuchMessageException e) { LOG.info("Message removed before validation"); @@ -150,14 +141,8 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private void deliverOutstandingMessages() { try { - Queue pending = new LinkedList<>(); - Transaction txn = db.startTransaction(true); - try { - pending.addAll(db.getPendingMessages(txn)); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Queue pending = new LinkedList<>( + db.transactionWithResult(true, db::getPendingMessages)); deliverNextPendingMessageAsync(pending); } catch (DbException e) { logException(LOG, WARNING, e); @@ -172,12 +157,12 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private void deliverNextPendingMessage(Queue pending) { try { - boolean anyInvalid = false, allDelivered = true; - Queue toShare = null; - Queue invalidate = null; - Transaction txn = db.startTransaction(false); - try { + Queue toShare = new LinkedList<>(); + Queue invalidate = new LinkedList<>(); + db.transaction(false, txn -> { + boolean anyInvalid = false, allDelivered = true; MessageId id = pending.poll(); + if (id == null) throw new AssertionError(); // Check if message is still pending if (db.getMessageState(txn, id) == PENDING) { // Check if dependencies are valid and delivered @@ -189,7 +174,7 @@ class ValidationManagerImpl implements ValidationManager, Service, } if (anyInvalid) { invalidateMessage(txn, id); - invalidate = getDependentsToInvalidate(txn, id); + addDependentsToInvalidate(txn, id, invalidate); } else if (allDelivered) { Message m = db.getMessage(txn, id); Group g = db.getGroup(txn, m.getGroupId()); @@ -200,22 +185,19 @@ class ValidationManagerImpl implements ValidationManager, Service, DeliveryResult result = deliverMessage(txn, m, c, majorVersion, meta); if (result.valid) { - pending.addAll(getPendingDependents(txn, id)); + addPendingDependents(txn, id, pending); if (result.share) { db.setMessageShared(txn, id); - toShare = new LinkedList<>(states.keySet()); + toShare.addAll(states.keySet()); } } else { - invalidate = getDependentsToInvalidate(txn, id); + addDependentsToInvalidate(txn, id, invalidate); } } } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - if (invalidate != null) invalidateNextMessageAsync(invalidate); - if (toShare != null) shareNextMessageAsync(toShare); + }); + if (!invalidate.isEmpty()) invalidateNextMessageAsync(invalidate); + if (!toShare.isEmpty()) shareNextMessageAsync(toShare); deliverNextPendingMessageAsync(pending); } catch (NoSuchMessageException e) { LOG.info("Message removed before delivery"); @@ -264,12 +246,11 @@ class ValidationManagerImpl implements ValidationManager, Service, MessageContext context) { try { MessageId id = m.getId(); - boolean anyInvalid = false, allDelivered = true; - Queue invalidate = null; - Queue pending = null; - Queue toShare = null; - Transaction txn = db.startTransaction(false); - try { + Queue invalidate = new LinkedList<>(); + Queue pending = new LinkedList<>(); + Queue toShare = new LinkedList<>(); + db.transaction(false, txn -> { + boolean anyInvalid = false, allDelivered = true; // Check if message has any dependencies Collection dependencies = context.getDependencies(); if (!dependencies.isEmpty()) { @@ -285,7 +266,7 @@ class ValidationManagerImpl implements ValidationManager, Service, if (anyInvalid) { if (db.getMessageState(txn, id) != INVALID) { invalidateMessage(txn, id); - invalidate = getDependentsToInvalidate(txn, id); + addDependentsToInvalidate(txn, id, invalidate); } } else { Metadata meta = context.getMetadata(); @@ -294,25 +275,22 @@ class ValidationManagerImpl implements ValidationManager, Service, DeliveryResult result = deliverMessage(txn, m, c, majorVersion, meta); if (result.valid) { - pending = getPendingDependents(txn, id); + addPendingDependents(txn, id, pending); if (result.share) { db.setMessageShared(txn, id); - toShare = new LinkedList<>(dependencies); + toShare.addAll(dependencies); } } else { - invalidate = getDependentsToInvalidate(txn, id); + addDependentsToInvalidate(txn, id, invalidate); } } else { db.setMessageState(txn, id, PENDING); } } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - if (invalidate != null) invalidateNextMessageAsync(invalidate); - if (pending != null) deliverNextPendingMessageAsync(pending); - if (toShare != null) shareNextMessageAsync(toShare); + }); + if (!invalidate.isEmpty()) invalidateNextMessageAsync(invalidate); + if (!pending.isEmpty()) deliverNextPendingMessageAsync(pending); + if (!toShare.isEmpty()) shareNextMessageAsync(toShare); } catch (NoSuchMessageException e) { LOG.info("Message removed during validation"); } catch (NoSuchGroupException e) { @@ -342,14 +320,12 @@ class ValidationManagerImpl implements ValidationManager, Service, } @DatabaseExecutor - private Queue getPendingDependents(Transaction txn, MessageId m) - throws DbException { - Queue pending = new LinkedList<>(); + private void addPendingDependents(Transaction txn, MessageId m, + Queue pending) throws DbException { Map states = db.getMessageDependents(txn, m); for (Entry e : states.entrySet()) { if (e.getValue() == PENDING) pending.add(e.getKey()); } - return pending; } private void shareOutstandingMessagesAsync() { @@ -359,14 +335,8 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private void shareOutstandingMessages() { try { - Queue toShare = new LinkedList<>(); - Transaction txn = db.startTransaction(true); - try { - toShare.addAll(db.getMessagesToShare(txn)); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Queue toShare = new LinkedList<>( + db.transactionWithResult(true, db::getMessagesToShare)); shareNextMessageAsync(toShare); } catch (DbException e) { logException(LOG, WARNING, e); @@ -387,15 +357,12 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private void shareNextMessage(Queue toShare) { try { - Transaction txn = db.startTransaction(false); - try { + db.transaction(false, txn -> { MessageId id = toShare.poll(); + if (id == null) throw new AssertionError(); db.setMessageShared(txn, id); toShare.addAll(db.getMessageDependencies(txn, id).keySet()); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + }); shareNextMessageAsync(toShare); } catch (NoSuchMessageException e) { LOG.info("Message removed before sharing"); @@ -416,17 +383,14 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private void invalidateNextMessage(Queue invalidate) { try { - Transaction txn = db.startTransaction(false); - try { + db.transaction(false, txn -> { MessageId id = invalidate.poll(); + if (id == null) throw new AssertionError(); if (db.getMessageState(txn, id) != INVALID) { invalidateMessage(txn, id); - invalidate.addAll(getDependentsToInvalidate(txn, id)); + addDependentsToInvalidate(txn, id, invalidate); } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + }); invalidateNextMessageAsync(invalidate); } catch (NoSuchMessageException e) { LOG.info("Message removed before invalidation"); @@ -445,14 +409,12 @@ class ValidationManagerImpl implements ValidationManager, Service, } @DatabaseExecutor - private Queue getDependentsToInvalidate(Transaction txn, - MessageId m) throws DbException { - Queue invalidate = new LinkedList<>(); + private void addDependentsToInvalidate(Transaction txn, + MessageId m, Queue invalidate) throws DbException { Map states = db.getMessageDependents(txn, m); for (Entry e : states.entrySet()) { if (e.getValue() != INVALID) invalidate.add(e.getKey()); } - return invalidate; } @Override @@ -472,14 +434,8 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private void loadGroupAndValidate(Message m) { try { - Group g; - Transaction txn = db.startTransaction(true); - try { - g = db.getGroup(txn, m.getGroupId()); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + Group g = db.transactionWithResult(true, + txn -> db.getGroup(txn, m.getGroupId())); validateMessageAsync(m, g); } catch (NoSuchGroupException e) { LOG.info("Group removed before validation"); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java index ffbe8c0eb..69db19e50 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java @@ -72,8 +72,7 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { for (DuplexPluginFactory f : pluginConfig.getDuplexFactories()) transports.put(f.getId(), f.getMaxLatency()); try { - Transaction txn = db.startTransaction(false); - try { + db.transaction(false, txn -> { for (Contact c : db.getContacts(txn)) if (c.isActive()) activeContacts.put(c.getId(), true); for (Entry e : transports.entrySet()) @@ -85,10 +84,7 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { managers.put(e.getKey(), m); m.start(txn); } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + }); } catch (DbException e) { throw new ServiceException(e); } @@ -141,15 +137,8 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { if (LOG.isLoggable(INFO)) LOG.info("No key manager for " + t); return null; } - StreamContext ctx; - Transaction txn = db.startTransaction(false); - try { - ctx = m.getStreamContext(txn, c); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return ctx; + return db.transactionWithResult(false, + txn -> m.getStreamContext(txn, c)); } @Override @@ -160,15 +149,8 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { if (LOG.isLoggable(INFO)) LOG.info("No key manager for " + t); return null; } - StreamContext ctx; - Transaction txn = db.startTransaction(false); - try { - ctx = m.getStreamContext(txn, tag); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } - return ctx; + return db.transactionWithResult(false, + txn -> m.getStreamContext(txn, tag)); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java index 5784cb378..ed51c3919 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java @@ -162,13 +162,7 @@ class TransportKeyManagerImpl implements TransportKeyManager { private void rotateKeys() { dbExecutor.execute(() -> { try { - Transaction txn = db.startTransaction(false); - try { - rotateKeys(txn); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + db.transaction(false, this::rotateKeys); } catch (DbException e) { logException(LOG, WARNING, e); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index c246c11b6..e802c8982 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -123,16 +123,12 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, List versions = new ArrayList<>(clients); Collections.sort(versions); try { - Transaction txn = db.startTransaction(false); - try { + db.transaction(false, txn -> { if (updateClientVersions(txn, versions)) { for (Contact c : db.getContacts(txn)) clientVersionsUpdated(txn, c, versions); } - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + }); } catch (DbException e) { throw new ServiceException(e); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/client/ClientHelperImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/client/ClientHelperImplTest.java index 9201e0c67..33888d7a1 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/client/ClientHelperImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/client/ClientHelperImplTest.java @@ -22,6 +22,7 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageFactory; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.test.BrambleTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.briarproject.bramble.util.StringUtils; import org.jmock.Expectations; import org.jmock.Mockery; @@ -85,14 +86,11 @@ public class ClientHelperImplTest extends BrambleTestCase { boolean shared = new Random().nextBoolean(); Transaction txn = new Transaction(null, false); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(metadataEncoder).encode(dictionary); will(returnValue(metadata)); oneOf(db).addLocalMessage(txn, message, metadata, shared); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); clientHelper.addLocalMessage(message, dictionary, shared); @@ -116,13 +114,10 @@ public class ClientHelperImplTest extends BrambleTestCase { Transaction txn = new Transaction(null, true); expectToList(true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessage(txn, messageId); will(returnValue(message)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); clientHelper.getMessageAsList(messageId); @@ -133,15 +128,12 @@ public class ClientHelperImplTest extends BrambleTestCase { public void testGetGroupMetadataAsDictionary() throws Exception { Transaction txn = new Transaction(null, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroupMetadata(txn, groupId); will(returnValue(metadata)); oneOf(metadataParser).parse(metadata); will(returnValue(dictionary)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(dictionary, @@ -153,15 +145,12 @@ public class ClientHelperImplTest extends BrambleTestCase { public void testGetMessageMetadataAsDictionary() throws Exception { Transaction txn = new Transaction(null, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessageMetadata(txn, messageId); will(returnValue(metadata)); oneOf(metadataParser).parse(metadata); will(returnValue(dictionary)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(dictionary, @@ -175,15 +164,12 @@ public class ClientHelperImplTest extends BrambleTestCase { map.put(messageId, dictionary); Transaction txn = new Transaction(null, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessageMetadata(txn, groupId); will(returnValue(Collections.singletonMap(messageId, metadata))); oneOf(metadataParser).parse(metadata); will(returnValue(dictionary)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(map, clientHelper.getMessageMetadataAsDictionary(groupId)); @@ -200,17 +186,14 @@ public class ClientHelperImplTest extends BrambleTestCase { queryMetadata.put("query", getRandomBytes(42)); Transaction txn = new Transaction(null, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(metadataEncoder).encode(query); will(returnValue(queryMetadata)); oneOf(db).getMessageMetadata(txn, groupId, queryMetadata); will(returnValue(Collections.singletonMap(messageId, metadata))); oneOf(metadataParser).parse(metadata); will(returnValue(dictionary)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(map, @@ -222,14 +205,11 @@ public class ClientHelperImplTest extends BrambleTestCase { public void testMergeGroupMetadata() throws Exception { Transaction txn = new Transaction(null, false); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(metadataEncoder).encode(dictionary); will(returnValue(metadata)); oneOf(db).mergeGroupMetadata(txn, groupId, metadata); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); clientHelper.mergeGroupMetadata(groupId, dictionary); @@ -240,14 +220,11 @@ public class ClientHelperImplTest extends BrambleTestCase { public void testMergeMessageMetadata() throws Exception { Transaction txn = new Transaction(null, false); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(metadataEncoder).encode(dictionary); will(returnValue(metadata)); oneOf(db).mergeMessageMetadata(txn, messageId, metadata); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); clientHelper.mergeMessageMetadata(messageId, dictionary); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java index 24ecd71c5..375fcade5 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java @@ -69,17 +69,14 @@ public class ContactManagerImplTest extends BrambleMockTestCase { boolean alice = new Random().nextBoolean(); Transaction txn = new Transaction(null, false); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(false), withDbCallable(txn)); oneOf(db).addContact(txn, remote, local, verified, active); will(returnValue(contactId)); oneOf(keyManager).addContact(txn, contactId, master, timestamp, alice, active); oneOf(db).getContact(txn, contactId); will(returnValue(contact)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(contactId, contactManager.addContact(remote, local, @@ -89,13 +86,10 @@ public class ContactManagerImplTest extends BrambleMockTestCase { @Test public void testGetContact() throws Exception { Transaction txn = new Transaction(null, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getContact(txn, contactId); will(returnValue(contact)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(contact, contactManager.getContact(contactId)); @@ -105,13 +99,10 @@ public class ContactManagerImplTest extends BrambleMockTestCase { public void testGetContactByAuthor() throws Exception { Transaction txn = new Transaction(null, true); Collection contacts = Collections.singleton(contact); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getContactsByAuthorId(txn, remote.getId()); will(returnValue(contacts)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(contact, contactManager.getContact(remote.getId(), local)); @@ -120,12 +111,10 @@ public class ContactManagerImplTest extends BrambleMockTestCase { @Test(expected = NoSuchContactException.class) public void testGetContactByUnknownAuthor() throws Exception { Transaction txn = new Transaction(null, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getContactsByAuthorId(txn, remote.getId()); will(returnValue(emptyList())); - oneOf(db).endTransaction(txn); }}); contactManager.getContact(remote.getId(), local); @@ -135,31 +124,26 @@ public class ContactManagerImplTest extends BrambleMockTestCase { public void testGetContactByUnknownLocalAuthor() throws Exception { Transaction txn = new Transaction(null, true); Collection contacts = Collections.singleton(contact); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getContactsByAuthorId(txn, remote.getId()); will(returnValue(contacts)); - oneOf(db).endTransaction(txn); }}); contactManager.getContact(remote.getId(), new AuthorId(getRandomId())); } @Test - public void testActiveContacts() throws Exception { + public void testGetActiveContacts() throws Exception { Collection activeContacts = Collections.singletonList(contact); Collection contacts = new ArrayList<>(activeContacts); contacts.add(new Contact(new ContactId(3), remote, local, alias, true, false)); Transaction txn = new Transaction(null, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getContacts(txn); will(returnValue(contacts)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(activeContacts, contactManager.getActiveContacts()); @@ -168,14 +152,11 @@ public class ContactManagerImplTest extends BrambleMockTestCase { @Test public void testRemoveContact() throws Exception { Transaction txn = new Transaction(null, false); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(db).getContact(txn, contactId); will(returnValue(contact)); oneOf(db).removeContact(txn, contactId); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); contactManager.removeContact(contactId); @@ -195,7 +176,7 @@ public class ContactManagerImplTest extends BrambleMockTestCase { public void testSetContactAlias() throws Exception { Transaction txn = new Transaction(null, false); context.checking(new DbExpectations() {{ - oneOf(db).transaction(with(equal(false)), withDbRunnable(txn)); + oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(db).setContactAlias(txn, contactId, alias); }}); @@ -212,28 +193,24 @@ public class ContactManagerImplTest extends BrambleMockTestCase { @Test public void testContactExists() throws Exception { Transaction txn = new Transaction(null, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).containsContact(txn, remote.getId(), local); will(returnValue(true)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertTrue(contactManager.contactExists(remote.getId(), local)); } @Test - public void testGetAuthorStatus() throws Exception { + public void testGetAuthorInfo() throws Exception { Transaction txn = new Transaction(null, true); Collection contacts = singletonList( new Contact(new ContactId(1), remote, localAuthor.getId(), alias, false, true)); context.checking(new DbExpectations() {{ - oneOf(db).transactionWithResult(with(equal(true)), - withDbCallable(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(identityManager).getLocalAuthor(txn); will(returnValue(localAuthor)); oneOf(db).getContactsByAuthorId(txn, remote.getId()); @@ -246,7 +223,7 @@ public class ContactManagerImplTest extends BrambleMockTestCase { } @Test - public void testGetAuthorStatusTransaction() throws DbException { + public void testGetAuthorInfoTransaction() throws DbException { Transaction txn = new Transaction(null, true); // check unknown author @@ -265,7 +242,7 @@ public class ContactManagerImplTest extends BrambleMockTestCase { Collection contacts = singletonList( new Contact(new ContactId(1), remote, localAuthor.getId(), alias, false, true)); - checkAuthorStatusContext(txn, remote.getId(), contacts); + checkAuthorInfoContext(txn, remote.getId(), contacts); authorInfo = contactManager.getAuthorInfo(txn, remote.getId()); assertEquals(UNVERIFIED, authorInfo.getStatus()); assertEquals(alias, contact.getAlias()); @@ -273,7 +250,7 @@ public class ContactManagerImplTest extends BrambleMockTestCase { // check verified contact contacts = singletonList(new Contact(new ContactId(1), remote, localAuthor.getId(), alias, true, true)); - checkAuthorStatusContext(txn, remote.getId(), contacts); + checkAuthorInfoContext(txn, remote.getId(), contacts); authorInfo = contactManager.getAuthorInfo(txn, remote.getId()); assertEquals(VERIFIED, authorInfo.getStatus()); assertEquals(alias, contact.getAlias()); @@ -289,7 +266,7 @@ public class ContactManagerImplTest extends BrambleMockTestCase { assertNull(authorInfo.getAlias()); } - private void checkAuthorStatusContext(Transaction txn, AuthorId authorId, + private void checkAuthorInfoContext(Transaction txn, AuthorId authorId, Collection contacts) throws DbException { context.checking(new Expectations() {{ oneOf(identityManager).getLocalAuthor(txn); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java index acf3a0212..77d7ef146 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java @@ -14,7 +14,6 @@ import org.briarproject.bramble.api.db.NoSuchGroupException; import org.briarproject.bramble.api.db.NoSuchLocalAuthorException; import org.briarproject.bramble.api.db.NoSuchMessageException; import org.briarproject.bramble.api.db.NoSuchTransportException; -import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.LocalAuthor; @@ -55,10 +54,10 @@ import org.jmock.Expectations; import org.junit.Test; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.concurrent.atomic.AtomicReference; +import static java.util.Arrays.asList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; @@ -211,8 +210,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { shutdown); assertFalse(db.open(key, null)); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { db.addLocalAuthor(transaction, localAuthor); assertEquals(contactId, db.addContact(transaction, author, localAuthor.getId(), true, true)); @@ -225,14 +223,11 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { db.removeGroup(transaction, group); db.removeContact(transaction, contactId); db.removeLocalAuthor(transaction, localAuthor.getId()); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); db.close(); } - @Test + @Test(expected = NoSuchGroupException.class) public void testLocalMessagesAreNotStoredUnlessGroupExists() throws Exception { context.checking(new Expectations() {{ @@ -245,15 +240,8 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - db.addLocalMessage(transaction, message, metadata, true); - fail(); - } catch (NoSuchGroupException expected) { - // Expected - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + db.addLocalMessage(transaction, message, metadata, true)); } @Test @@ -277,13 +265,8 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - db.addLocalMessage(transaction, message, metadata, true); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + db.addLocalMessage(transaction, message, metadata, true)); } @Test @@ -300,177 +283,145 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); try { - db.addTransportKeys(transaction, contactId, createTransportKeys()); + db.transaction(false, transaction -> + db.addTransportKeys(transaction, contactId, + createTransportKeys())); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.generateAck(transaction, contactId, 123); + db.transaction(false, transaction -> + db.generateAck(transaction, contactId, 123)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.generateBatch(transaction, contactId, 123, 456); + db.transaction(false, transaction -> + db.generateBatch(transaction, contactId, 123, 456)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.generateOffer(transaction, contactId, 123, 456); + db.transaction(false, transaction -> + db.generateOffer(transaction, contactId, 123, 456)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.generateRequest(transaction, contactId, 123); + db.transaction(false, transaction -> + db.generateRequest(transaction, contactId, 123)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getContact(transaction, contactId); + db.transaction(false, transaction -> + db.getContact(transaction, contactId)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessageStatus(transaction, contactId, groupId); + db.transaction(false, transaction -> + db.getMessageStatus(transaction, contactId, groupId)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessageStatus(transaction, contactId, messageId); + db.transaction(false, transaction -> + db.getMessageStatus(transaction, contactId, messageId)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getGroupVisibility(transaction, contactId, groupId); + db.transaction(false, transaction -> + db.getGroupVisibility(transaction, contactId, groupId)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { Ack a = new Ack(singletonList(messageId)); - db.receiveAck(transaction, contactId, a); + db.transaction(false, transaction -> + db.receiveAck(transaction, contactId, a)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.receiveMessage(transaction, contactId, message); + db.transaction(false, transaction -> + db.receiveMessage(transaction, contactId, message)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { Offer o = new Offer(singletonList(messageId)); - db.receiveOffer(transaction, contactId, o); + db.transaction(false, transaction -> + db.receiveOffer(transaction, contactId, o)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { Request r = new Request(singletonList(messageId)); - db.receiveRequest(transaction, contactId, r); + db.transaction(false, transaction -> + db.receiveRequest(transaction, contactId, r)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.removeContact(transaction, contactId); + db.transaction(false, transaction -> + db.removeContact(transaction, contactId)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.setContactActive(transaction, contactId, true); + db.transaction(false, transaction -> + db.setContactActive(transaction, contactId, true)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.setContactAlias(transaction, contactId, alias); + db.transaction(false, transaction -> + db.setContactAlias(transaction, contactId, alias)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.setGroupVisibility(transaction, contactId, groupId, SHARED); + db.transaction(false, transaction -> + db.setGroupVisibility(transaction, contactId, groupId, + SHARED)); fail(); } catch (NoSuchContactException expected) { // Expected - } finally { - db.endTransaction(transaction); } } @@ -489,34 +440,29 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); try { - db.addContact(transaction, author, localAuthor.getId(), true, true); + db.transaction(false, transaction -> + db.addContact(transaction, author, localAuthor.getId(), + true, true)); fail(); } catch (NoSuchLocalAuthorException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getLocalAuthor(transaction, localAuthor.getId()); + db.transaction(false, transaction -> + db.getLocalAuthor(transaction, localAuthor.getId())); fail(); } catch (NoSuchLocalAuthorException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.removeLocalAuthor(transaction, localAuthor.getId()); + db.transaction(false, transaction -> + db.removeLocalAuthor(transaction, localAuthor.getId())); fail(); } catch (NoSuchLocalAuthorException expected) { // Expected - } finally { - db.endTransaction(transaction); } } @@ -537,84 +483,70 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); try { - db.getGroup(transaction, groupId); + db.transaction(false, transaction -> + db.getGroup(transaction, groupId)); fail(); } catch (NoSuchGroupException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getGroupMetadata(transaction, groupId); + db.transaction(false, transaction -> + db.getGroupMetadata(transaction, groupId)); fail(); } catch (NoSuchGroupException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessageMetadata(transaction, groupId); + db.transaction(false, transaction -> + db.getMessageMetadata(transaction, groupId)); fail(); } catch (NoSuchGroupException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessageMetadata(transaction, groupId, new Metadata()); + db.transaction(false, transaction -> + db.getMessageMetadata(transaction, groupId, + new Metadata())); fail(); } catch (NoSuchGroupException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessageStatus(transaction, contactId, groupId); + db.transaction(false, transaction -> + db.getMessageStatus(transaction, contactId, groupId)); fail(); } catch (NoSuchGroupException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.mergeGroupMetadata(transaction, groupId, metadata); + db.transaction(false, transaction -> + db.mergeGroupMetadata(transaction, groupId, metadata)); fail(); } catch (NoSuchGroupException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.removeGroup(transaction, group); + db.transaction(false, transaction -> + db.removeGroup(transaction, group)); fail(); } catch (NoSuchGroupException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.setGroupVisibility(transaction, contactId, groupId, SHARED); + db.transaction(false, transaction -> + db.setGroupVisibility(transaction, contactId, groupId, + SHARED)); fail(); } catch (NoSuchGroupException expected) { // Expected - } finally { - db.endTransaction(transaction); } } @@ -635,114 +567,92 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); try { - db.deleteMessage(transaction, messageId); + db.transaction(false, transaction -> + db.deleteMessage(transaction, messageId)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.deleteMessageMetadata(transaction, messageId); + db.transaction(false, transaction -> + db.deleteMessageMetadata(transaction, messageId)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessage(transaction, messageId); + db.transaction(false, transaction -> + db.getMessage(transaction, messageId)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessageMetadata(transaction, messageId); + db.transaction(false, transaction -> + db.getMessageMetadata(transaction, messageId)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessageState(transaction, messageId); + db.transaction(false, transaction -> + db.getMessageState(transaction, messageId)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.getMessageStatus(transaction, contactId, messageId); + db.transaction(false, transaction -> + db.getMessageStatus(transaction, contactId, messageId)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.mergeMessageMetadata(transaction, messageId, metadata); + db.transaction(false, transaction -> + db.mergeMessageMetadata(transaction, messageId, metadata)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.setMessageShared(transaction, message.getId()); + db.transaction(false, transaction -> + db.setMessageShared(transaction, message.getId())); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.setMessageState(transaction, messageId, DELIVERED); + db.transaction(false, transaction -> + db.setMessageState(transaction, messageId, DELIVERED)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(true); try { - db.getMessageDependencies(transaction, messageId); + db.transaction(false, transaction -> + db.getMessageDependencies(transaction, messageId)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(true); try { - db.getMessageDependents(transaction, messageId); + db.transaction(false, transaction -> + db.getMessageDependents(transaction, messageId)); fail(); } catch (NoSuchMessageException expected) { // Expected - } finally { - db.endTransaction(transaction); } } @@ -750,30 +660,6 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { public void testVariousMethodsThrowExceptionIfTransportIsMissing() throws Exception { context.checking(new Expectations() {{ - // startTransaction() - oneOf(database).startTransaction(); - will(returnValue(txn)); - // registerLocalAuthor() - oneOf(database).containsLocalAuthor(txn, localAuthor.getId()); - will(returnValue(false)); - oneOf(database).addLocalAuthor(txn, localAuthor); - oneOf(eventBus).broadcast(with(any(LocalAuthorAddedEvent.class))); - // addContact() - oneOf(database).containsLocalAuthor(txn, localAuthor.getId()); - will(returnValue(true)); - oneOf(database).containsLocalAuthor(txn, author.getId()); - will(returnValue(false)); - oneOf(database).containsContact(txn, author.getId(), - localAuthor.getId()); - will(returnValue(false)); - oneOf(database).addContact(txn, author, localAuthor.getId(), - true, true); - will(returnValue(contactId)); - oneOf(eventBus).broadcast(with(any(ContactAddedEvent.class))); - oneOf(eventBus).broadcast(with(any( - ContactStatusChangedEvent.class))); - // endTransaction() - oneOf(database).commitTransaction(txn); // Check whether the transport is in the DB (which it's not) exactly(5).of(database).startTransaction(); will(returnValue(txn)); @@ -784,72 +670,52 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); try { - db.addLocalAuthor(transaction, localAuthor); - assertEquals(contactId, db.addContact(transaction, author, - localAuthor.getId(), true, true)); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } - - transaction = db.startTransaction(false); - try { - db.getTransportKeys(transaction, transportId); + db.transaction(false, transaction -> + db.getTransportKeys(transaction, transportId)); fail(); } catch (NoSuchTransportException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.incrementStreamCounter(transaction, transportId, keySetId); + db.transaction(false, transaction -> + db.incrementStreamCounter(transaction, transportId, + keySetId)); fail(); } catch (NoSuchTransportException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.removeTransport(transaction, transportId); + db.transaction(false, transaction -> + db.removeTransport(transaction, transportId)); fail(); } catch (NoSuchTransportException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.removeTransportKeys(transaction, transportId, keySetId); + db.transaction(false, transaction -> + db.removeTransportKeys(transaction, transportId, keySetId)); fail(); } catch (NoSuchTransportException expected) { // Expected - } finally { - db.endTransaction(transaction); } - transaction = db.startTransaction(false); try { - db.setReorderingWindow(transaction, keySetId, transportId, 0, 0, - new byte[REORDERING_WINDOW_SIZE / 8]); + db.transaction(false, transaction -> + db.setReorderingWindow(transaction, keySetId, transportId, + 0, 0, new byte[REORDERING_WINDOW_SIZE / 8])); fail(); } catch (NoSuchTransportException expected) { // Expected - } finally { - db.endTransaction(transaction); } } @Test public void testGenerateAck() throws Exception { - Collection messagesToAck = Arrays.asList(messageId, - messageId1); + Collection messagesToAck = asList(messageId, messageId1); context.checking(new Expectations() {{ oneOf(database).startTransaction(); will(returnValue(txn)); @@ -863,21 +729,17 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { Ack a = db.generateAck(transaction, contactId, 123); assertNotNull(a); assertEquals(messagesToAck, a.getMessageIds()); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } @Test public void testGenerateBatch() throws Exception { - Collection ids = Arrays.asList(messageId, messageId1); - Collection messages = Arrays.asList(message, message1); + Collection ids = asList(messageId, messageId1); + Collection messages = asList(message, message1); context.checking(new Expectations() {{ oneOf(database).startTransaction(); will(returnValue(txn)); @@ -901,20 +763,15 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - assertEquals(messages, db.generateBatch(transaction, contactId, - MAX_MESSAGE_LENGTH * 2, maxLatency)); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + assertEquals(messages, db.generateBatch(transaction, contactId, + MAX_MESSAGE_LENGTH * 2, maxLatency))); } @Test public void testGenerateOffer() throws Exception { MessageId messageId1 = new MessageId(getRandomId()); - Collection ids = Arrays.asList(messageId, messageId1); + Collection ids = asList(messageId, messageId1); context.checking(new Expectations() {{ oneOf(database).startTransaction(); will(returnValue(txn)); @@ -931,21 +788,17 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { Offer o = db.generateOffer(transaction, contactId, 123, maxLatency); assertNotNull(o); assertEquals(ids, o.getMessageIds()); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } @Test public void testGenerateRequest() throws Exception { MessageId messageId1 = new MessageId(getRandomId()); - Collection ids = Arrays.asList(messageId, messageId1); + Collection ids = asList(messageId, messageId1); context.checking(new Expectations() {{ oneOf(database).startTransaction(); will(returnValue(txn)); @@ -959,21 +812,17 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { Request r = db.generateRequest(transaction, contactId, 123); assertNotNull(r); assertEquals(ids, r.getMessageIds()); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } @Test public void testGenerateRequestedBatch() throws Exception { - Collection ids = Arrays.asList(messageId, messageId1); - Collection messages = Arrays.asList(message, message1); + Collection ids = asList(messageId, messageId1); + Collection messages = asList(message, message1); context.checking(new Expectations() {{ oneOf(database).startTransaction(); will(returnValue(txn)); @@ -997,14 +846,9 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - assertEquals(messages, db.generateRequestedBatch(transaction, - contactId, MAX_MESSAGE_LENGTH * 2, maxLatency)); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + assertEquals(messages, db.generateRequestedBatch(transaction, + contactId, MAX_MESSAGE_LENGTH * 2, maxLatency))); } @Test @@ -1023,14 +867,10 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { Ack a = new Ack(singletonList(messageId)); db.receiveAck(transaction, contactId, a); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } @Test @@ -1065,15 +905,11 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { // Receive the message twice db.receiveMessage(transaction, contactId, message); db.receiveMessage(transaction, contactId, message); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } @Test @@ -1097,13 +933,8 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - db.receiveMessage(transaction, contactId, message); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + db.receiveMessage(transaction, contactId, message)); } @Test @@ -1120,13 +951,8 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - db.receiveMessage(transaction, contactId, message); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + db.receiveMessage(transaction, contactId, message)); } @Test @@ -1165,15 +991,10 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - Offer o = new Offer(Arrays.asList(messageId, messageId1, - messageId2, messageId3)); - db.receiveOffer(transaction, contactId, o); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + Offer o = new Offer(asList(messageId, messageId1, + messageId2, messageId3)); + db.transaction(false, transaction -> + db.receiveOffer(transaction, contactId, o)); } @Test @@ -1193,14 +1014,9 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - Request r = new Request(singletonList(messageId)); - db.receiveRequest(transaction, contactId, r); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + Request r = new Request(singletonList(messageId)); + db.transaction(false, transaction -> + db.receiveRequest(transaction, contactId, r)); } @Test @@ -1228,13 +1044,9 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - db.setGroupVisibility(transaction, contactId, groupId, VISIBLE); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + db.setGroupVisibility(transaction, contactId, groupId, + VISIBLE)); GroupVisibilityUpdatedEvent e = event.get(); assertNotNull(e); @@ -1266,13 +1078,9 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - db.setGroupVisibility(transaction, contactId, groupId, INVISIBLE); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + db.setGroupVisibility(transaction, contactId, groupId, + INVISIBLE)); GroupVisibilityUpdatedEvent e = event.get(); assertNotNull(e); @@ -1296,13 +1104,9 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { - db.setGroupVisibility(transaction, contactId, groupId, VISIBLE); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + db.transaction(false, transaction -> + db.setGroupVisibility(transaction, contactId, groupId, + VISIBLE)); } @Test @@ -1330,14 +1134,10 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { db.updateTransportKeys(transaction, keys); assertEquals(keys, db.getTransportKeys(transaction, transportId)); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } @Test @@ -1373,8 +1173,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(true); - try { + db.transaction(true, transaction -> { // With visible group - return stored status Collection statuses = db.getMessageStatus(transaction, contactId, groupId); @@ -1392,10 +1191,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { assertEquals(contactId, s.getContactId()); assertFalse(s.isSent()); assertFalse(s.isSeen()); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } @Test @@ -1427,8 +1223,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(true); - try { + db.transaction(true, transaction -> { // With visible group - return stored status MessageStatus s = db.getMessageStatus(transaction, contactId, messageId); @@ -1442,10 +1237,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { assertEquals(contactId, s.getContactId()); assertFalse(s.isSent()); assertFalse(s.isSeen()); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } private TransportKeys createTransportKeys() { @@ -1497,16 +1289,12 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { // First merge should broadcast an event db.mergeSettings(transaction, update, "namespace"); // Second merge should not broadcast an event db.mergeSettings(transaction, update, "namespace"); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); } @Test(expected = IllegalStateException.class) @@ -1565,14 +1353,13 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); try { - db.addContact(transaction, author, localAuthor.getId(), true, true); + db.transaction(false, transaction -> + db.addContact(transaction, author, localAuthor.getId(), + true, true)); fail(); } catch (ContactExistsException expected) { // Expected - } finally { - db.endTransaction(transaction); } } @@ -1595,14 +1382,13 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); - Transaction transaction = db.startTransaction(false); try { - db.addContact(transaction, author, localAuthor.getId(), true, true); + db.transaction(false, transaction -> + db.addContact(transaction, author, localAuthor.getId(), + true, true)); fail(); } catch (ContactExistsException expected) { // Expected - } finally { - db.endTransaction(transaction); } } @@ -1658,8 +1444,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { shutdown); assertFalse(db.open(key, null)); - Transaction transaction = db.startTransaction(false); - try { + db.transaction(false, transaction -> { db.addLocalMessage(transaction, message, metadata, true); Collection dependencies = new ArrayList<>(2); dependencies.add(messageId1); @@ -1667,10 +1452,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { db.addMessageDependencies(transaction, message, dependencies); db.getMessageDependencies(transaction, messageId); db.getMessageDependents(transaction, messageId); - db.commitTransaction(transaction); - } finally { - db.endTransaction(transaction); - } + }); db.close(); } } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java index 622a04e81..0ed0b8d22 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.jmock.Expectations; import org.junit.Before; import org.junit.Test; @@ -64,13 +65,10 @@ public class IdentityManagerImplTest extends BrambleMockTestCase { } @Test - public void testRegisterAndStoreLocalAuthor() throws DbException { - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + public void testRegisterAndStoreLocalAuthor() throws Exception { + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(db).addLocalAuthor(txn, localAuthor); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); identityManager.registerLocalAuthor(localAuthor); @@ -79,14 +77,11 @@ public class IdentityManagerImplTest extends BrambleMockTestCase { } @Test - public void testGetLocalAuthor() throws DbException { - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + public void testGetLocalAuthor() throws Exception { + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getLocalAuthors(txn); will(returnValue(localAuthors)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(localAuthor, identityManager.getLocalAuthor()); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java index 8f6345e03..056a19bfc 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java @@ -21,16 +21,18 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.jmock.Expectations; import org.junit.Test; -import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import static java.util.Arrays.asList; import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; @@ -351,14 +353,11 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { new BdfEntry("local", true) )); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(clientHelper).getMessageMetadataAsDictionary(txn, localGroup.getId()); will(returnValue(messageMetadata)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); TransportPropertyManagerImpl t = createInstance(); @@ -386,9 +385,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { )); BdfList fooUpdate = BdfList.of("foo", 1, fooPropertiesDict); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(clientHelper).getMessageMetadataAsDictionary(txn, localGroup.getId()); will(returnValue(messageMetadata)); @@ -397,8 +395,6 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { oneOf(clientHelper).parseAndValidateTransportProperties( fooPropertiesDict); will(returnValue(fooProperties)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); TransportPropertyManagerImpl t = createInstance(); @@ -413,8 +409,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { Contact contact1 = getContact(false); Contact contact2 = getContact(true); Contact contact3 = getContact(true); - List contacts = - Arrays.asList(contact1, contact2, contact3); + List contacts = asList(contact1, contact2, contact3); Group contactGroup2 = getGroup(CLIENT_ID, MAJOR_VERSION); Group contactGroup3 = getGroup(CLIENT_ID, MAJOR_VERSION); Map messageMetadata3 = @@ -442,9 +437,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { )); BdfList fooUpdate = BdfList.of("foo", 1, fooPropertiesDict); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(true); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getContacts(txn); will(returnValue(contacts)); // First contact: skipped because not active @@ -467,8 +461,6 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { oneOf(clientHelper).parseAndValidateTransportProperties( fooPropertiesDict); will(returnValue(fooProperties)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); TransportPropertyManagerImpl t = createInstance(); @@ -485,17 +477,16 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { throws Exception { Transaction txn = new Transaction(null, false); MessageId updateId = new MessageId(getRandomId()); - Map messageMetadata = - Collections.singletonMap(updateId, BdfDictionary.of( + Map messageMetadata = singletonMap(updateId, + BdfDictionary.of( new BdfEntry("transportId", "foo"), new BdfEntry("version", 1), new BdfEntry("local", true) )); BdfList update = BdfList.of("foo", 1, fooPropertiesDict); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Merge the new properties with the existing properties oneOf(clientHelper).getMessageMetadataAsDictionary(txn, localGroup.getId()); @@ -506,8 +497,6 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { fooPropertiesDict); will(returnValue(fooProperties)); // Properties are unchanged so we're done - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); TransportPropertyManagerImpl t = createInstance(); @@ -520,9 +509,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { Contact contact = getContact(true); Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // There are no existing properties to merge with oneOf(clientHelper).getMessageMetadataAsDictionary(txn, localGroup.getId()); @@ -541,8 +529,6 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { will(returnValue(Collections.emptyMap())); expectStoreMessage(txn, contactGroup.getId(), "foo", fooPropertiesDict, 1, true, true); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); TransportPropertyManagerImpl t = createInstance(); @@ -561,10 +547,10 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { ); MessageId localGroupUpdateId = new MessageId(getRandomId()); Map localGroupMessageMetadata = - Collections.singletonMap(localGroupUpdateId, oldMetadata); + singletonMap(localGroupUpdateId, oldMetadata); MessageId contactGroupUpdateId = new MessageId(getRandomId()); Map contactGroupMessageMetadata = - Collections.singletonMap(contactGroupUpdateId, oldMetadata); + singletonMap(contactGroupUpdateId, oldMetadata); TransportProperties oldProperties = new TransportProperties(); oldProperties.put("fooKey1", "oldFooValue1"); BdfDictionary oldPropertiesDict = BdfDictionary.of( @@ -572,9 +558,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { ); BdfList oldUpdate = BdfList.of("foo", 1, oldPropertiesDict); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Merge the new properties with the existing properties oneOf(clientHelper).getMessageMetadataAsDictionary(txn, localGroup.getId()); @@ -602,8 +587,6 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { fooPropertiesDict, 2, true, true); // Delete the previous update oneOf(db).removeMessage(txn, contactGroupUpdateId); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); TransportPropertyManagerImpl t = createInstance(); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java index 3440621a4..fdf052b59 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java @@ -11,8 +11,8 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.SyncRecordWriter; import org.briarproject.bramble.api.transport.StreamWriter; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.briarproject.bramble.test.ImmediateExecutor; -import org.jmock.Expectations; import org.junit.Test; import java.util.concurrent.Executor; @@ -45,24 +45,20 @@ public class SimplexOutgoingSessionTest extends BrambleMockTestCase { Transaction noAckTxn = new Transaction(null, false); Transaction noMsgTxn = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Add listener oneOf(eventBus).addListener(session); // No acks to send - oneOf(db).startTransaction(false); - will(returnValue(noAckTxn)); + oneOf(db).transactionWithResult(with(false), + withDbCallable(noAckTxn)); oneOf(db).generateAck(noAckTxn, contactId, MAX_MESSAGE_IDS); will(returnValue(null)); - oneOf(db).commitTransaction(noAckTxn); - oneOf(db).endTransaction(noAckTxn); // No messages to send - oneOf(db).startTransaction(false); - will(returnValue(noMsgTxn)); + oneOf(db).transactionWithResult(with(false), + withDbCallable(noMsgTxn)); oneOf(db).generateBatch(with(noMsgTxn), with(contactId), with(any(int.class)), with(MAX_LATENCY)); will(returnValue(null)); - oneOf(db).commitTransaction(noMsgTxn); - oneOf(db).endTransaction(noMsgTxn); // Send the end of stream marker oneOf(streamWriter).sendEndOfStream(); // Remove listener @@ -83,41 +79,33 @@ public class SimplexOutgoingSessionTest extends BrambleMockTestCase { Transaction msgTxn = new Transaction(null, false); Transaction noMsgTxn = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Add listener oneOf(eventBus).addListener(session); // One ack to send - oneOf(db).startTransaction(false); - will(returnValue(ackTxn)); + oneOf(db).transactionWithResult(with(false), + withDbCallable(ackTxn)); oneOf(db).generateAck(ackTxn, contactId, MAX_MESSAGE_IDS); will(returnValue(ack)); - oneOf(db).commitTransaction(ackTxn); - oneOf(db).endTransaction(ackTxn); oneOf(recordWriter).writeAck(ack); // One message to send - oneOf(db).startTransaction(false); - will(returnValue(msgTxn)); + oneOf(db).transactionWithResult(with(false), + withDbCallable(msgTxn)); oneOf(db).generateBatch(with(msgTxn), with(contactId), with(any(int.class)), with(MAX_LATENCY)); will(returnValue(singletonList(message))); - oneOf(db).commitTransaction(msgTxn); - oneOf(db).endTransaction(msgTxn); oneOf(recordWriter).writeMessage(message); // No more acks - oneOf(db).startTransaction(false); - will(returnValue(noAckTxn)); + oneOf(db).transactionWithResult(with(false), + withDbCallable(noAckTxn)); oneOf(db).generateAck(noAckTxn, contactId, MAX_MESSAGE_IDS); will(returnValue(null)); - oneOf(db).commitTransaction(noAckTxn); - oneOf(db).endTransaction(noAckTxn); // No more messages - oneOf(db).startTransaction(false); - will(returnValue(noMsgTxn)); + oneOf(db).transactionWithResult(with(false), + withDbCallable(noMsgTxn)); oneOf(db).generateBatch(with(noMsgTxn), with(contactId), with(any(int.class)), with(MAX_LATENCY)); will(returnValue(null)); - oneOf(db).commitTransaction(noMsgTxn); - oneOf(db).endTransaction(noMsgTxn); // Send the end of stream marker oneOf(streamWriter).sendEndOfStream(); // Remove listener diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java index 5225f148d..f85447c10 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java @@ -18,16 +18,16 @@ import org.briarproject.bramble.api.sync.ValidationManager.MessageValidator; import org.briarproject.bramble.api.sync.ValidationManager.State; import org.briarproject.bramble.api.sync.event.MessageAddedEvent; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.briarproject.bramble.test.ImmediateExecutor; -import org.jmock.Expectations; import org.junit.Before; import org.junit.Test; -import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.Executor; +import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; @@ -83,28 +83,19 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn1 = new Transaction(null, true); Transaction txn2 = new Transaction(null, true); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // validateOutstandingMessages() - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessagesToValidate(txn); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // deliverOutstandingMessages() - oneOf(db).startTransaction(true); - will(returnValue(txn1)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn1)); oneOf(db).getPendingMessages(txn1); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // shareOutstandingMessages() - oneOf(db).startTransaction(true); - will(returnValue(txn2)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn2)); oneOf(db).getMessagesToShare(txn2); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); }}); vm.startService(); @@ -121,29 +112,22 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn5 = new Transaction(null, true); Transaction txn6 = new Transaction(null, true); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Get messages to validate - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessagesToValidate(txn); - will(returnValue(Arrays.asList(messageId, messageId1))); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); + will(returnValue(asList(messageId, messageId1))); // Load the first raw message and group - oneOf(db).startTransaction(true); - will(returnValue(txn1)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn1)); oneOf(db).getMessage(txn1, messageId); will(returnValue(message)); oneOf(db).getGroup(txn1, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Validate the first message: valid oneOf(validator).validateMessage(message, group); will(returnValue(validResult)); // Store the validation result for the first message - oneOf(db).startTransaction(false); - will(returnValue(txn2)); + oneOf(db).transaction(with(false), withDbRunnable(txn2)); oneOf(db).mergeMessageMetadata(txn2, messageId, metadata); // Deliver the first message oneOf(hook).incomingMessage(txn2, message, metadata); @@ -152,23 +136,17 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Get any pending dependents oneOf(db).getMessageDependents(txn2, messageId); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); // Load the second raw message and group - oneOf(db).startTransaction(true); - will(returnValue(txn3)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn3)); oneOf(db).getMessage(txn3, messageId1); will(returnValue(message1)); oneOf(db).getGroup(txn3, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn3); - oneOf(db).endTransaction(txn3); // Validate the second message: invalid oneOf(validator).validateMessage(message1, group); will(throwException(new InvalidMessageException())); // Store the validation result for the second message - oneOf(db).startTransaction(false); - will(returnValue(txn4)); + oneOf(db).transaction(with(false), withDbRunnable(txn4)); oneOf(db).getMessageState(txn4, messageId1); will(returnValue(UNKNOWN)); oneOf(db).setMessageState(txn4, messageId1, INVALID); @@ -177,22 +155,14 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Recursively invalidate any dependents oneOf(db).getMessageDependents(txn4, messageId1); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn4); - oneOf(db).endTransaction(txn4); // Get pending messages to deliver - oneOf(db).startTransaction(true); - will(returnValue(txn5)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn5)); oneOf(db).getPendingMessages(txn5); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn5); - oneOf(db).endTransaction(txn5); // Get messages to share - oneOf(db).startTransaction(true); - will(returnValue(txn6)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn6)); oneOf(db).getMessagesToShare(txn6); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn6); - oneOf(db).endTransaction(txn6); }}); vm.startService(); @@ -206,24 +176,17 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn3 = new Transaction(null, false); Transaction txn4 = new Transaction(null, true); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Get messages to validate - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessagesToValidate(txn); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Get pending messages to deliver - oneOf(db).startTransaction(true); - will(returnValue(txn1)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn1)); oneOf(db).getPendingMessages(txn1); will(returnValue(singletonList(messageId))); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Check whether the message is ready to deliver - oneOf(db).startTransaction(false); - will(returnValue(txn2)); + oneOf(db).transaction(with(false), withDbRunnable(txn2)); oneOf(db).getMessageState(txn2, messageId); will(returnValue(PENDING)); oneOf(db).getMessageDependencies(txn2, messageId); @@ -242,11 +205,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Get any pending dependents oneOf(db).getMessageDependents(txn2, messageId); will(returnValue(singletonMap(messageId2, PENDING))); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); // Check whether the dependent is ready to deliver - oneOf(db).startTransaction(false); - will(returnValue(txn3)); + oneOf(db).transaction(with(false), withDbRunnable(txn3)); oneOf(db).getMessageState(txn3, messageId2); will(returnValue(PENDING)); oneOf(db).getMessageDependencies(txn3, messageId2); @@ -265,16 +225,11 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Get any pending dependents oneOf(db).getMessageDependents(txn3, messageId2); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn3); - oneOf(db).endTransaction(txn3); // Get messages to share - oneOf(db).startTransaction(true); - will(returnValue(txn4)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn4)); oneOf(db).getMessagesToShare(txn4); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn4); - oneOf(db).endTransaction(txn4); }}); vm.startService(); @@ -288,45 +243,30 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn3 = new Transaction(null, false); Transaction txn4 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // No messages to validate - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessagesToValidate(txn); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // No pending messages to deliver - oneOf(db).startTransaction(true); - will(returnValue(txn1)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn1)); oneOf(db).getPendingMessages(txn1); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Get messages to share - oneOf(db).startTransaction(true); - will(returnValue(txn2)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn2)); oneOf(db).getMessagesToShare(txn2); will(returnValue(singletonList(messageId))); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); // Share message and get dependencies - oneOf(db).startTransaction(false); - will(returnValue(txn3)); + oneOf(db).transaction(with(false), withDbRunnable(txn3)); oneOf(db).setMessageShared(txn3, messageId); oneOf(db).getMessageDependencies(txn3, messageId); will(returnValue(singletonMap(messageId2, DELIVERED))); - oneOf(db).commitTransaction(txn3); - oneOf(db).endTransaction(txn3); // Share dependency - oneOf(db).startTransaction(false); - will(returnValue(txn4)); + oneOf(db).transaction(with(false), withDbRunnable(txn4)); oneOf(db).setMessageShared(txn4, messageId2); oneOf(db).getMessageDependencies(txn4, messageId2); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn4); - oneOf(db).endTransaction(txn4); }}); vm.startService(); @@ -338,20 +278,16 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn1 = new Transaction(null, false); Transaction txn2 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Load the group - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroup(txn, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Validate the message: valid oneOf(validator).validateMessage(message, group); will(returnValue(validResultWithDependencies)); // Store the validation result - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); oneOf(db).addMessageDependencies(txn1, message, validResultWithDependencies.getDependencies()); oneOf(db).getMessageDependencies(txn1, messageId); @@ -366,16 +302,11 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { will(returnValue(emptyMap())); // Share message oneOf(db).setMessageShared(txn1, messageId); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Share dependencies - oneOf(db).startTransaction(false); - will(returnValue(txn2)); + oneOf(db).transaction(with(false), withDbRunnable(txn2)); oneOf(db).setMessageShared(txn2, messageId1); oneOf(db).getMessageDependencies(txn2, messageId1); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); }}); vm.eventOccurred(new MessageAddedEvent(message, contactId)); @@ -391,36 +322,26 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn4 = new Transaction(null, true); Transaction txn5 = new Transaction(null, true); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Get messages to validate - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessagesToValidate(txn); - will(returnValue(Arrays.asList(messageId, messageId1))); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); + will(returnValue(asList(messageId, messageId1))); // Load the first raw message - *gasp* it's gone! - oneOf(db).startTransaction(true); - will(returnValue(txn1)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn1)); oneOf(db).getMessage(txn1, messageId); will(throwException(new NoSuchMessageException())); - never(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Load the second raw message and group - oneOf(db).startTransaction(true); - will(returnValue(txn2)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn2)); oneOf(db).getMessage(txn2, messageId1); will(returnValue(message1)); oneOf(db).getGroup(txn2, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); // Validate the second message: invalid oneOf(validator).validateMessage(message1, group); will(throwException(new InvalidMessageException())); // Invalidate the second message - oneOf(db).startTransaction(false); - will(returnValue(txn3)); + oneOf(db).transaction(with(false), withDbRunnable(txn3)); oneOf(db).getMessageState(txn3, messageId1); will(returnValue(UNKNOWN)); oneOf(db).setMessageState(txn3, messageId1, INVALID); @@ -429,22 +350,14 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Recursively invalidate dependents oneOf(db).getMessageDependents(txn3, messageId1); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn3); - oneOf(db).endTransaction(txn3); // Get pending messages to deliver - oneOf(db).startTransaction(true); - will(returnValue(txn4)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn4)); oneOf(db).getPendingMessages(txn4); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn4); - oneOf(db).endTransaction(txn4); // Get messages to share - oneOf(db).startTransaction(true); - will(returnValue(txn5)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn5)); oneOf(db).getMessagesToShare(txn5); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn5); - oneOf(db).endTransaction(txn5); }}); vm.startService(); @@ -460,39 +373,29 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn4 = new Transaction(null, true); Transaction txn5 = new Transaction(null, true); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Get messages to validate - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getMessagesToValidate(txn); - will(returnValue(Arrays.asList(messageId, messageId1))); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); + will(returnValue(asList(messageId, messageId1))); // Load the first raw message - oneOf(db).startTransaction(true); - will(returnValue(txn1)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn1)); oneOf(db).getMessage(txn1, messageId); will(returnValue(message)); // Load the group - *gasp* it's gone! oneOf(db).getGroup(txn1, groupId); will(throwException(new NoSuchGroupException())); - never(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Load the second raw message and group - oneOf(db).startTransaction(true); - will(returnValue(txn2)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn2)); oneOf(db).getMessage(txn2, messageId1); will(returnValue(message1)); oneOf(db).getGroup(txn2, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); // Validate the second message: invalid oneOf(validator).validateMessage(message1, group); will(throwException(new InvalidMessageException())); // Store the validation result for the second message - oneOf(db).startTransaction(false); - will(returnValue(txn3)); + oneOf(db).transaction(with(false), withDbRunnable(txn3)); oneOf(db).getMessageState(txn3, messageId1); will(returnValue(UNKNOWN)); oneOf(db).setMessageState(txn3, messageId1, INVALID); @@ -501,22 +404,14 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Recursively invalidate dependents oneOf(db).getMessageDependents(txn3, messageId1); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn3); - oneOf(db).endTransaction(txn3); // Get pending messages to deliver - oneOf(db).startTransaction(true); - will(returnValue(txn4)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn4)); oneOf(db).getPendingMessages(txn4); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn4); - oneOf(db).endTransaction(txn4); // Get messages to share - oneOf(db).startTransaction(true); - will(returnValue(txn5)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn5)); oneOf(db).getMessagesToShare(txn5); will(returnValue(emptyList())); - oneOf(db).commitTransaction(txn5); - oneOf(db).endTransaction(txn5); }}); vm.startService(); @@ -527,20 +422,16 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn = new Transaction(null, true); Transaction txn1 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Load the group - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroup(txn, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Validate the message: valid oneOf(validator).validateMessage(message, group); will(returnValue(validResult)); // Store the validation result - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); oneOf(db).mergeMessageMetadata(txn1, messageId, metadata); // Deliver the message oneOf(hook).incomingMessage(txn1, message, metadata); @@ -549,8 +440,6 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Get any pending dependents oneOf(db).getMessageDependents(txn1, messageId); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); }}); vm.eventOccurred(new MessageAddedEvent(message, contactId)); @@ -567,28 +456,22 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn = new Transaction(null, true); Transaction txn1 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Load the group - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroup(txn, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Validate the message: valid oneOf(validator).validateMessage(message, group); will(returnValue(validResultWithDependencies)); // Store the validation result - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); oneOf(db).addMessageDependencies(txn1, message, validResultWithDependencies.getDependencies()); oneOf(db).getMessageDependencies(txn1, messageId); will(returnValue(singletonMap(messageId1, UNKNOWN))); oneOf(db).mergeMessageMetadata(txn1, messageId, metadata); oneOf(db).setMessageState(txn1, messageId, PENDING); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); }}); vm.eventOccurred(new MessageAddedEvent(message, contactId)); @@ -600,20 +483,16 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn = new Transaction(null, true); Transaction txn1 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Load the group - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroup(txn, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Validate the message: valid oneOf(validator).validateMessage(message, group); will(returnValue(validResultWithDependencies)); // Store the validation result - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); oneOf(db).addMessageDependencies(txn1, message, validResultWithDependencies.getDependencies()); oneOf(db).getMessageDependencies(txn1, messageId); @@ -626,8 +505,6 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Get any pending dependents oneOf(db).getMessageDependents(txn1, messageId); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); }}); vm.eventOccurred(new MessageAddedEvent(message, contactId)); @@ -640,20 +517,16 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn1 = new Transaction(null, false); Transaction txn2 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Load the group - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroup(txn, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Validate the message: valid oneOf(validator).validateMessage(message, group); will(returnValue(validResultWithDependencies)); // Store the validation result - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); oneOf(db).addMessageDependencies(txn1, message, validResultWithDependencies.getDependencies()); // Check for invalid dependencies @@ -668,11 +541,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Recursively invalidate dependents oneOf(db).getMessageDependents(txn1, messageId); will(returnValue(singletonMap(messageId2, UNKNOWN))); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Invalidate dependent in a new transaction - oneOf(db).startTransaction(false); - will(returnValue(txn2)); + oneOf(db).transaction(with(false), withDbRunnable(txn2)); oneOf(db).getMessageState(txn2, messageId2); will(returnValue(UNKNOWN)); oneOf(db).setMessageState(txn2, messageId2, INVALID); @@ -680,8 +550,6 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { oneOf(db).deleteMessageMetadata(txn2, messageId2); oneOf(db).getMessageDependents(txn2, messageId2); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); }}); vm.eventOccurred(new MessageAddedEvent(message, contactId)); @@ -702,20 +570,16 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn5 = new Transaction(null, false); Transaction txn6 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Load the group - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroup(txn, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Validate the message: invalid oneOf(validator).validateMessage(message, group); will(throwException(new InvalidMessageException())); // Invalidate the message - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); oneOf(db).getMessageState(txn1, messageId); will(returnValue(UNKNOWN)); oneOf(db).setMessageState(txn1, messageId, INVALID); @@ -724,11 +588,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // The message has two dependents: 1 and 2 oneOf(db).getMessageDependents(txn1, messageId); will(returnValue(twoDependents)); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Invalidate message 1 - oneOf(db).startTransaction(false); - will(returnValue(txn2)); + oneOf(db).transaction(with(false), withDbRunnable(txn2)); oneOf(db).getMessageState(txn2, messageId1); will(returnValue(PENDING)); oneOf(db).setMessageState(txn2, messageId1, INVALID); @@ -737,11 +598,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Message 1 has one dependent: 3 oneOf(db).getMessageDependents(txn2, messageId1); will(returnValue(singletonMap(messageId3, PENDING))); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); // Invalidate message 2 - oneOf(db).startTransaction(false); - will(returnValue(txn3)); + oneOf(db).transaction(with(false), withDbRunnable(txn3)); oneOf(db).getMessageState(txn3, messageId2); will(returnValue(PENDING)); oneOf(db).setMessageState(txn3, messageId2, INVALID); @@ -750,11 +608,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Message 2 has one dependent: 3 (same dependent as 1) oneOf(db).getMessageDependents(txn3, messageId2); will(returnValue(singletonMap(messageId3, PENDING))); - oneOf(db).commitTransaction(txn3); - oneOf(db).endTransaction(txn3); // Invalidate message 3 (via 1) - oneOf(db).startTransaction(false); - will(returnValue(txn4)); + oneOf(db).transaction(with(false), withDbRunnable(txn4)); oneOf(db).getMessageState(txn4, messageId3); will(returnValue(PENDING)); oneOf(db).setMessageState(txn4, messageId3, INVALID); @@ -763,18 +618,12 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Message 3 has one dependent: 4 oneOf(db).getMessageDependents(txn4, messageId3); will(returnValue(singletonMap(messageId4, PENDING))); - oneOf(db).commitTransaction(txn4); - oneOf(db).endTransaction(txn4); // Invalidate message 3 (again, via 2) - oneOf(db).startTransaction(false); - will(returnValue(txn5)); + oneOf(db).transaction(with(false), withDbRunnable(txn5)); oneOf(db).getMessageState(txn5, messageId3); will(returnValue(INVALID)); // Already invalidated - oneOf(db).commitTransaction(txn5); - oneOf(db).endTransaction(txn5); // Invalidate message 4 (via 1 and 3) - oneOf(db).startTransaction(false); - will(returnValue(txn6)); + oneOf(db).transaction(with(false), withDbRunnable(txn6)); oneOf(db).getMessageState(txn6, messageId4); will(returnValue(PENDING)); oneOf(db).setMessageState(txn6, messageId4, INVALID); @@ -783,8 +632,6 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Message 4 has no dependents oneOf(db).getMessageDependents(txn6, messageId4); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn6); - oneOf(db).endTransaction(txn6); }}); vm.eventOccurred(new MessageAddedEvent(message, contactId)); @@ -810,20 +657,16 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn5 = new Transaction(null, false); Transaction txn6 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Load the group - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroup(txn, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Validate the message: valid oneOf(validator).validateMessage(message, group); will(returnValue(validResult)); // Store the validation result - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); oneOf(db).mergeMessageMetadata(txn1, messageId, metadata); // Deliver the message oneOf(hook).incomingMessage(txn1, message, metadata); @@ -832,11 +675,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // The message has two pending dependents: 1 and 2 oneOf(db).getMessageDependents(txn1, messageId); will(returnValue(twoDependents)); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Check whether message 1 is ready to be delivered - oneOf(db).startTransaction(false); - will(returnValue(txn2)); + oneOf(db).transaction(with(false), withDbRunnable(txn2)); oneOf(db).getMessageState(txn2, messageId1); will(returnValue(PENDING)); oneOf(db).getMessageDependencies(txn2, messageId1); @@ -855,11 +695,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Message 1 has one pending dependent: 3 oneOf(db).getMessageDependents(txn2, messageId1); will(returnValue(singletonMap(messageId3, PENDING))); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); // Check whether message 2 is ready to be delivered - oneOf(db).startTransaction(false); - will(returnValue(txn3)); + oneOf(db).transaction(with(false), withDbRunnable(txn3)); oneOf(db).getMessageState(txn3, messageId2); will(returnValue(PENDING)); oneOf(db).getMessageDependencies(txn3, messageId2); @@ -878,11 +715,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Message 2 has one pending dependent: 3 (same dependent as 1) oneOf(db).getMessageDependents(txn3, messageId2); will(returnValue(singletonMap(messageId3, PENDING))); - oneOf(db).commitTransaction(txn3); - oneOf(db).endTransaction(txn3); // Check whether message 3 is ready to be delivered (via 1) - oneOf(db).startTransaction(false); - will(returnValue(txn4)); + oneOf(db).transaction(with(false), withDbRunnable(txn4)); oneOf(db).getMessageState(txn4, messageId3); will(returnValue(PENDING)); oneOf(db).getMessageDependencies(txn4, messageId3); @@ -900,18 +734,12 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Message 3 has one pending dependent: 4 oneOf(db).getMessageDependents(txn4, messageId3); will(returnValue(singletonMap(messageId4, PENDING))); - oneOf(db).commitTransaction(txn4); - oneOf(db).endTransaction(txn4); // Check whether message 3 is ready to be delivered (again, via 2) - oneOf(db).startTransaction(false); - will(returnValue(txn5)); + oneOf(db).transaction(with(false), withDbRunnable(txn5)); oneOf(db).getMessageState(txn5, messageId3); will(returnValue(DELIVERED)); // Already delivered - oneOf(db).commitTransaction(txn5); - oneOf(db).endTransaction(txn5); // Check whether message 4 is ready to be delivered (via 1 and 3) - oneOf(db).startTransaction(false); - will(returnValue(txn6)); + oneOf(db).transaction(with(false), withDbRunnable(txn6)); oneOf(db).getMessageState(txn6, messageId4); will(returnValue(PENDING)); oneOf(db).getMessageDependencies(txn6, messageId4); @@ -930,8 +758,6 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Message 4 has no pending dependents oneOf(db).getMessageDependents(txn6, messageId4); will(returnValue(emptyMap())); - oneOf(db).commitTransaction(txn6); - oneOf(db).endTransaction(txn6); }}); vm.eventOccurred(new MessageAddedEvent(message, contactId)); @@ -946,20 +772,16 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { Transaction txn1 = new Transaction(null, false); Transaction txn2 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Load the group - oneOf(db).startTransaction(true); - will(returnValue(txn)); + oneOf(db).transactionWithResult(with(true), withDbCallable(txn)); oneOf(db).getGroup(txn, groupId); will(returnValue(group)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); // Validate the message: valid oneOf(validator).validateMessage(message, group); will(returnValue(validResult)); // Store the validation result - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); oneOf(db).mergeMessageMetadata(txn1, messageId, metadata); // Deliver the message oneOf(hook).incomingMessage(txn1, message, metadata); @@ -968,17 +790,12 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { // Get any pending dependents oneOf(db).getMessageDependents(txn1, messageId); will(returnValue(singletonMap(messageId1, PENDING))); - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); // Check whether the pending dependent is ready to be delivered - oneOf(db).startTransaction(false); - will(returnValue(txn2)); + oneOf(db).transaction(with(false), withDbRunnable(txn2)); oneOf(db).getMessageState(txn2, messageId1); will(returnValue(PENDING)); oneOf(db).getMessageDependencies(txn2, messageId1); will(returnValue(twoDependencies)); - oneOf(db).commitTransaction(txn2); - oneOf(db).endTransaction(txn2); }}); vm.eventOccurred(new MessageAddedEvent(message, contactId)); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java index c11ca0791..336d09275 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java @@ -15,6 +15,7 @@ import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.transport.KeySetId; import org.briarproject.bramble.api.transport.StreamContext; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.jmock.Expectations; import org.jmock.lib.concurrent.DeterministicExecutor; import org.junit.Before; @@ -35,6 +36,7 @@ import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.briarproject.bramble.test.TestUtils.getTransportId; import static org.briarproject.bramble.util.StringUtils.getRandomString; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; public class KeyManagerImplTest extends BrambleMockTestCase { @@ -77,7 +79,7 @@ public class KeyManagerImplTest extends BrambleMockTestCase { singletonList(pluginFactory); int maxLatency = 1337; - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ oneOf(pluginConfig).getSimplexFactories(); will(returnValue(factories)); oneOf(pluginFactory).getId(); @@ -89,13 +91,10 @@ public class KeyManagerImplTest extends BrambleMockTestCase { .createTransportKeyManager(transportId, maxLatency); will(returnValue(transportKeyManager)); oneOf(pluginConfig).getDuplexFactories(); - oneOf(db).startTransaction(false); - will(returnValue(txn)); + oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(db).getContacts(txn); will(returnValue(contacts)); oneOf(transportKeyManager).start(txn); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); keyManager.startService(); @@ -121,25 +120,20 @@ public class KeyManagerImplTest extends BrambleMockTestCase { @Test public void testGetStreamContextForInactiveContact() throws Exception { - assertEquals(null, - keyManager.getStreamContext(inactiveContactId, transportId)); + assertNull(keyManager.getStreamContext(inactiveContactId, transportId)); } @Test public void testGetStreamContextForUnknownTransport() throws Exception { - assertEquals(null, - keyManager.getStreamContext(contactId, unknownTransportId)); + assertNull(keyManager.getStreamContext(contactId, unknownTransportId)); } @Test public void testGetStreamContextForContact() throws Exception { - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(false), withDbCallable(txn)); oneOf(transportKeyManager).getStreamContext(txn, contactId); will(returnValue(streamContext)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(streamContext, @@ -149,19 +143,15 @@ public class KeyManagerImplTest extends BrambleMockTestCase { @Test public void testGetStreamContextForTagAndUnknownTransport() throws Exception { - assertEquals(null, - keyManager.getStreamContext(unknownTransportId, tag)); + assertNull(keyManager.getStreamContext(unknownTransportId, tag)); } @Test public void testGetStreamContextForTag() throws Exception { - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(false), withDbCallable(txn)); oneOf(transportKeyManager).getStreamContext(txn, tag); will(returnValue(streamContext)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); assertEquals(streamContext, @@ -178,7 +168,7 @@ public class KeyManagerImplTest extends BrambleMockTestCase { keyManager.eventOccurred(event); executor.runUntilIdle(); - assertEquals(null, keyManager.getStreamContext(contactId, transportId)); + assertNull(keyManager.getStreamContext(contactId, transportId)); } @Test @@ -186,13 +176,10 @@ public class KeyManagerImplTest extends BrambleMockTestCase { ContactStatusChangedEvent event = new ContactStatusChangedEvent(inactiveContactId, true); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transactionWithResult(with(false), withDbCallable(txn)); oneOf(transportKeyManager).getStreamContext(txn, inactiveContactId); will(returnValue(streamContext)); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); keyManager.eventOccurred(event); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java index cdba372a1..1c13a8107 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java @@ -14,6 +14,7 @@ import org.briarproject.bramble.api.transport.OutgoingKeys; import org.briarproject.bramble.api.transport.StreamContext; import org.briarproject.bramble.api.transport.TransportKeys; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.briarproject.bramble.test.RunAction; import org.briarproject.bramble.test.TestUtils; import org.hamcrest.Description; @@ -318,7 +319,7 @@ public class TransportKeyManagerImplTest extends BrambleMockTestCase { Transaction txn = new Transaction(null, false); Transaction txn1 = new Transaction(null, false); - context.checking(new Expectations() {{ + context.checking(new DbExpectations() {{ // Get the current time (the start of rotation period 1000) oneOf(clock).currentTimeMillis(); will(returnValue(rotationPeriodLength * 1000)); @@ -342,8 +343,7 @@ public class TransportKeyManagerImplTest extends BrambleMockTestCase { oneOf(dbExecutor).execute(with(any(Runnable.class))); will(new RunAction()); // Start a transaction for key rotation - oneOf(db).startTransaction(false); - will(returnValue(txn1)); + oneOf(db).transaction(with(false), withDbRunnable(txn1)); // Get the current time (the start of rotation period 1001) oneOf(clock).currentTimeMillis(); will(returnValue(rotationPeriodLength * 1001)); @@ -364,9 +364,6 @@ public class TransportKeyManagerImplTest extends BrambleMockTestCase { // Schedule key rotation at the start of the next rotation period oneOf(scheduler).schedule(with(any(Runnable.class)), with(rotationPeriodLength), with(MILLISECONDS)); - // Commit the key rotation transaction - oneOf(db).commitTransaction(txn1); - oneOf(db).endTransaction(txn1); }}); TransportKeyManager transportKeyManager = new TransportKeyManagerImpl( @@ -539,7 +536,7 @@ public class TransportKeyManagerImplTest extends BrambleMockTestCase { } @Override - public Object invoke(Invocation invocation) throws Throwable { + public Object invoke(Invocation invocation) { byte[] tag = (byte[]) invocation.getParameter(0); random.nextBytes(tag); if (tags != null) tags.add(tag); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java index 2a74c1e98..a4287fa78 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java @@ -18,6 +18,7 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.bramble.test.DbExpectations; import org.jmock.Expectations; import org.junit.Test; @@ -63,7 +64,7 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { private final long now = System.currentTimeMillis(); private final Transaction txn = new Transaction(null, false); - private ClientVersioningManagerImpl createInstance() throws Exception { + private ClientVersioningManagerImpl createInstance() { context.checking(new Expectations() {{ oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, MAJOR_VERSION); @@ -162,9 +163,8 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { BdfList localUpdateBody = BdfList.of(BdfList.of( BdfList.of(clientId.getString(), 123, 234, false)), 1L); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // No client versions have been stored yet oneOf(db).getMessageIds(txn, localGroup.getId()); will(returnValue(emptyList())); @@ -190,8 +190,6 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { oneOf(clientHelper).getMessageAsList(txn, localUpdateId); will(returnValue(localUpdateBody)); // Latest local update is up-to-date, no visibilities have changed - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); ClientVersioningManagerImpl c = createInstance(); @@ -206,17 +204,14 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { BdfList localVersionsBody = BdfList.of(BdfList.of(clientId.getString(), 123, 234)); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Load the old client versions oneOf(db).getMessageIds(txn, localGroup.getId()); will(returnValue(singletonList(localVersionsId))); oneOf(clientHelper).getMessageAsList(txn, localVersionsId); will(returnValue(localVersionsBody)); // Client versions are up-to-date - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); ClientVersioningManagerImpl c = createInstance(); @@ -251,9 +246,8 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { new BdfEntry(MSG_KEY_UPDATE_VERSION, 2L), new BdfEntry(MSG_KEY_LOCAL, true)); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Load the old client versions oneOf(db).getMessageIds(txn, localGroup.getId()); will(returnValue(singletonList(oldLocalVersionsId))); @@ -295,8 +289,6 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { oneOf(clientHelper).addLocalMessage(txn, newLocalUpdate, newLocalUpdateMeta, true); // No visibilities have changed - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); ClientVersioningManagerImpl c = createInstance(); @@ -350,9 +342,8 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { new BdfEntry(MSG_KEY_UPDATE_VERSION, 2L), new BdfEntry(MSG_KEY_LOCAL, true)); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); + context.checking(new DbExpectations() {{ + oneOf(db).transaction(with(false), withDbRunnable(txn)); // Load the old client versions oneOf(db).getMessageIds(txn, localGroup.getId()); will(returnValue(singletonList(oldLocalVersionsId))); @@ -397,8 +388,6 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { newLocalUpdateMeta, true); // The client's visibility has changed oneOf(hook).onClientVisibilityChanging(txn, contact, visibility); - oneOf(db).commitTransaction(txn); - oneOf(db).endTransaction(txn); }}); ClientVersioningManagerImpl c = createInstance();