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