From 4a42e767d3504d9adeebc9121361d8391d84adca Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 30 Oct 2018 12:00:20 -0300 Subject: [PATCH 1/6] [core] Add a detector for message delivery non-determinism --- .../briarproject/briar/test/BriarIntegrationTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index 6f6a52769..c4743127b 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -56,6 +56,7 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -67,6 +68,7 @@ import static org.briarproject.bramble.api.sync.ValidationManager.State.INVALID; import static org.briarproject.bramble.api.sync.ValidationManager.State.PENDING; import static org.briarproject.bramble.test.TestPluginConfigModule.MAX_LATENCY; import static org.briarproject.bramble.test.TestUtils.getSecretKey; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @MethodsNotNullByDefault @@ -122,6 +124,7 @@ public abstract class BriarIntegrationTest Date: Mon, 17 Jul 2017 18:10:33 +0100 Subject: [PATCH 2/6] Utility class for converting BDF to strings. (cherry picked from commit 9e94917) --- .../bramble/api/data/BdfStringUtils.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/data/BdfStringUtils.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/data/BdfStringUtils.java b/bramble-api/src/main/java/org/briarproject/bramble/api/data/BdfStringUtils.java new file mode 100644 index 000000000..7f02ecbd0 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/data/BdfStringUtils.java @@ -0,0 +1,71 @@ +package org.briarproject.bramble.api.data; + +import org.briarproject.bramble.api.Bytes; +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.annotation.Nullable; + +import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE; +import static org.briarproject.bramble.util.StringUtils.toHexString; + +@NotNullByDefault +public class BdfStringUtils { + + public static String toString(@Nullable Object o) throws FormatException { + return toString(o, 0); + } + + private static String toString(@Nullable Object o, int indent) + throws FormatException { + if (o == null || o == NULL_VALUE) return "null"; + if (o instanceof Boolean) return o.toString(); + if (o instanceof Number) return o.toString(); + if (o instanceof String) return "\"" + o + "\""; + if (o instanceof Bytes) + return "x" + toHexString(((Bytes) o).getBytes()); + if (o instanceof byte[]) + return "x" + toHexString((byte[]) o); + if (o instanceof List) { + List list = (List) o; + StringBuilder sb = new StringBuilder(); + sb.append("[\n"); + int i = 0, size = list.size(); + for (Object e : list) { + indent(sb, indent + 1); + sb.append(toString(e, indent + 1)); + if (i++ < size - 1) sb.append(','); + sb.append('\n'); + } + indent(sb, indent); + sb.append(']'); + return sb.toString(); + } + if (o instanceof Map) { + Map map = (Map) o; + StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + int i = 0, size = map.size(); + for (Entry e : map.entrySet()) { + indent(sb, indent + 1); + sb.append(toString(e.getKey(), indent + 1)); + sb.append(": "); + sb.append(toString(e.getValue(), indent + 1)); + if (i++ < size - 1) sb.append(','); + sb.append('\n'); + } + indent(sb, indent); + sb.append('}'); + return sb.toString(); + } + throw new FormatException(); + } + + private static void indent(StringBuilder sb, int indent) { + for (int i = 0; i < indent; i++) sb.append('\t'); + } +} From 93a6bf2f52499064e9a90f0432c4f314c266e93d Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 30 Oct 2018 16:04:25 +0000 Subject: [PATCH 3/6] Add logging to debug test failures. --- .../briar/test/BriarIntegrationTest.java | 63 ++++++++++++++----- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index c4743127b..005c06402 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -2,23 +2,26 @@ package org.briarproject.briar.test; import net.jodah.concurrentunit.Waiter; +import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.client.ContactGroupFactory; import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.data.BdfList; +import org.briarproject.bramble.api.data.BdfStringUtils; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventListener; -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.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.sync.MessageFactory; +import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.SyncSession; import org.briarproject.bramble.api.sync.SyncSessionFactory; import org.briarproject.bramble.api.sync.event.MessageStateChangedEvent; @@ -55,21 +58,26 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.util.concurrent.Executor; +import java.util.concurrent.Semaphore; import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import javax.annotation.Nullable; import javax.inject.Inject; +import static java.util.concurrent.Executors.newSingleThreadExecutor; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.logging.Level.WARNING; import static junit.framework.Assert.assertNotNull; import static org.briarproject.bramble.api.sync.ValidationManager.State.DELIVERED; import static org.briarproject.bramble.api.sync.ValidationManager.State.INVALID; import static org.briarproject.bramble.api.sync.ValidationManager.State.PENDING; import static org.briarproject.bramble.test.TestPluginConfigModule.MAX_LATENCY; import static org.briarproject.bramble.test.TestUtils.getSecretKey; -import static org.junit.Assert.assertEquals; +import static org.briarproject.bramble.util.LogUtils.logException; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; @MethodsNotNullByDefault @ParametersNotNullByDefault @@ -103,8 +111,6 @@ public abstract class BriarIntegrationTest { + try { + BdfList body = clientHelper.getMessageAsList(id); + LOG.info("Contents of " + id + ":\n" + + BdfStringUtils.toString(body)); + } catch (DbException | FormatException e) { + logException(LOG, WARNING, e); + } + messageSemaphore.release(); + }); + } } private void createAndRegisterIdentities() { @@ -370,7 +399,13 @@ public abstract class BriarIntegrationTest Date: Fri, 2 Nov 2018 11:57:36 -0300 Subject: [PATCH 4/6] [core] Re-add message counter and put debug output behind flag --- .../briar/test/BriarIntegrationTest.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index 005c06402..8a27ea878 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -61,6 +61,7 @@ import java.io.IOException; import java.util.concurrent.Executor; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -76,6 +77,7 @@ import static org.briarproject.bramble.api.sync.ValidationManager.State.PENDING; import static org.briarproject.bramble.test.TestPluginConfigModule.MAX_LATENCY; import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.briarproject.bramble.util.LogUtils.logException; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -86,6 +88,7 @@ public abstract class BriarIntegrationTest { - try { - BdfList body = clientHelper.getMessageAsList(id); - LOG.info("Contents of " + id + ":\n" - + BdfStringUtils.toString(body)); - } catch (DbException | FormatException e) { - logException(LOG, WARNING, e); + if (DEBUG) { + try { + BdfList body = clientHelper.getMessageAsList(id); + LOG.info("Contents of " + id + ":\n" + + BdfStringUtils.toString(body)); + } catch (DbException | FormatException e) { + logException(LOG, WARNING, e); + } } messageSemaphore.release(); }); @@ -399,6 +407,7 @@ public abstract class BriarIntegrationTest Date: Fri, 2 Nov 2018 12:46:47 -0300 Subject: [PATCH 5/6] [core] Fix non-determinism in introduction integration tests --- .../introduction/IntroductionIntegrationTest.java | 4 ++-- .../briarproject/briar/test/BriarIntegrationTest.java | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java index e4faef505..917015f83 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java @@ -595,7 +595,7 @@ public class IntroductionIntegrationTest @Test public void testIntroductionToExistingContact() throws Exception { // let contact1 and contact2 add each other already - addContacts1And2(); + addContacts1And2(true); assertNotNull(contactId2From1); assertNotNull(contactId1From2); @@ -650,7 +650,7 @@ public class IntroductionIntegrationTest @Test public void testIntroductionToRemovedContact() throws Exception { // let contact1 and contact2 add each other - addContacts1And2(); + addContacts1And2(true); assertNotNull(contactId2From1); assertNotNull(contactId1From2); diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index 8a27ea878..c278b83bb 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -309,6 +309,11 @@ public abstract class BriarIntegrationTest Date: Fri, 2 Nov 2018 13:38:37 -0300 Subject: [PATCH 6/6] [core] Fix non-determism in GroupInvitationIntegrationTest --- .../invitation/GroupInvitationIntegrationTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java index acc5e1ea3..c8c2e3b67 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java @@ -423,7 +423,13 @@ public class GroupInvitationIntegrationTest .respondToInvitation(contactId0From1, privateGroup0, true); assertEquals(1, groupManager1.getPrivateGroups().size()); - // Invitee's join message is delivered to creator + // Invitee's (sharing) join message is delivered to creator + sync1To0(1, true); + + // Creator's (sharing and group) join messages are delivered to invitee + sync0To1(2, true); + + // Invitee's (group) join message is delivered to creator sync1To0(1, true); // Creator leaves group