From 23354d6568f250e58283d7698519a4f99f7b9534 Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Wed, 5 Jun 2019 12:56:39 +0100
Subject: [PATCH] Use predicates to match events.

---
 .../contact/ContactManagerImplTest.java       | 26 ++++++-----------
 .../bramble/test/PredicateMatcher.java        | 28 +++++++++++++++++++
 2 files changed, 36 insertions(+), 18 deletions(-)
 create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/test/PredicateMatcher.java

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 543822a3ea..48928cefb0 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
@@ -23,15 +23,14 @@ import org.briarproject.bramble.api.rendezvous.event.RendezvousConnectionOpenedE
 import org.briarproject.bramble.api.rendezvous.event.RendezvousFailedEvent;
 import org.briarproject.bramble.api.transport.KeyManager;
 import org.briarproject.bramble.test.BrambleMockTestCase;
-import org.briarproject.bramble.test.CaptureArgumentAction;
 import org.briarproject.bramble.test.DbExpectations;
+import org.briarproject.bramble.test.PredicateMatcher;
 import org.jmock.Expectations;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.util.Collection;
 import java.util.Random;
-import java.util.concurrent.atomic.AtomicReference;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
@@ -332,20 +331,14 @@ public class ContactManagerImplTest extends BrambleMockTestCase {
 	@Test
 	public void testFailedStateIsNotReplaced() throws Exception {
 		Transaction txn = new Transaction(null, true);
-		AtomicReference<PendingContactStateChangedEvent> captureFirstEvent =
-				new AtomicReference<>();
-		AtomicReference<PendingContactStateChangedEvent> captureSecondEvent =
-				new AtomicReference<>();
 
 		context.checking(new Expectations() {{
-			oneOf(eventBus).broadcast(with(any(
-					PendingContactStateChangedEvent.class)));
-			will(new CaptureArgumentAction<>(captureFirstEvent,
-					PendingContactStateChangedEvent.class, 0));
-			oneOf(eventBus).broadcast(with(any(
-					PendingContactStateChangedEvent.class)));
-			will(new CaptureArgumentAction<>(captureSecondEvent,
-					PendingContactStateChangedEvent.class, 0));
+			oneOf(eventBus).broadcast(with(new PredicateMatcher<>(
+					PendingContactStateChangedEvent.class, e ->
+					e.getPendingContactState() == ADDING_CONTACT)));
+			oneOf(eventBus).broadcast(with(new PredicateMatcher<>(
+					PendingContactStateChangedEvent.class, e ->
+					e.getPendingContactState() == FAILED)));
 		}});
 
 		// A rendezvous connection is opened, then the pending contact expires,
@@ -356,10 +349,7 @@ public class ContactManagerImplTest extends BrambleMockTestCase {
 				pendingContact.getId()));
 		contactManager.eventOccurred(new RendezvousConnectionClosedEvent(
 				pendingContact.getId(), false));
-
-		assertEquals(ADDING_CONTACT,
-				captureFirstEvent.get().getPendingContactState());
-		assertEquals(FAILED, captureSecondEvent.get().getPendingContactState());
+		context.assertIsSatisfied();
 
 		context.checking(new DbExpectations() {{
 			oneOf(db).transactionWithResult(with(true), withDbCallable(txn));
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/PredicateMatcher.java b/bramble-core/src/test/java/org/briarproject/bramble/test/PredicateMatcher.java
new file mode 100644
index 0000000000..b08f15b2aa
--- /dev/null
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/PredicateMatcher.java
@@ -0,0 +1,28 @@
+package org.briarproject.bramble.test;
+
+import org.briarproject.bramble.api.Predicate;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+
+public class PredicateMatcher<T> extends BaseMatcher<T> {
+
+	private final Class<T> matchedClass;
+	private final Predicate<T> predicate;
+
+	public PredicateMatcher(Class<T> matchedClass, Predicate<T> predicate) {
+		this.matchedClass = matchedClass;
+		this.predicate = predicate;
+	}
+
+	@Override
+	public boolean matches(Object item) {
+		if (matchedClass.isInstance(item))
+			return predicate.test(matchedClass.cast(item));
+		return false;
+	}
+
+	@Override
+	public void describeTo(Description description) {
+		description.appendText("matches an item against a predicate");
+	}
+}
-- 
GitLab