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'); + } +} 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/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 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..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 @@ -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,19 +58,28 @@ 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.briarproject.bramble.util.LogUtils.logException; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; @MethodsNotNullByDefault @ParametersNotNullByDefault @@ -76,6 +88,7 @@ public abstract class BriarIntegrationTest { + 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(); + }); + } } private void createAndRegisterIdentities() { @@ -267,6 +309,11 @@ public abstract class BriarIntegrationTest