From baf64e11298820253e2e8f24d4f8aebc3ca91c1e Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Mon, 29 Oct 2018 18:16:34 -0300 Subject: [PATCH] [bramble] Add transactionless method for retrieving AuthorInfo to ContactManager --- .../bramble/api/contact/ContactManager.java | 5 ++++ .../bramble/contact/ContactManagerImpl.java | 5 ++++ .../contact/ContactManagerImplTest.java | 23 +++++++++++++++- .../bramble/test/DbExpectations.java | 8 ++++++ .../test/RunTransactionWithResultAction.java | 27 +++++++++++++++++++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/test/RunTransactionWithResultAction.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java index 55768a660c..e2732145a8 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java @@ -114,6 +114,11 @@ public interface ContactManager { boolean contactExists(AuthorId remoteAuthorId, AuthorId localAuthorId) throws DbException; + /** + * Returns the {@link AuthorInfo} for the given author. + */ + AuthorInfo getAuthorInfo(AuthorId a) throws DbException; + /** * Returns the {@link AuthorInfo} for the given author. */ 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 49ecdaf13e..71a63c9b57 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 @@ -201,6 +201,11 @@ class ContactManagerImpl implements ContactManager { db.removeContact(txn, c); } + @Override + public AuthorInfo getAuthorInfo(AuthorId a) throws DbException { + return db.transactionWithResult(true, txn -> getAuthorInfo(txn, a)); + } + @Override public AuthorInfo getAuthorInfo(Transaction txn, AuthorId authorId) throws DbException { 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 ce8bcabd44..1dea4f9df9 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 @@ -224,7 +224,28 @@ public class ContactManagerImplTest extends BrambleMockTestCase { } @Test - public void testGetAuthorStatus() throws DbException { + public void testGetAuthorStatus() throws Exception { + Transaction txn = new Transaction(null, true); + Collection<Contact> 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(identityManager).getLocalAuthor(txn); + will(returnValue(localAuthor)); + oneOf(db).getContactsByAuthorId(txn, remote.getId()); + will(returnValue(contacts)); + }}); + AuthorInfo authorInfo = + contactManager.getAuthorInfo(txn, remote.getId()); + assertEquals(UNVERIFIED, authorInfo.getStatus()); + assertEquals(alias, contact.getAlias()); + } + + @Test + public void testGetAuthorStatusTransaction() throws DbException { Transaction txn = new Transaction(null, true); // check unknown author diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/DbExpectations.java b/bramble-core/src/test/java/org/briarproject/bramble/test/DbExpectations.java index 4493552d3a..8c5fa8f281 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/DbExpectations.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/DbExpectations.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.test; +import org.briarproject.bramble.api.db.DbCallable; import org.briarproject.bramble.api.db.DbRunnable; import org.briarproject.bramble.api.db.Transaction; import org.jmock.Expectations; @@ -13,4 +14,11 @@ public class DbExpectations extends Expectations { return null; } + protected <R, E extends Exception> DbCallable<R, E> withDbCallable( + Transaction txn) { + addParameterMatcher(any(DbCallable.class)); + currentBuilder().setAction(new RunTransactionWithResultAction(txn)); + return null; + } + } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/RunTransactionWithResultAction.java b/bramble-core/src/test/java/org/briarproject/bramble/test/RunTransactionWithResultAction.java new file mode 100644 index 0000000000..cbd22b1260 --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/RunTransactionWithResultAction.java @@ -0,0 +1,27 @@ +package org.briarproject.bramble.test; + +import org.briarproject.bramble.api.db.DbCallable; +import org.briarproject.bramble.api.db.Transaction; +import org.hamcrest.Description; +import org.jmock.api.Action; +import org.jmock.api.Invocation; + +public class RunTransactionWithResultAction implements Action { + + private final Transaction txn; + + public RunTransactionWithResultAction(Transaction txn) { + this.txn = txn; + } + + @Override + public Object invoke(Invocation invocation) throws Throwable { + DbCallable task = (DbCallable) invocation.getParameter(1); + return task.call(txn); + } + + @Override + public void describeTo(Description description) { + description.appendText("runs a task inside a database transaction"); + } +} -- GitLab