From 648911b3edc7141ea74b21ac65e7f94dc6b5e93f Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 10 Oct 2022 10:40:24 -0300 Subject: [PATCH 1/9] clean up mailbox integration tests --- .../bramble/mailbox/MailboxApiTest.java | 17 +--- .../mailbox/MailboxPairingTaskImplTest.java | 16 +--- .../bramble/mailbox/MailboxTestUtils.java | 44 ++++++++++ .../AbstractMailboxIntegrationTest.java | 84 +++++++++++++++++++ .../mailbox/MailboxApiIntegrationTest.java | 2 +- .../MailboxIntegrationTestComponent.java | 12 --- .../mailbox/MailboxIntegrationTestUtils.java | 80 +----------------- ...ilboxContactListWorkerIntegrationTest.java | 79 ++++------------- .../bramble/mailbox/TestUrlConverter.java | 14 ---- .../mailbox/TestUrlConverterModule.java | 20 +++++ .../bramble/test/FakeTorPlugin.java | 5 +- .../test/FakeTorPluginConfigModule.java | 31 ++++++- .../bramble/test/FakeTorPluginFactory.java | 0 13 files changed, 206 insertions(+), 198 deletions(-) create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxTestUtils.java create mode 100644 mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java delete mode 100644 mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverter.java create mode 100644 mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverterModule.java rename {bramble-core => mailbox-integration-tests}/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java (94%) rename {bramble-core => mailbox-integration-tests}/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java (60%) rename {bramble-core => mailbox-integration-tests}/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java (100%) diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiTest.java index 3b46320c8..aeaaccbaf 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiTest.java @@ -24,9 +24,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.annotation.Nonnull; -import javax.net.SocketFactory; - import okhttp3.OkHttpClient; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; @@ -34,8 +31,8 @@ import okhttp3.mockwebserver.RecordedRequest; import okio.Buffer; import static java.util.Collections.singletonList; -import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS; +import static org.briarproject.bramble.mailbox.MailboxTestUtils.createHttpClientProvider; import static org.briarproject.bramble.test.TestUtils.getContactId; import static org.briarproject.bramble.test.TestUtils.getMailboxProperties; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; @@ -56,18 +53,8 @@ public class MailboxApiTest extends BrambleTestCase { @Rule public TemporaryFolder folder = new TemporaryFolder(); - private final OkHttpClient client = new OkHttpClient.Builder() - .socketFactory(SocketFactory.getDefault()) - .connectTimeout(60_000, MILLISECONDS) - .build(); private final WeakSingletonProvider httpClientProvider = - new WeakSingletonProvider() { - @Override - @Nonnull - public OkHttpClient createInstance() { - return client; - } - }; + createHttpClientProvider(); // We aren't using a real onion address, so use the given address verbatim private final UrlConverter urlConverter = onion -> onion; private final MailboxApiImpl api = new MailboxApiImpl(httpClientProvider, diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java index 6a3e312ed..fbc817d3f 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java @@ -22,13 +22,12 @@ import org.jmock.Expectations; import org.junit.Test; import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; import static java.util.Collections.singletonList; +import static org.briarproject.bramble.mailbox.MailboxTestUtils.getQrCodePayload; import static org.briarproject.bramble.test.TestUtils.getContact; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; @@ -59,7 +58,8 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase { new MailboxAuthToken(getRandomId()); private final MailboxAuthToken ownerToken = new MailboxAuthToken(getRandomId()); - private final String validPayload = getValidPayload(); + private final String validPayload = + getQrCodePayload(onionBytes, setupToken.getBytes()); private final long time = System.currentTimeMillis(); private final MailboxProperties setupProperties = new MailboxProperties( onion, setupToken, new ArrayList<>()); @@ -194,16 +194,6 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase { MailboxPairingState.UnexpectedError.class)); } - private String getValidPayload() { - byte[] payloadBytes = ByteBuffer.allocate(65) - .put((byte) 32) // 1 - .put(onionBytes) // 32 - .put(setupToken.getBytes()) // 32 - .array(); - //noinspection CharsetObjectCanBeUsed - return new String(payloadBytes, Charset.forName("ISO-8859-1")); - } - private PredicateMatcher matches(MailboxProperties p2) { return new PredicateMatcher<>(MailboxProperties.class, p1 -> p1.getAuthToken().equals(p2.getAuthToken()) && diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxTestUtils.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxTestUtils.java new file mode 100644 index 000000000..4795fb739 --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxTestUtils.java @@ -0,0 +1,44 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.bramble.api.WeakSingletonProvider; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; + +import javax.annotation.Nonnull; +import javax.net.SocketFactory; + +import okhttp3.OkHttpClient; + +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.briarproject.bramble.test.TestUtils.getRandomId; + +class MailboxTestUtils { + + static String getQrCodePayload(byte[] onionBytes, byte[] setupToken) { + byte[] payloadBytes = ByteBuffer.allocate(65) + .put((byte) 32) // 1 + .put(onionBytes) // 32 + .put(setupToken) // 32 + .array(); + //noinspection CharsetObjectCanBeUsed + return new String(payloadBytes, Charset.forName("ISO-8859-1")); + } + + static String getQrCodePayload(byte[] setupToken) { + return getQrCodePayload(getRandomId(), setupToken); + } + + static WeakSingletonProvider createHttpClientProvider() { + return new WeakSingletonProvider() { + @Override + @Nonnull + public OkHttpClient createInstance() { + return new OkHttpClient.Builder() + .socketFactory(SocketFactory.getDefault()) + .connectTimeout(60_000, MILLISECONDS) + .build(); + } + }; + } +} diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java new file mode 100644 index 000000000..f38f7910d --- /dev/null +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java @@ -0,0 +1,84 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; +import org.briarproject.bramble.api.identity.Identity; +import org.briarproject.bramble.api.identity.IdentityManager; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.mailbox.MailboxAuthToken; +import org.briarproject.bramble.api.mailbox.MailboxPairingState; +import org.briarproject.bramble.api.mailbox.MailboxPairingTask; +import org.briarproject.bramble.api.mailbox.MailboxProperties; +import org.briarproject.bramble.test.BrambleTestCase; +import org.briarproject.bramble.test.TestDatabaseConfigModule; +import org.briarproject.mailbox.lib.AbstractMailbox; + +import java.io.File; +import java.util.concurrent.CountDownLatch; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.briarproject.bramble.api.mailbox.MailboxAuthToken.fromString; +import static org.briarproject.bramble.mailbox.MailboxTestUtils.getQrCodePayload; +import static org.briarproject.bramble.test.TestUtils.getSecretKey; +import static org.briarproject.bramble.test.TestUtils.getTestDirectory; +import static org.junit.Assert.fail; + +abstract class AbstractMailboxIntegrationTest extends BrambleTestCase { + + static final String URL_BASE = "http://127.0.0.1:8000"; + + private final File testDir = getTestDirectory(); + final File dir1 = new File(testDir, "alice"); + final File dir2 = new File(testDir, "bob"); + + MailboxIntegrationTestComponent c1, c2; + + MailboxIntegrationTestComponent startTestComponent( + File databaseDir, String name) throws Exception { + MailboxIntegrationTestComponent component = + DaggerMailboxIntegrationTestComponent + .builder() + .testDatabaseConfigModule( + new TestDatabaseConfigModule(databaseDir)) + .build(); + BrambleCoreIntegrationTestEagerSingletons.Helper + .injectEagerSingletons(component); + setUp(component, name); + return component; + } + + private void setUp(MailboxIntegrationTestComponent device, + String name) throws Exception { + // Add an identity for the user + IdentityManager identityManager = device.getIdentityManager(); + Identity identity = identityManager.createIdentity(name); + identityManager.registerIdentity(identity); + // Start the lifecycle manager + LifecycleManager lifecycleManager = device.getLifecycleManager(); + lifecycleManager.startServices(getSecretKey()); + lifecycleManager.waitForStartup(); + } + + MailboxProperties pair(MailboxIntegrationTestComponent c, + AbstractMailbox mailbox) throws Exception { + MailboxAuthToken setupToken = fromString(mailbox.getSetupToken()); + + MailboxPairingTask pairingTask = c.getMailboxManager() + .startPairingTask(getQrCodePayload(setupToken.getBytes())); + + CountDownLatch latch = new CountDownLatch(1); + pairingTask.addObserver((state) -> { + if (state instanceof MailboxPairingState.Paired) { + latch.countDown(); + } + }); + if (!latch.await(10, SECONDS)) { + fail("Timeout reached when waiting for pairing."); + } + return c.getDatabaseComponent() + .transactionWithNullableResult(true, txn -> + c.getMailboxSettingsManager() + .getOwnMailboxProperties(txn) + ); + } + +} diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxApiIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxApiIntegrationTest.java index e6ab68121..d196d180d 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxApiIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxApiIntegrationTest.java @@ -26,7 +26,7 @@ import java.util.List; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; -import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.URL_BASE; +import static org.briarproject.bramble.mailbox.AbstractMailboxIntegrationTest.URL_BASE; import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.createMailboxApi; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java index a4fc1adb5..aa37adc8b 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java @@ -2,15 +2,11 @@ package org.briarproject.bramble.mailbox; import org.briarproject.bramble.BrambleCoreModule; import org.briarproject.bramble.api.contact.ContactManager; -import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.mailbox.MailboxManager; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; -import org.briarproject.bramble.api.mailbox.MailboxUpdateManager; -import org.briarproject.bramble.api.properties.TransportPropertyManager; -import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.TestUrlConverterModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.BrambleIntegrationTestComponent; @@ -38,19 +34,11 @@ interface MailboxIntegrationTestComponent extends MailboxManager getMailboxManager(); - MailboxUpdateManager getMailboxUpdateManager(); - MailboxSettingsManager getMailboxSettingsManager(); LifecycleManager getLifecycleManager(); ContactManager getContactManager(); - Clock getClock(); - - TransportPropertyManager getTransportPropertyManager(); - AuthorFactory getAuthorFactory(); - - CryptoComponent getCrypto(); } diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestUtils.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestUtils.java index 3f27c648d..9fd708fcd 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestUtils.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestUtils.java @@ -1,89 +1,16 @@ package org.briarproject.bramble.mailbox; -import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; -import org.briarproject.bramble.api.WeakSingletonProvider; -import org.briarproject.bramble.api.mailbox.MailboxAuthToken; -import org.briarproject.bramble.test.TestDatabaseConfigModule; - -import java.io.File; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; -import javax.annotation.Nonnull; -import javax.net.SocketFactory; - -import dagger.Module; -import dagger.Provides; -import okhttp3.OkHttpClient; - import static java.lang.System.currentTimeMillis; -import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.briarproject.bramble.mailbox.MailboxTestUtils.createHttpClientProvider; +import static org.briarproject.bramble.mailbox.TestUrlConverterModule.urlConverter; import static org.junit.Assert.fail; class MailboxIntegrationTestUtils { - static final String URL_BASE = "http://127.0.0.1:8000"; - - static String getQrCodePayload(MailboxAuthToken setupToken) { - byte[] bytes = getQrCodeBytes(setupToken); - Charset charset = Charset.forName("ISO-8859-1"); - return new String(bytes, charset); - } - - private static byte[] getQrCodeBytes(MailboxAuthToken setupToken) { - byte[] hiddenServiceBytes = getHiddenServiceBytes(); - byte[] setupTokenBytes = setupToken.getBytes(); - return ByteBuffer.allocate(65).put((byte) 32) - .put(hiddenServiceBytes).put(setupTokenBytes).array(); - } - - private static byte[] getHiddenServiceBytes() { - byte[] data = new byte[32]; - Arrays.fill(data, (byte) 'a'); - return data; - } - - private static WeakSingletonProvider createHttpClientProvider() { - OkHttpClient client = new OkHttpClient.Builder() - .socketFactory(SocketFactory.getDefault()) - .connectTimeout(60_000, MILLISECONDS) - .build(); - return new WeakSingletonProvider() { - @Override - @Nonnull - public OkHttpClient createInstance() { - return client; - } - }; - } - static MailboxApi createMailboxApi() { - return new MailboxApiImpl(createHttpClientProvider(), - new TestUrlConverter()); - } - - static MailboxIntegrationTestComponent createTestComponent( - File databaseDir) { - MailboxIntegrationTestComponent component = - DaggerMailboxIntegrationTestComponent - .builder() - .testDatabaseConfigModule( - new TestDatabaseConfigModule(databaseDir)) - .build(); - BrambleCoreIntegrationTestEagerSingletons.Helper - .injectEagerSingletons(component); - return component; - } - - @Module - static class TestUrlConverterModule { - - @Provides - UrlConverter provideUrlConverter() { - return new TestUrlConverter(); - } + return new MailboxApiImpl(createHttpClientProvider(), urlConverter); } interface Check { @@ -126,6 +53,7 @@ class MailboxIntegrationTestUtils { return; } try { + //noinspection BusyWait Thread.sleep(step); } catch (InterruptedException ignore) { // continue diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/OwnMailboxContactListWorkerIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/OwnMailboxContactListWorkerIntegrationTest.java index d91ca40a0..414ea1052 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/OwnMailboxContactListWorkerIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/OwnMailboxContactListWorkerIntegrationTest.java @@ -6,14 +6,8 @@ import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorFactory; -import org.briarproject.bramble.api.identity.Identity; -import org.briarproject.bramble.api.identity.IdentityManager; -import org.briarproject.bramble.api.lifecycle.LifecycleManager; -import org.briarproject.bramble.api.mailbox.MailboxAuthToken; -import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired; -import org.briarproject.bramble.api.mailbox.MailboxPairingTask; +import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.mailbox.MailboxProperties; -import org.briarproject.bramble.test.BrambleTestCase; import org.briarproject.mailbox.lib.TestMailbox; import org.junit.After; import org.junit.Before; @@ -21,23 +15,17 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.concurrent.CountDownLatch; -import static org.briarproject.bramble.api.mailbox.MailboxAuthToken.fromString; import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.createMailboxApi; -import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.createTestComponent; -import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.getQrCodePayload; import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.retryUntilSuccessOrTimeout; import static org.briarproject.bramble.test.TestUtils.getSecretKey; -import static org.briarproject.bramble.test.TestUtils.getTestDirectory; import static org.junit.Assert.assertEquals; public class OwnMailboxContactListWorkerIntegrationTest - extends BrambleTestCase { + extends AbstractMailboxIntegrationTest { @Rule public TemporaryFolder mailboxDataDirectory = new TemporaryFolder(); @@ -48,11 +36,7 @@ public class OwnMailboxContactListWorkerIntegrationTest private MailboxProperties ownerProperties; - private final File testDir = getTestDirectory(); - private final File aliceDir = new File(testDir, "alice"); - - private MailboxIntegrationTestComponent component; - private Identity identity; + private LocalAuthor localAuthor1; private final SecretKey rootKey = getSecretKey(); private final long timestamp = System.currentTimeMillis(); @@ -62,27 +46,10 @@ public class OwnMailboxContactListWorkerIntegrationTest mailbox = new TestMailbox(mailboxDataDirectory.getRoot()); mailbox.startLifecycle(); - MailboxAuthToken setupToken = fromString(mailbox.getSetupToken()); + c1 = startTestComponent(dir1, "Alice"); + localAuthor1 = c1.getIdentityManager().getLocalAuthor(); - component = createTestComponent(aliceDir); - identity = setUp(component, "Alice"); - - MailboxPairingTask pairingTask = component.getMailboxManager() - .startPairingTask(getQrCodePayload(setupToken)); - - CountDownLatch latch = new CountDownLatch(1); - pairingTask.addObserver((state) -> { - if (state instanceof Paired) { - latch.countDown(); - } - }); - latch.await(); - - ownerProperties = component.getDatabaseComponent() - .transactionWithNullableResult(false, txn -> - component.getMailboxSettingsManager() - .getOwnMailboxProperties(txn) - ); + ownerProperties = pair(c1, mailbox); } @After @@ -90,28 +57,15 @@ public class OwnMailboxContactListWorkerIntegrationTest mailbox.stopLifecycle(true); } - private Identity setUp(MailboxIntegrationTestComponent device, String name) - throws Exception { - // Add an identity for the user - IdentityManager identityManager = device.getIdentityManager(); - Identity identity = identityManager.createIdentity(name); - identityManager.registerIdentity(identity); - // Start the lifecycle manager - LifecycleManager lifecycleManager = device.getLifecycleManager(); - lifecycleManager.startServices(getSecretKey()); - lifecycleManager.waitForStartup(); - // Check the initial conditions - ContactManager contactManager = device.getContactManager(); - assertEquals(0, contactManager.getPendingContacts().size()); - assertEquals(0, contactManager.getContacts().size()); - return identity; - } - @Test public void testUploadContacts() throws Exception { + // Check the initial conditions + ContactManager contactManager = c1.getContactManager(); + assertEquals(0, contactManager.getPendingContacts().size()); + assertEquals(0, contactManager.getContacts().size()); + int numContactsToAdd = 5; - List expectedContacts = - createContacts(component, identity, numContactsToAdd); + List expectedContacts = createContacts(c1, numContactsToAdd); // Check for number of contacts on mailbox via API every 100ms retryUntilSuccessOrTimeout(1000, 100, () -> { @@ -125,15 +79,16 @@ public class OwnMailboxContactListWorkerIntegrationTest } private List createContacts( - MailboxIntegrationTestComponent component, Identity local, - int numContacts) throws DbException { + MailboxIntegrationTestComponent component, int numContacts) + throws DbException { List contactIds = new ArrayList<>(); ContactManager contactManager = component.getContactManager(); AuthorFactory authorFactory = component.getAuthorFactory(); for (int i = 0; i < numContacts; i++) { Author remote = authorFactory.createLocalAuthor("Bob " + i); - contactIds.add(contactManager.addContact(remote, local.getId(), - rootKey, timestamp, true, true, true)); + ContactId c = contactManager.addContact(remote, + localAuthor1.getId(), rootKey, timestamp, true, true, true); + contactIds.add(c); } return contactIds; } diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverter.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverter.java deleted file mode 100644 index 5841e7cc9..000000000 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverter.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.briarproject.bramble.mailbox; - -import org.briarproject.nullsafety.NotNullByDefault; - -import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.URL_BASE; - -@NotNullByDefault -class TestUrlConverter implements UrlConverter { - - @Override - public String convertOnionToBaseUrl(String onion) { - return URL_BASE; - } -} diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverterModule.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverterModule.java new file mode 100644 index 000000000..a47ac069a --- /dev/null +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverterModule.java @@ -0,0 +1,20 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.nullsafety.NotNullByDefault; + +import dagger.Module; +import dagger.Provides; + +import static org.briarproject.bramble.mailbox.AbstractMailboxIntegrationTest.URL_BASE; + +@Module +@NotNullByDefault +class TestUrlConverterModule { + + static UrlConverter urlConverter = onion -> URL_BASE; + + @Provides + UrlConverter provideUrlConverter() { + return urlConverter; + } +} diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java similarity index 94% rename from bramble-core/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java rename to mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java index 8e68f4f35..85111ea8b 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java @@ -4,7 +4,6 @@ import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.keyagreement.KeyAgreementListener; import org.briarproject.bramble.api.plugin.ConnectionHandler; -import org.briarproject.bramble.api.plugin.PluginException; import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; @@ -48,13 +47,13 @@ public class FakeTorPlugin implements DuplexPlugin { } @Override - public void start() throws PluginException { + public void start() { LOG.info("Starting plugin"); state = ACTIVE; } @Override - public void stop() throws PluginException { + public void stop() { LOG.info("Stopping plugin"); state = DISABLED; } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java similarity index 60% rename from bramble-core/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java rename to mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java index 49b9048ad..de4471242 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java @@ -1,8 +1,10 @@ package org.briarproject.bramble.test; +import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginConfig; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; +import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.nullsafety.NotNullByDefault; @@ -10,16 +12,41 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import javax.annotation.Nullable; + import dagger.Module; import dagger.Provides; -import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; +import static org.briarproject.bramble.test.TestUtils.getTransportId; @Module public class FakeTorPluginConfigModule { + public static final TransportId SIMPLEX_TRANSPORT_ID = getTransportId(); + private static final int MAX_LATENCY = 30_000; // 30 seconds + + @NotNullByDefault + private final SimplexPluginFactory simplex = new SimplexPluginFactory() { + + @Override + public TransportId getId() { + return SIMPLEX_TRANSPORT_ID; + } + + @Override + public long getMaxLatency() { + return MAX_LATENCY; + } + + @Override + @Nullable + public SimplexPlugin createPlugin(PluginCallback callback) { + return null; + } + }; + @Provides PluginConfig providePluginConfig(FakeTorPluginFactory tor) { @NotNullByDefault @@ -32,7 +59,7 @@ public class FakeTorPluginConfigModule { @Override public Collection getSimplexFactories() { - return emptyList(); + return singletonList(simplex); } @Override diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java similarity index 100% rename from bramble-core/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java rename to mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java From a720501fde1d339ed832ce1133dd6ac4be0ba258 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 11 Oct 2022 11:56:38 -0300 Subject: [PATCH 2/9] First integration test for mailbox with two contacts one private message gets send via mailbox from one contact to the other --- .../bramble/test/BrambleIntegrationTest.java | 9 +- mailbox-integration-tests/build.gradle | 4 + .../AbstractMailboxIntegrationTest.java | 148 ++++++++++++++++-- .../mailbox/MailboxIntegrationTest.java | 64 ++++++++ .../MailboxIntegrationTestComponent.java | 36 +++-- ...ilboxContactListWorkerIntegrationTest.java | 21 +-- .../bramble/test/FakeTorPlugin.java | 11 +- .../bramble/test/FakeTorPluginFactory.java | 2 +- ...ava => MailboxTestPluginConfigModule.java} | 12 +- 9 files changed, 253 insertions(+), 54 deletions(-) create mode 100644 mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java rename mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/{FakeTorPluginConfigModule.java => MailboxTestPluginConfigModule.java} (80%) diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleIntegrationTest.java index e4cd51826..9e6c41ab6 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleIntegrationTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleIntegrationTest.java @@ -235,11 +235,16 @@ public abstract class BrambleIntegrationTest { static final String URL_BASE = "http://127.0.0.1:8000"; - private final File testDir = getTestDirectory(); - final File dir1 = new File(testDir, "alice"); - final File dir2 = new File(testDir, "bob"); + private final File dir1 = new File(testDir, "alice"); + private final File dir2 = new File(testDir, "bob"); + private final SecretKey rootKey = getSecretKey(); MailboxIntegrationTestComponent c1, c2; + Contact contact1From2, contact2From1; + TestMailbox mailbox; + MailboxApi api = createMailboxApi(); + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + c1 = startTestComponent(dir1, "Alice"); + c2 = startTestComponent(dir2, "Bob"); + mailbox = new TestMailbox(new File(testDir, "mailbox")); + mailbox.startLifecycle(); + } + + @After + @Override + public void tearDown() throws Exception { + super.tearDown(); + c1.getLifecycleManager().stopServices(); + c2.getLifecycleManager().stopServices(); + c1.getLifecycleManager().waitForShutdown(); + c2.getLifecycleManager().waitForShutdown(); + mailbox.stopLifecycle(true); + } MailboxIntegrationTestComponent startTestComponent( File databaseDir, String name) throws Exception { + TestDatabaseConfigModule dbModule = + new TestDatabaseConfigModule(databaseDir); MailboxIntegrationTestComponent component = DaggerMailboxIntegrationTestComponent .builder() - .testDatabaseConfigModule( - new TestDatabaseConfigModule(databaseDir)) + .testDatabaseConfigModule(dbModule) .build(); - BrambleCoreIntegrationTestEagerSingletons.Helper - .injectEagerSingletons(component); + injectEagerSingletons(component); + component.getPluginManager().setPluginEnabled(TorConstants.ID, false); + setUp(component, name); return component; } @@ -56,6 +102,7 @@ abstract class AbstractMailboxIntegrationTest extends BrambleTestCase { LifecycleManager lifecycleManager = device.getLifecycleManager(); lifecycleManager.startServices(getSecretKey()); lifecycleManager.waitForStartup(); + addEventListener(device); } MailboxProperties pair(MailboxIntegrationTestComponent c, @@ -81,4 +128,83 @@ abstract class AbstractMailboxIntegrationTest extends BrambleTestCase { ); } + void addContacts() throws Exception { + LocalAuthor author1 = c1.getIdentityManager().getLocalAuthor(); + LocalAuthor author2 = c2.getIdentityManager().getLocalAuthor(); + + ContactId contactId1 = c1.getContactManager().addContact(author2, + author1.getId(), rootKey, c1.getClock().currentTimeMillis(), + true, true, true); + ContactId contactId2 = c2.getContactManager().addContact(author1, + author2.getId(), rootKey, c2.getClock().currentTimeMillis(), + false, true, true); + + contact2From1 = c1.getContactManager().getContact(contactId2); + contact1From2 = c2.getContactManager().getContact(contactId1); + + // Sync client versioning update from 0 to 1 + sync1To2(1, true); + // Sync client versioning update and ack from 1 to 0 + sync2To1(1, true); + // Sync second client versioning update, mailbox properties and ack + // from 0 to 1 + sync1To2(2, true); + // Sync mailbox properties and ack from 1 to 0 + sync2To1(1, true); + // Sync final ack from 0 to 1 + ack1To2(1); + } + + T getFromDb(MailboxIntegrationTestComponent device, + DbCallable callable) throws Exception { + return device.getDatabaseComponent() + .transactionWithResult(true, callable::call); + } + + void restartTor(MailboxIntegrationTestComponent device) + throws PluginException { + Plugin torPlugin = device.getPluginManager().getPlugin(TorConstants.ID); + assertNotNull(torPlugin); + torPlugin.stop(); + torPlugin.start(); + } + + MailboxProperties getMailboxProperties( + MailboxIntegrationTestComponent device, ContactId contactId) + throws DbException { + DatabaseComponent db = device.getDatabaseComponent(); + MailboxUpdateWithMailbox update = (MailboxUpdateWithMailbox) + db.transactionWithNullableResult(true, txn -> + device.getMailboxUpdateManager() + .getRemoteUpdate(txn, contactId) + ); + if (update == null) fail(); + return update.getMailboxProperties(); + } + + void sendMessage(MailboxIntegrationTestComponent from, + ContactId toContactId, String text) throws Exception { + GroupId g = from.getMessagingManager().getConversationId(toContactId); + PrivateMessage m = from.getPrivateMessageFactory().createPrivateMessage( + g, from.getClock().currentTimeMillis(), text, emptyList(), + NO_AUTO_DELETE_TIMER); + from.getMessagingManager().addLocalMessage(m); + } + + void sync1To2(int num, boolean valid) throws Exception { + syncMessage(c1, c2, contact2From1.getId(), num, valid); + } + + void sync2To1(int num, boolean valid) throws Exception { + syncMessage(c2, c1, contact1From2.getId(), num, valid); + } + + void ack1To2(int num) throws Exception { + sendAcks(c1, c2, contact2From1.getId(), num); + } + + void ack2To1(int num) throws Exception { + sendAcks(c2, c1, contact1From2.getId(), num); + } + } diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java new file mode 100644 index 000000000..34cb73948 --- /dev/null +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java @@ -0,0 +1,64 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.mailbox.MailboxProperties; +import org.briarproject.bramble.mailbox.MailboxApi.MailboxFile; +import org.junit.Test; + +import java.util.Collection; +import java.util.List; + +import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.retryUntilSuccessOrTimeout; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class MailboxIntegrationTest extends AbstractMailboxIntegrationTest { + + @Test + public void testSendMessageViaMailbox() throws Exception { + addContacts(); + + // c1 one pairs the mailbox + MailboxProperties props1 = pair(c1, mailbox); + + // Check for number of contacts on mailbox via API every 100ms + retryUntilSuccessOrTimeout(1_000, 100, () -> { + Collection contacts = api.getContacts(props1); + return contacts.size() == 1; + }); + + // tell contact about mailbox + sync1To2(1, true); + ack2To1(1); + + // contact should have received their MailboxProperties + MailboxProperties props2 = + getMailboxProperties(c2, contact1From2.getId()); + assertNotNull(props2.getInboxId()); + + // send message and wait for it to arrive via mailbox + sendMessage(c1, contact2From1.getId(), "test"); + + // restart Tor for c1 to cause an immediate upload + // and wait until file arrived on mailbox + restartTor(c1); + retryUntilSuccessOrTimeout(5_000, 100, () -> { + List files = api.getFiles(props2, props2.getInboxId()); + return files.size() > 0; + }); + + // restart Tor for c2 to cause an immediate download + // and wait for message to arrive + restartTor(c2); + awaitPendingMessageDelivery(1, 5_000); + + // private message arrived for c2 + int size = getFromDb(c2, txn -> c2.getMessagingManager() + .getMessageHeaders(txn, contact1From2.getId()).size()); + assertEquals(1, size); + + // all files were deleted from mailbox + assertEquals(0, api.getFiles(props2, props2.getInboxId()).size()); + } + +} diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java index aa37adc8b..278fa75fe 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java @@ -1,18 +1,19 @@ package org.briarproject.bramble.mailbox; +import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; import org.briarproject.bramble.BrambleCoreModule; -import org.briarproject.bramble.api.contact.ContactManager; -import org.briarproject.bramble.api.db.DatabaseComponent; -import org.briarproject.bramble.api.identity.AuthorFactory; -import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.mailbox.MailboxManager; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; -import org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.TestUrlConverterModule; +import org.briarproject.bramble.api.mailbox.MailboxUpdateManager; +import org.briarproject.bramble.api.plugin.PluginManager; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; -import org.briarproject.bramble.test.BrambleIntegrationTestComponent; -import org.briarproject.bramble.test.FakeTorPluginConfigModule; +import org.briarproject.bramble.test.MailboxTestPluginConfigModule; import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestSocksModule; +import org.briarproject.briar.BriarCoreModule; +import org.briarproject.briar.identity.IdentityModule; +import org.briarproject.briar.messaging.MessagingModule; +import org.briarproject.briar.test.BriarIntegrationTestComponent; import javax.inject.Singleton; @@ -22,23 +23,30 @@ import dagger.Component; @Component(modules = { BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, + BriarCoreModule.class, TestUrlConverterModule.class, - FakeTorPluginConfigModule.class, + MailboxTestPluginConfigModule.class, TestSocksModule.class, TestDnsModule.class, }) interface MailboxIntegrationTestComponent extends - BrambleIntegrationTestComponent { - - DatabaseComponent getDatabaseComponent(); + BriarIntegrationTestComponent { MailboxManager getMailboxManager(); MailboxSettingsManager getMailboxSettingsManager(); - LifecycleManager getLifecycleManager(); + MailboxUpdateManager getMailboxUpdateManager(); - ContactManager getContactManager(); + PluginManager getPluginManager(); - AuthorFactory getAuthorFactory(); + class Helper { + static void injectEagerSingletons( + MailboxIntegrationTestComponent c) { + BrambleCoreIntegrationTestEagerSingletons.Helper + .injectEagerSingletons(c); + c.inject(new IdentityModule.EagerSingletons()); + c.inject(new MessagingModule.EagerSingletons()); + } + } } diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/OwnMailboxContactListWorkerIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/OwnMailboxContactListWorkerIntegrationTest.java index 414ea1052..40b12ffc5 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/OwnMailboxContactListWorkerIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/OwnMailboxContactListWorkerIntegrationTest.java @@ -8,12 +8,8 @@ import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.mailbox.MailboxProperties; -import org.briarproject.mailbox.lib.TestMailbox; -import org.junit.After; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.TemporaryFolder; import java.util.ArrayList; import java.util.Collection; @@ -27,11 +23,6 @@ import static org.junit.Assert.assertEquals; public class OwnMailboxContactListWorkerIntegrationTest extends AbstractMailboxIntegrationTest { - @Rule - public TemporaryFolder mailboxDataDirectory = new TemporaryFolder(); - - private TestMailbox mailbox; - private final MailboxApi api = createMailboxApi(); private MailboxProperties ownerProperties; @@ -42,21 +33,13 @@ public class OwnMailboxContactListWorkerIntegrationTest private final long timestamp = System.currentTimeMillis(); @Before + @Override public void setUp() throws Exception { - mailbox = new TestMailbox(mailboxDataDirectory.getRoot()); - mailbox.startLifecycle(); - - c1 = startTestComponent(dir1, "Alice"); + super.setUp(); localAuthor1 = c1.getIdentityManager().getLocalAuthor(); - ownerProperties = pair(c1, mailbox); } - @After - public void tearDown() { - mailbox.stopLifecycle(true); - } - @Test public void testUploadContacts() throws Exception { // Check the initial conditions diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java index 85111ea8b..fd702cb3c 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPlugin.java @@ -4,6 +4,7 @@ import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.keyagreement.KeyAgreementListener; import org.briarproject.bramble.api.plugin.ConnectionHandler; +import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; @@ -20,7 +21,6 @@ import javax.annotation.Nullable; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; -import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; @NotNullByDefault @@ -28,9 +28,14 @@ public class FakeTorPlugin implements DuplexPlugin { private static final Logger LOG = getLogger(FakeTorPlugin.class.getName()); + private final PluginCallback callback; private State state = INACTIVE; + FakeTorPlugin(PluginCallback callback) { + this.callback = callback; + } + @Override public TransportId getId() { return TorConstants.ID; @@ -50,12 +55,14 @@ public class FakeTorPlugin implements DuplexPlugin { public void start() { LOG.info("Starting plugin"); state = ACTIVE; + callback.pluginStateChanged(state); } @Override public void stop() { LOG.info("Stopping plugin"); - state = DISABLED; + state = INACTIVE; + callback.pluginStateChanged(state); } @Override diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java index 32ea3139d..9e718991b 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginFactory.java @@ -32,6 +32,6 @@ public class FakeTorPluginFactory implements DuplexPluginFactory { @Nullable @Override public DuplexPlugin createPlugin(PluginCallback callback) { - return new FakeTorPlugin(); + return new FakeTorPlugin(callback); } } diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/MailboxTestPluginConfigModule.java similarity index 80% rename from mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java rename to mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/MailboxTestPluginConfigModule.java index de4471242..a8c681bd2 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/FakeTorPluginConfigModule.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/MailboxTestPluginConfigModule.java @@ -6,6 +6,7 @@ import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; +import org.briarproject.bramble.plugin.file.MailboxPluginFactory; import org.briarproject.nullsafety.NotNullByDefault; import java.util.Collection; @@ -17,14 +18,14 @@ import javax.annotation.Nullable; import dagger.Module; import dagger.Provides; +import static java.util.Arrays.asList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; -import static org.briarproject.bramble.test.TestUtils.getTransportId; +import static org.briarproject.bramble.test.TestPluginConfigModule.SIMPLEX_TRANSPORT_ID; @Module -public class FakeTorPluginConfigModule { +public class MailboxTestPluginConfigModule { - public static final TransportId SIMPLEX_TRANSPORT_ID = getTransportId(); private static final int MAX_LATENCY = 30_000; // 30 seconds @NotNullByDefault @@ -48,7 +49,8 @@ public class FakeTorPluginConfigModule { }; @Provides - PluginConfig providePluginConfig(FakeTorPluginFactory tor) { + PluginConfig providePluginConfig(FakeTorPluginFactory tor, + MailboxPluginFactory mailboxPluginFactory) { @NotNullByDefault PluginConfig pluginConfig = new PluginConfig() { @@ -59,7 +61,7 @@ public class FakeTorPluginConfigModule { @Override public Collection getSimplexFactories() { - return singletonList(simplex); + return asList(simplex, mailboxPluginFactory); } @Override From 28f770df892dd3787a8dd6d6403ba912c29f6104 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 11 Oct 2022 12:09:01 -0300 Subject: [PATCH 3/9] Always run mailbox tests when changing them --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 966457e8e..2f93054bf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -107,6 +107,10 @@ bridge test: mailbox integration test: extends: .optional_tests rules: + - changes: + - mailbox-integration-tests/**/* + when: on_success + allow_failure: false - if: '$CI_PIPELINE_SOURCE == "schedule"' when: on_success - if: '$CI_COMMIT_TAG == null' From bab6ec70f521e3811c22fc938d3f4a5074245911 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 21 Oct 2022 11:35:25 -0300 Subject: [PATCH 4/9] Factor out mailbox constants into a MailboxConfig so that we can change them for integration tests via the new ModularMailboxModule that now also includes the UrlProvider --- .../bramble/mailbox/MailboxApiCallerImpl.java | 11 +++++-- .../bramble/mailbox/MailboxConfig.java | 24 +++++++++++++++ .../bramble/mailbox/MailboxConfigImpl.java | 30 +++++++++++++++++++ ...rModule.java => ModularMailboxModule.java} | 6 +++- .../mailbox/TorReachabilityMonitorImpl.java | 5 +++- ...ntactExchangeIntegrationTestComponent.java | 4 +-- .../mailbox/MailboxApiCallerImplTest.java | 3 +- .../TorReachabilityMonitorImplTest.java | 3 +- ...emovableDriveIntegrationTestComponent.java | 4 +-- .../sync/SyncIntegrationTestComponent.java | 4 +-- .../test/BrambleIntegrationTestComponent.java | 4 +-- .../TransportKeyAgreementTestComponent.java | 4 +-- .../bramble/BrambleJavaModule.java | 4 +-- .../BrambleJavaIntegrationTestComponent.java | 4 +-- .../briar/android/BriarUiTestComponent.java | 4 +-- .../briar/android/BriarUiTestComponent.java | 4 +-- .../briar/android/AndroidComponent.java | 4 +-- .../FeedManagerIntegrationTestComponent.java | 4 +-- .../IntroductionIntegrationTestComponent.java | 4 +-- .../MessageSizeIntegrationTestComponent.java | 4 +-- ...plexMessagingIntegrationTestComponent.java | 4 +-- .../test/BriarIntegrationTestComponent.java | 4 +-- .../mailbox/MailboxIntegrationTest.java | 20 ++++++------- .../MailboxIntegrationTestComponent.java | 2 +- .../mailbox/MailboxIntegrationTestUtils.java | 2 +- .../mailbox/TestMailboxConfigImpl.java | 30 +++++++++++++++++++ ...ule.java => TestModularMailboxModule.java} | 7 ++++- 27 files changed, 152 insertions(+), 51 deletions(-) create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxConfig.java create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxConfigImpl.java rename bramble-core/src/main/java/org/briarproject/bramble/mailbox/{UrlConverterModule.java => ModularMailboxModule.java} (58%) create mode 100644 mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestMailboxConfigImpl.java rename mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/{TestUrlConverterModule.java => TestModularMailboxModule.java} (72%) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApiCallerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApiCallerImpl.java index ce08b2f25..368c7ed7c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApiCallerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApiCallerImpl.java @@ -20,12 +20,15 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; class MailboxApiCallerImpl implements MailboxApiCaller { private final TaskScheduler taskScheduler; + private final MailboxConfig mailboxConfig; private final Executor ioExecutor; @Inject MailboxApiCallerImpl(TaskScheduler taskScheduler, + MailboxConfig mailboxConfig, @IoExecutor Executor ioExecutor) { this.taskScheduler = taskScheduler; + this.mailboxConfig = mailboxConfig; this.ioExecutor = ioExecutor; } @@ -49,7 +52,8 @@ class MailboxApiCallerImpl implements MailboxApiCaller { private boolean cancelled = false; @GuardedBy("lock") - private long retryIntervalMs = MIN_RETRY_INTERVAL_MS; + private long retryIntervalMs = + mailboxConfig.getApiCallerMinRetryInterval(); private Task(ApiCall apiCall) { this.apiCall = apiCall; @@ -74,8 +78,9 @@ class MailboxApiCallerImpl implements MailboxApiCaller { scheduledTask = taskScheduler.schedule(this::callApi, ioExecutor, retryIntervalMs, MILLISECONDS); // Increase the retry interval each time we retry - retryIntervalMs = - min(MAX_RETRY_INTERVAL_MS, retryIntervalMs * 2); + retryIntervalMs = min( + mailboxConfig.getApiCallerMaxRetryInterval(), + retryIntervalMs * 2); } } else { synchronized (lock) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxConfig.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxConfig.java new file mode 100644 index 000000000..7f03dff6d --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxConfig.java @@ -0,0 +1,24 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.bramble.api.plugin.Plugin; + +interface MailboxConfig { + + /** + * The minimum interval between API call retries in milliseconds. + */ + long getApiCallerMinRetryInterval(); + + /** + * The maximum interval between API call retries in milliseconds. + */ + long getApiCallerMaxRetryInterval(); + + /** + * How long (in milliseconds) the Tor plugin needs to be continuously + * {@link Plugin.State#ACTIVE active} before we assume our contacts can + * reach our hidden service. + */ + long getTorReachabilityPeriod(); + +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxConfigImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxConfigImpl.java new file mode 100644 index 000000000..fa6a1f528 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxConfigImpl.java @@ -0,0 +1,30 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; +import javax.inject.Inject; + +@Immutable +@NotNullByDefault +class MailboxConfigImpl implements MailboxConfig { + + @Inject + MailboxConfigImpl() { + } + + @Override + public long getApiCallerMinRetryInterval() { + return MailboxApiCaller.MIN_RETRY_INTERVAL_MS; + } + + @Override + public long getApiCallerMaxRetryInterval() { + return MailboxApiCaller.MAX_RETRY_INTERVAL_MS; + } + + @Override + public long getTorReachabilityPeriod() { + return TorReachabilityMonitor.REACHABILITY_PERIOD_MS; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/UrlConverterModule.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/ModularMailboxModule.java similarity index 58% rename from bramble-core/src/main/java/org/briarproject/bramble/mailbox/UrlConverterModule.java rename to bramble-core/src/main/java/org/briarproject/bramble/mailbox/ModularMailboxModule.java index cc9d44698..8ddbd7824 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/UrlConverterModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/ModularMailboxModule.java @@ -4,7 +4,11 @@ import dagger.Module; import dagger.Provides; @Module -public class UrlConverterModule { +public class ModularMailboxModule { + @Provides + MailboxConfig provideMailboxConfig(MailboxConfigImpl mailboxConfig) { + return mailboxConfig; + } @Provides UrlConverter provideUrlConverter(UrlConverterImpl urlConverter) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/TorReachabilityMonitorImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/TorReachabilityMonitorImpl.java index 359e70460..20afebe30 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/TorReachabilityMonitorImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/TorReachabilityMonitorImpl.java @@ -32,6 +32,7 @@ class TorReachabilityMonitorImpl private final Executor ioExecutor; private final TaskScheduler taskScheduler; + private final MailboxConfig mailboxConfig; private final PluginManager pluginManager; private final EventBus eventBus; private final Object lock = new Object(); @@ -50,10 +51,12 @@ class TorReachabilityMonitorImpl TorReachabilityMonitorImpl( @IoExecutor Executor ioExecutor, TaskScheduler taskScheduler, + MailboxConfig mailboxConfig, PluginManager pluginManager, EventBus eventBus) { this.ioExecutor = ioExecutor; this.taskScheduler = taskScheduler; + this.mailboxConfig = mailboxConfig; this.pluginManager = pluginManager; this.eventBus = eventBus; } @@ -110,7 +113,7 @@ class TorReachabilityMonitorImpl synchronized (lock) { if (destroyed || task != null) return; task = taskScheduler.schedule(this::onTorReachable, ioExecutor, - REACHABILITY_PERIOD_MS, MILLISECONDS); + mailboxConfig.getTorReachabilityPeriod(), MILLISECONDS); } } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactExchangeIntegrationTestComponent.java b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactExchangeIntegrationTestComponent.java index becb74db8..f01e365f1 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactExchangeIntegrationTestComponent.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactExchangeIntegrationTestComponent.java @@ -9,7 +9,7 @@ import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestPluginConfigModule; @@ -25,7 +25,7 @@ import dagger.Component; @Component(modules = { BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiCallerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiCallerImplTest.java index 2612fe16a..b625a94a8 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiCallerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiCallerImplTest.java @@ -21,12 +21,13 @@ public class MailboxApiCallerImplTest extends BrambleMockTestCase { private final TaskScheduler taskScheduler = context.mock(TaskScheduler.class); + private final MailboxConfig mailboxConfig = new MailboxConfigImpl(); private final Executor ioExecutor = context.mock(Executor.class); private final ApiCall apiCall = context.mock(ApiCall.class); private final Cancellable scheduledTask = context.mock(Cancellable.class); private final MailboxApiCallerImpl caller = - new MailboxApiCallerImpl(taskScheduler, ioExecutor); + new MailboxApiCallerImpl(taskScheduler, mailboxConfig, ioExecutor); @Test public void testSubmitsTaskImmediately() { diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/TorReachabilityMonitorImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/TorReachabilityMonitorImplTest.java index 032095cd6..547041a1f 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/TorReachabilityMonitorImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/TorReachabilityMonitorImplTest.java @@ -29,6 +29,7 @@ public class TorReachabilityMonitorImplTest extends BrambleMockTestCase { private final Executor ioExecutor = context.mock(Executor.class); private final TaskScheduler taskScheduler = context.mock(TaskScheduler.class); + private final MailboxConfig mailboxConfig = new MailboxConfigImpl(); private final PluginManager pluginManager = context.mock(PluginManager.class); private final EventBus eventBus = context.mock(EventBus.class); @@ -39,7 +40,7 @@ public class TorReachabilityMonitorImplTest extends BrambleMockTestCase { private final TorReachabilityMonitorImpl monitor = new TorReachabilityMonitorImpl(ioExecutor, taskScheduler, - pluginManager, eventBus); + mailboxConfig, pluginManager, eventBus); @Test public void testSchedulesTaskWhenStartedIfTorIsActive() { diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTestComponent.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTestComponent.java index 59435bdb0..a353f6fcb 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTestComponent.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTestComponent.java @@ -9,7 +9,7 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.plugin.file.RemovableDriveManager; import org.briarproject.bramble.battery.DefaultBatteryManagerModule; import org.briarproject.bramble.event.DefaultEventExecutorModule; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.system.DefaultWakefulIoExecutorModule; import org.briarproject.bramble.system.TimeTravelModule; import org.briarproject.bramble.test.TestDatabaseConfigModule; @@ -35,7 +35,7 @@ import dagger.Component; TestMailboxDirectoryModule.class, RemovableDriveIntegrationTestModule.class, RemovableDriveModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestSecureRandomModule.class, TimeTravelModule.class, TestSocksModule.class, diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTestComponent.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTestComponent.java index d6571298e..8a4cda654 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTestComponent.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTestComponent.java @@ -2,7 +2,7 @@ package org.briarproject.bramble.sync; import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; import org.briarproject.bramble.BrambleCoreModule; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestPluginConfigModule; @@ -16,7 +16,7 @@ import dagger.Component; @Component(modules = { BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleIntegrationTestComponent.java b/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleIntegrationTestComponent.java index db5ef337b..9544d7e9b 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleIntegrationTestComponent.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleIntegrationTestComponent.java @@ -6,7 +6,7 @@ import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.connection.ConnectionManager; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.identity.IdentityManager; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import javax.inject.Singleton; @@ -16,7 +16,7 @@ import dagger.Component; @Component(modules = { BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/bramble-core/src/test/java/org/briarproject/bramble/transport/agreement/TransportKeyAgreementTestComponent.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/agreement/TransportKeyAgreementTestComponent.java index 88a4747a2..64dfa6f2c 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/transport/agreement/TransportKeyAgreementTestComponent.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/agreement/TransportKeyAgreementTestComponent.java @@ -7,7 +7,7 @@ import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.transport.KeyManager; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.BrambleIntegrationTestComponent; import org.briarproject.bramble.test.TestDnsModule; @@ -22,7 +22,7 @@ import dagger.Component; @Component(modules = { BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaModule.java b/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaModule.java index 001c44d63..d627025ab 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaModule.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaModule.java @@ -1,7 +1,7 @@ package org.briarproject.bramble; import org.briarproject.bramble.io.DnsModule; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.network.JavaNetworkModule; import org.briarproject.bramble.plugin.tor.CircumventionModule; import org.briarproject.bramble.socks.SocksModule; @@ -14,7 +14,7 @@ import dagger.Module; DnsModule.class, JavaNetworkModule.class, JavaSystemModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, SocksModule.class }) public class BrambleJavaModule { diff --git a/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java b/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java index 8003bb7e5..3f47a3541 100644 --- a/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java +++ b/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java @@ -3,7 +3,7 @@ package org.briarproject.bramble.test; import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; import org.briarproject.bramble.BrambleCoreModule; import org.briarproject.bramble.BrambleJavaModule; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.plugin.tor.BridgeTest; import org.briarproject.bramble.plugin.tor.CircumventionProvider; @@ -16,7 +16,7 @@ import dagger.Component; BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, BrambleJavaModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestTorPortsModule.class, TestPluginConfigModule.class, }) diff --git a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/BriarUiTestComponent.java b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/BriarUiTestComponent.java index 6216e241a..df1d043c3 100644 --- a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/BriarUiTestComponent.java +++ b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/BriarUiTestComponent.java @@ -3,7 +3,7 @@ package org.briarproject.briar.android; import org.briarproject.bramble.BrambleAndroidModule; import org.briarproject.bramble.BrambleCoreModule; import org.briarproject.bramble.account.BriarAccountModule; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.plugin.file.RemovableDriveModule; import org.briarproject.bramble.system.ClockModule; import org.briarproject.briar.BriarCoreModule; @@ -28,7 +28,7 @@ import dagger.Component; BrambleAndroidModule.class, BriarAccountModule.class, BrambleCoreModule.class, - UrlConverterModule.class + ModularMailboxModule.class }) public interface BriarUiTestComponent extends AndroidComponent { diff --git a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/BriarUiTestComponent.java b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/BriarUiTestComponent.java index a12e480d2..e59736378 100644 --- a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/BriarUiTestComponent.java +++ b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/BriarUiTestComponent.java @@ -3,7 +3,7 @@ package org.briarproject.briar.android; import org.briarproject.bramble.BrambleAndroidModule; import org.briarproject.bramble.BrambleCoreModule; import org.briarproject.bramble.account.BriarAccountModule; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.plugin.file.RemovableDriveModule; import org.briarproject.bramble.system.ClockModule; import org.briarproject.briar.BriarCoreModule; @@ -27,7 +27,7 @@ import dagger.Component; BrambleAndroidModule.class, BriarAccountModule.class, BrambleCoreModule.class, - UrlConverterModule.class + ModularMailboxModule.class }) public interface BriarUiTestComponent extends AndroidComponent { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java index c1ec805a6..468782cd4 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java @@ -28,7 +28,7 @@ import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.api.system.AndroidWakeLockManager; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.LocationUtils; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.plugin.file.RemovableDriveModule; import org.briarproject.bramble.plugin.tor.CircumventionProvider; import org.briarproject.bramble.system.ClockModule; @@ -102,7 +102,7 @@ import dagger.Component; AttachmentModule.class, ClockModule.class, MediaModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, RemovableDriveModule.class }) public interface AndroidComponent diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java index fe4afa241..896df814a 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java @@ -4,7 +4,7 @@ import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; import org.briarproject.bramble.BrambleCoreModule; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestPluginConfigModule; @@ -29,7 +29,7 @@ import dagger.Component; BriarClientModule.class, FeedModule.class, IdentityModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java index 69f7bdc4d..f054a55cb 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java @@ -1,7 +1,7 @@ package org.briarproject.briar.introduction; import org.briarproject.bramble.BrambleCoreModule; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestPluginConfigModule; @@ -41,7 +41,7 @@ import dagger.Component; MessagingModule.class, PrivateGroupModule.class, SharingModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java index 6b4083ade..c01400b82 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java @@ -2,7 +2,7 @@ package org.briarproject.briar.messaging; import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; import org.briarproject.bramble.BrambleCoreModule; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestPluginConfigModule; @@ -29,7 +29,7 @@ import dagger.Component; ForumModule.class, IdentityModule.class, MessagingModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java index e3498608d..f929bab69 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java @@ -7,7 +7,7 @@ import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestPluginConfigModule; @@ -30,7 +30,7 @@ import dagger.Component; BriarClientModule.class, ConversationModule.class, MessagingModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java index a2486c347..c2010c345 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java @@ -8,7 +8,7 @@ import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.system.Clock; -import org.briarproject.bramble.mailbox.UrlConverterModule; +import org.briarproject.bramble.mailbox.ModularMailboxModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.BrambleIntegrationTestComponent; import org.briarproject.bramble.test.TestDnsModule; @@ -66,7 +66,7 @@ import dagger.Component; MessagingModule.class, PrivateGroupModule.class, SharingModule.class, - UrlConverterModule.class, + ModularMailboxModule.class, TestDnsModule.class, TestSocksModule.class, TestPluginConfigModule.class, diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java index 34cb73948..02fa6bfc9 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java @@ -21,7 +21,8 @@ public class MailboxIntegrationTest extends AbstractMailboxIntegrationTest { // c1 one pairs the mailbox MailboxProperties props1 = pair(c1, mailbox); - // Check for number of contacts on mailbox via API every 100ms + // Check for number of contacts on mailbox via API every 100ms. + // This should be quick and will succeed with first call. retryUntilSuccessOrTimeout(1_000, 100, () -> { Collection contacts = api.getContacts(props1); return contacts.size() == 1; @@ -39,20 +40,17 @@ public class MailboxIntegrationTest extends AbstractMailboxIntegrationTest { // send message and wait for it to arrive via mailbox sendMessage(c1, contact2From1.getId(), "test"); - // restart Tor for c1 to cause an immediate upload - // and wait until file arrived on mailbox - restartTor(c1); - retryUntilSuccessOrTimeout(5_000, 100, () -> { + // wait until file arrived on mailbox + retryUntilSuccessOrTimeout(5_000, 500, () -> { List files = api.getFiles(props2, props2.getInboxId()); - return files.size() > 0; + return files.size() > 1; }); - // restart Tor for c2 to cause an immediate download - // and wait for message to arrive - restartTor(c2); - awaitPendingMessageDelivery(1, 5_000); + // wait for message to arrive + // this might require 2nd download cycle after Tor reachability period + awaitPendingMessageDelivery(1); - // private message arrived for c2 + // assert that private message arrived for c2 int size = getFromDb(c2, txn -> c2.getMessagingManager() .getMessageHeaders(txn, contact1From2.getId()).size()); assertEquals(1, size); diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java index 278fa75fe..7ead8facc 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java @@ -24,7 +24,7 @@ import dagger.Component; BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, BriarCoreModule.class, - TestUrlConverterModule.class, + TestModularMailboxModule.class, MailboxTestPluginConfigModule.class, TestSocksModule.class, TestDnsModule.class, diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestUtils.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestUtils.java index 9fd708fcd..bcea13ea3 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestUtils.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestUtils.java @@ -4,7 +4,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import static java.lang.System.currentTimeMillis; import static org.briarproject.bramble.mailbox.MailboxTestUtils.createHttpClientProvider; -import static org.briarproject.bramble.mailbox.TestUrlConverterModule.urlConverter; +import static org.briarproject.bramble.mailbox.TestModularMailboxModule.urlConverter; import static org.junit.Assert.fail; class MailboxIntegrationTestUtils { diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestMailboxConfigImpl.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestMailboxConfigImpl.java new file mode 100644 index 000000000..e2744913c --- /dev/null +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestMailboxConfigImpl.java @@ -0,0 +1,30 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; +import javax.inject.Inject; + +@Immutable +@NotNullByDefault +class TestMailboxConfigImpl implements MailboxConfig { + + @Inject + TestMailboxConfigImpl() { + } + + @Override + public long getApiCallerMinRetryInterval() { + return 1000; // MailboxApiCaller.MIN_RETRY_INTERVAL_MS; + } + + @Override + public long getApiCallerMaxRetryInterval() { + return 2000; // MailboxApiCaller.MAX_RETRY_INTERVAL_MS; + } + + @Override + public long getTorReachabilityPeriod() { + return 5000; // TorReachabilityMonitor.REACHABILITY_PERIOD_MS; + } +} diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverterModule.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestModularMailboxModule.java similarity index 72% rename from mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverterModule.java rename to mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestModularMailboxModule.java index a47ac069a..22e001bae 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestUrlConverterModule.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestModularMailboxModule.java @@ -9,7 +9,12 @@ import static org.briarproject.bramble.mailbox.AbstractMailboxIntegrationTest.UR @Module @NotNullByDefault -class TestUrlConverterModule { +class TestModularMailboxModule { + + @Provides + MailboxConfig provideMailboxConfig(TestMailboxConfigImpl mailboxConfig) { + return mailboxConfig; + } static UrlConverter urlConverter = onion -> URL_BASE; From 324ca1b50b215e2393a4ece234e21004f8e4dcb2 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 31 Oct 2022 18:16:27 -0300 Subject: [PATCH 5/9] Address review feedback --- .../AbstractMailboxIntegrationTest.java | 46 ++++++++----------- .../mailbox/TestMailboxConfigImpl.java | 6 +-- 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java index 467abd026..97fb507fb 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java @@ -15,9 +15,6 @@ import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; -import org.briarproject.bramble.api.plugin.Plugin; -import org.briarproject.bramble.api.plugin.PluginException; -import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.test.BrambleIntegrationTest; import org.briarproject.bramble.test.TestDatabaseConfigModule; @@ -86,7 +83,6 @@ abstract class AbstractMailboxIntegrationTest .testDatabaseConfigModule(dbModule) .build(); injectEagerSingletons(component); - component.getPluginManager().setPluginEnabled(TorConstants.ID, false); setUp(component, name); return component; @@ -121,37 +117,43 @@ abstract class AbstractMailboxIntegrationTest if (!latch.await(10, SECONDS)) { fail("Timeout reached when waiting for pairing."); } - return c.getDatabaseComponent() + MailboxProperties properties = c.getDatabaseComponent() .transactionWithNullableResult(true, txn -> c.getMailboxSettingsManager() .getOwnMailboxProperties(txn) ); + assertNotNull(properties); + return properties; } void addContacts() throws Exception { LocalAuthor author1 = c1.getIdentityManager().getLocalAuthor(); LocalAuthor author2 = c2.getIdentityManager().getLocalAuthor(); - ContactId contactId1 = c1.getContactManager().addContact(author2, - author1.getId(), rootKey, c1.getClock().currentTimeMillis(), - true, true, true); - ContactId contactId2 = c2.getContactManager().addContact(author1, - author2.getId(), rootKey, c2.getClock().currentTimeMillis(), - false, true, true); + ContactId contactId2From1 = + c1.getContactManager().addContact(author2, + author1.getId(), rootKey, + c1.getClock().currentTimeMillis(), + true, true, true); + ContactId contactId1From2 = + c2.getContactManager().addContact(author1, + author2.getId(), rootKey, + c2.getClock().currentTimeMillis(), + false, true, true); - contact2From1 = c1.getContactManager().getContact(contactId2); - contact1From2 = c2.getContactManager().getContact(contactId1); + contact2From1 = c1.getContactManager().getContact(contactId2From1); + contact1From2 = c2.getContactManager().getContact(contactId1From2); - // Sync client versioning update from 0 to 1 + // Sync client versioning update from 1 to 2 sync1To2(1, true); - // Sync client versioning update and ack from 1 to 0 + // Sync client versioning update and ack from 2 to 1 sync2To1(1, true); // Sync second client versioning update, mailbox properties and ack - // from 0 to 1 + // from 1 to 2 sync1To2(2, true); - // Sync mailbox properties and ack from 1 to 0 + // Sync mailbox properties and ack from 2 to 1 sync2To1(1, true); - // Sync final ack from 0 to 1 + // Sync final ack from 1 to 2 ack1To2(1); } @@ -161,14 +163,6 @@ abstract class AbstractMailboxIntegrationTest .transactionWithResult(true, callable::call); } - void restartTor(MailboxIntegrationTestComponent device) - throws PluginException { - Plugin torPlugin = device.getPluginManager().getPlugin(TorConstants.ID); - assertNotNull(torPlugin); - torPlugin.stop(); - torPlugin.start(); - } - MailboxProperties getMailboxProperties( MailboxIntegrationTestComponent device, ContactId contactId) throws DbException { diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestMailboxConfigImpl.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestMailboxConfigImpl.java index e2744913c..2552fca77 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestMailboxConfigImpl.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/TestMailboxConfigImpl.java @@ -15,16 +15,16 @@ class TestMailboxConfigImpl implements MailboxConfig { @Override public long getApiCallerMinRetryInterval() { - return 1000; // MailboxApiCaller.MIN_RETRY_INTERVAL_MS; + return 1000; } @Override public long getApiCallerMaxRetryInterval() { - return 2000; // MailboxApiCaller.MAX_RETRY_INTERVAL_MS; + return 2000; } @Override public long getTorReachabilityPeriod() { - return 5000; // TorReachabilityMonitor.REACHABILITY_PERIOD_MS; + return 10_000; } } From a705caa5faac88f813e58ab7aae1341a375cef89 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 31 Oct 2022 18:16:45 -0300 Subject: [PATCH 6/9] Add better logging for integration tests by injecting a ThreadFactory that can set thread names --- .../bramble/BrambleAndroidModule.java | 2 + .../bramble/TimeLoggingExecutor.java | 4 +- .../bramble/crypto/CryptoExecutorModule.java | 25 +++---- .../bramble/db/DatabaseExecutorModule.java | 21 +++--- .../event/DefaultEventExecutorModule.java | 6 +- .../bramble/lifecycle/LifecycleModule.java | 25 ++++--- .../system/DefaultTaskSchedulerModule.java | 16 ++--- .../system/DefaultThreadFactoryModule.java | 18 +++++ ...emovableDriveIntegrationTestComponent.java | 2 + .../BrambleCoreIntegrationTestModule.java | 1 + .../bramble/test/TestThreadFactoryModule.java | 66 +++++++++++++++++++ .../briar/headless/HeadlessModule.kt | 2 + .../briar/headless/HeadlessTestModule.kt | 2 + .../AbstractMailboxIntegrationTest.java | 11 +++- .../bramble/test/TestLogFormatter.java | 57 ++++++++++++++++ 15 files changed, 207 insertions(+), 51 deletions(-) create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/system/DefaultThreadFactoryModule.java create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/test/TestThreadFactoryModule.java create mode 100644 mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/TestLogFormatter.java diff --git a/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java b/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java index 5be846f61..7859bd652 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.socks.SocksModule; import org.briarproject.bramble.system.AndroidSystemModule; import org.briarproject.bramble.system.AndroidTaskSchedulerModule; import org.briarproject.bramble.system.AndroidWakefulIoExecutorModule; +import org.briarproject.bramble.system.DefaultThreadFactoryModule; import dagger.Module; @@ -18,6 +19,7 @@ import dagger.Module; AndroidSystemModule.class, AndroidTaskSchedulerModule.class, AndroidWakefulIoExecutorModule.class, + DefaultThreadFactoryModule.class, CircumventionModule.class, DnsModule.class, ReportingModule.class, diff --git a/bramble-core/src/main/java/org/briarproject/bramble/TimeLoggingExecutor.java b/bramble-core/src/main/java/org/briarproject/bramble/TimeLoggingExecutor.java index dc0b96d3d..3513b5f54 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/TimeLoggingExecutor.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/TimeLoggingExecutor.java @@ -4,6 +4,7 @@ import org.briarproject.nullsafety.NotNullByDefault; import java.util.concurrent.BlockingQueue; import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; @@ -19,9 +20,10 @@ public class TimeLoggingExecutor extends ThreadPoolExecutor { public TimeLoggingExecutor(String tag, int corePoolSize, int maxPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, + ThreadFactory threadFactory, RejectedExecutionHandler handler) { super(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, - handler); + threadFactory, handler); log = Logger.getLogger(tag); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoExecutorModule.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoExecutorModule.java index ab0e4114f..7a069b2eb 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoExecutorModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoExecutorModule.java @@ -9,6 +9,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import javax.inject.Inject; @@ -37,31 +38,31 @@ public class CryptoExecutorModule { private static final int MAX_EXECUTOR_THREADS = Math.max(1, Runtime.getRuntime().availableProcessors() - 1); - private final ExecutorService cryptoExecutor; - public CryptoExecutorModule() { - // Use an unbounded queue - BlockingQueue queue = new LinkedBlockingQueue<>(); - // Discard tasks that are submitted during shutdown - RejectedExecutionHandler policy = - new ThreadPoolExecutor.DiscardPolicy(); - // Create a limited # of threads and keep them in the pool for 60 secs - cryptoExecutor = new TimeLoggingExecutor("CryptoExecutor", 0, - MAX_EXECUTOR_THREADS, 60, SECONDS, queue, policy); } @Provides @Singleton @CryptoExecutor ExecutorService provideCryptoExecutorService( - LifecycleManager lifecycleManager) { + LifecycleManager lifecycleManager, ThreadFactory threadFactory) { + // Use an unbounded queue + BlockingQueue queue = new LinkedBlockingQueue<>(); + // Discard tasks that are submitted during shutdown + RejectedExecutionHandler policy = + new ThreadPoolExecutor.DiscardPolicy(); + // Create a limited # of threads and keep them in the pool for 60 secs + ExecutorService cryptoExecutor = new TimeLoggingExecutor( + "CryptoExecutor", 0, MAX_EXECUTOR_THREADS, 60, SECONDS, queue, + threadFactory, policy); lifecycleManager.registerForShutdown(cryptoExecutor); return cryptoExecutor; } @Provides @CryptoExecutor - Executor provideCryptoExecutor() { + Executor provideCryptoExecutor( + @CryptoExecutor ExecutorService cryptoExecutor) { return cryptoExecutor; } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseExecutorModule.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseExecutorModule.java index a65feef89..73b26710a 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseExecutorModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseExecutorModule.java @@ -9,6 +9,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import javax.inject.Inject; @@ -28,24 +29,20 @@ public class DatabaseExecutorModule { ExecutorService executorService; } - private final ExecutorService databaseExecutor; - - public DatabaseExecutorModule() { + @Provides + @Singleton + @DatabaseExecutor + ExecutorService provideDatabaseExecutorService( + LifecycleManager lifecycleManager, ThreadFactory threadFactory) { // Use an unbounded queue BlockingQueue queue = new LinkedBlockingQueue<>(); // Discard tasks that are submitted during shutdown RejectedExecutionHandler policy = new ThreadPoolExecutor.DiscardPolicy(); // Use a single thread and keep it in the pool for 60 secs - databaseExecutor = new TimeLoggingExecutor("DatabaseExecutor", 0, 1, - 60, SECONDS, queue, policy); - } - - @Provides - @Singleton - @DatabaseExecutor - ExecutorService provideDatabaseExecutorService( - LifecycleManager lifecycleManager) { + ExecutorService databaseExecutor = new TimeLoggingExecutor( + "DatabaseExecutor", 0, 1, 60, SECONDS, queue, threadFactory, + policy); lifecycleManager.registerForShutdown(databaseExecutor); return databaseExecutor; } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/event/DefaultEventExecutorModule.java b/bramble-core/src/main/java/org/briarproject/bramble/event/DefaultEventExecutorModule.java index 5fc21cc86..2d43800c1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/event/DefaultEventExecutorModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/event/DefaultEventExecutorModule.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.event; import org.briarproject.bramble.api.event.EventExecutor; import java.util.concurrent.Executor; +import java.util.concurrent.ThreadFactory; import javax.inject.Singleton; @@ -22,10 +23,11 @@ public class DefaultEventExecutorModule { @Provides @Singleton @EventExecutor - Executor provideEventExecutor() { + Executor provideEventExecutor(ThreadFactory threadFactory) { return newSingleThreadExecutor(r -> { - Thread t = new Thread(r); + Thread t = threadFactory.newThread(r); t.setDaemon(true); + t.setName(t.getName() + "-Event"); return t; }); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleModule.java b/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleModule.java index 43db266ef..b38f79b1c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleModule.java @@ -9,6 +9,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import javax.inject.Inject; @@ -28,19 +29,6 @@ public class LifecycleModule { Executor executor; } - private final ExecutorService ioExecutor; - - public LifecycleModule() { - // The thread pool is unbounded, so use direct handoff - BlockingQueue queue = new SynchronousQueue<>(); - // Discard tasks that are submitted during shutdown - RejectedExecutionHandler policy = - new ThreadPoolExecutor.DiscardPolicy(); - // Create threads as required and keep them in the pool for 60 seconds - ioExecutor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, - 60, SECONDS, queue, policy); - } - @Provides @Singleton ShutdownManager provideShutdownManager() { @@ -57,7 +45,16 @@ public class LifecycleModule { @Provides @Singleton @IoExecutor - Executor provideIoExecutor(LifecycleManager lifecycleManager) { + Executor provideIoExecutor(LifecycleManager lifecycleManager, + ThreadFactory threadFactory) { + // The thread pool is unbounded, so use direct handoff + BlockingQueue queue = new SynchronousQueue<>(); + // Discard tasks that are submitted during shutdown + RejectedExecutionHandler policy = + new ThreadPoolExecutor.DiscardPolicy(); + // Create threads as required and keep them in the pool for 60 seconds + ExecutorService ioExecutor = new ThreadPoolExecutor(0, + Integer.MAX_VALUE, 60, SECONDS, queue, threadFactory, policy); lifecycleManager.registerForShutdown(ioExecutor); return ioExecutor; } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/system/DefaultTaskSchedulerModule.java b/bramble-core/src/main/java/org/briarproject/bramble/system/DefaultTaskSchedulerModule.java index 3e36faff2..30e473237 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/system/DefaultTaskSchedulerModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/system/DefaultTaskSchedulerModule.java @@ -6,6 +6,7 @@ import org.briarproject.bramble.api.system.TaskScheduler; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; import javax.inject.Inject; import javax.inject.Singleton; @@ -21,18 +22,15 @@ public class DefaultTaskSchedulerModule { TaskScheduler scheduler; } - private final ScheduledExecutorService scheduledExecutorService; - - public DefaultTaskSchedulerModule() { + @Provides + @Singleton + TaskScheduler provideTaskScheduler(LifecycleManager lifecycleManager, + ThreadFactory threadFactory) { // Discard tasks that are submitted during shutdown RejectedExecutionHandler policy = new ScheduledThreadPoolExecutor.DiscardPolicy(); - scheduledExecutorService = new ScheduledThreadPoolExecutor(1, policy); - } - - @Provides - @Singleton - TaskScheduler provideTaskScheduler(LifecycleManager lifecycleManager) { + ScheduledExecutorService scheduledExecutorService = + new ScheduledThreadPoolExecutor(1, threadFactory, policy); lifecycleManager.registerForShutdown(scheduledExecutorService); return new TaskSchedulerImpl(scheduledExecutorService); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/system/DefaultThreadFactoryModule.java b/bramble-core/src/main/java/org/briarproject/bramble/system/DefaultThreadFactoryModule.java new file mode 100644 index 000000000..d2ea5f976 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/system/DefaultThreadFactoryModule.java @@ -0,0 +1,18 @@ +package org.briarproject.bramble.system; + +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class DefaultThreadFactoryModule { + @Provides + @Singleton + ThreadFactory provideThreadFactory() { + return Executors.defaultThreadFactory(); + } +} diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTestComponent.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTestComponent.java index a353f6fcb..6a071e2de 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTestComponent.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/file/RemovableDriveIntegrationTestComponent.java @@ -10,6 +10,7 @@ import org.briarproject.bramble.api.plugin.file.RemovableDriveManager; import org.briarproject.bramble.battery.DefaultBatteryManagerModule; import org.briarproject.bramble.event.DefaultEventExecutorModule; import org.briarproject.bramble.mailbox.ModularMailboxModule; +import org.briarproject.bramble.system.DefaultThreadFactoryModule; import org.briarproject.bramble.system.DefaultWakefulIoExecutorModule; import org.briarproject.bramble.system.TimeTravelModule; import org.briarproject.bramble.test.TestDatabaseConfigModule; @@ -29,6 +30,7 @@ import dagger.Component; DefaultBatteryManagerModule.class, DefaultEventExecutorModule.class, DefaultWakefulIoExecutorModule.class, + DefaultThreadFactoryModule.class, TestDatabaseConfigModule.class, TestDnsModule.class, TestFeatureFlagModule.class, diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleCoreIntegrationTestModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleCoreIntegrationTestModule.java index 8d4224df6..e2ddb2fa9 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleCoreIntegrationTestModule.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/BrambleCoreIntegrationTestModule.java @@ -11,6 +11,7 @@ import dagger.Module; DefaultBatteryManagerModule.class, DefaultEventExecutorModule.class, DefaultWakefulIoExecutorModule.class, + TestThreadFactoryModule.class, TestDatabaseConfigModule.class, TestFeatureFlagModule.class, TestMailboxDirectoryModule.class, diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/TestThreadFactoryModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestThreadFactoryModule.java new file mode 100644 index 000000000..fd8432d98 --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestThreadFactoryModule.java @@ -0,0 +1,66 @@ +package org.briarproject.bramble.test; + +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import dagger.Module; +import dagger.Provides; + +@Module +public class TestThreadFactoryModule { + + @Nullable + private final String prefix; + + public TestThreadFactoryModule() { + this(null); + } + + public TestThreadFactoryModule(@Nullable String prefix) { + this.prefix = prefix; + } + + @Provides + ThreadFactory provideThreadFactory() { + if (prefix == null) return Executors.defaultThreadFactory(); + return new TestThreadFactory(prefix); + } + + /** + * This class is mostly copied from + * {@link Executors#defaultThreadFactory()} only adds a given prefix. + */ + static class TestThreadFactory implements ThreadFactory { + private static final AtomicInteger poolNumber = new AtomicInteger(1); + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix; + + private TestThreadFactory(String prefix) { + SecurityManager s = System.getSecurityManager(); + this.group = s != null ? s.getThreadGroup() : + Thread.currentThread().getThreadGroup(); + this.namePrefix = + prefix + "-p-" + poolNumber.getAndIncrement() + "-t-"; + } + + @Override + public Thread newThread(@Nonnull Runnable r) { + Thread t = new Thread(this.group, r, + this.namePrefix + this.threadNumber.getAndIncrement(), 0L); + if (t.isDaemon()) { + t.setDaemon(false); + } + + if (t.getPriority() != 5) { + t.setPriority(5); + } + + return t; + } + } +} diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt index a841f9913..d15db40dd 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt @@ -22,6 +22,7 @@ import org.briarproject.bramble.plugin.tor.UnixTorPluginFactory import org.briarproject.bramble.plugin.tor.WindowsTorPluginFactory import org.briarproject.bramble.system.ClockModule import org.briarproject.bramble.system.DefaultTaskSchedulerModule +import org.briarproject.bramble.system.DefaultThreadFactoryModule import org.briarproject.bramble.system.DefaultWakefulIoExecutorModule import org.briarproject.bramble.system.DesktopSecureRandomModule import org.briarproject.bramble.util.OsUtils.isLinux @@ -44,6 +45,7 @@ import javax.inject.Singleton DefaultEventExecutorModule::class, DefaultTaskSchedulerModule::class, DefaultWakefulIoExecutorModule::class, + DefaultThreadFactoryModule::class, DesktopSecureRandomModule::class, HeadlessBlogModule::class, HeadlessContactModule::class, diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt index 2725b70a5..219051d16 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt @@ -17,6 +17,7 @@ import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory import org.briarproject.bramble.event.DefaultEventExecutorModule import org.briarproject.bramble.system.ClockModule import org.briarproject.bramble.system.DefaultTaskSchedulerModule +import org.briarproject.bramble.system.DefaultThreadFactoryModule import org.briarproject.bramble.system.DefaultWakefulIoExecutorModule import org.briarproject.bramble.test.TestFeatureFlagModule import org.briarproject.bramble.test.TestSecureRandomModule @@ -37,6 +38,7 @@ import javax.inject.Singleton DefaultEventExecutorModule::class, DefaultTaskSchedulerModule::class, DefaultWakefulIoExecutorModule::class, + DefaultThreadFactoryModule::class, TestFeatureFlagModule::class, TestSecureRandomModule::class, HeadlessBlogModule::class, diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java index 97fb507fb..39a4ba1b4 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java @@ -18,6 +18,8 @@ import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.test.BrambleIntegrationTest; import org.briarproject.bramble.test.TestDatabaseConfigModule; +import org.briarproject.bramble.test.TestLogFormatter; +import org.briarproject.bramble.test.TestThreadFactoryModule; import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.mailbox.lib.AbstractMailbox; import org.briarproject.mailbox.lib.TestMailbox; @@ -43,6 +45,10 @@ abstract class AbstractMailboxIntegrationTest static final String URL_BASE = "http://127.0.0.1:8000"; + AbstractMailboxIntegrationTest() { + TestLogFormatter.use(); + } + private final File dir1 = new File(testDir, "alice"); private final File dir2 = new File(testDir, "bob"); private final SecretKey rootKey = getSecretKey(); @@ -73,13 +79,16 @@ abstract class AbstractMailboxIntegrationTest mailbox.stopLifecycle(true); } - MailboxIntegrationTestComponent startTestComponent( + private MailboxIntegrationTestComponent startTestComponent( File databaseDir, String name) throws Exception { + TestThreadFactoryModule threadFactoryModule = + new TestThreadFactoryModule(name); TestDatabaseConfigModule dbModule = new TestDatabaseConfigModule(databaseDir); MailboxIntegrationTestComponent component = DaggerMailboxIntegrationTestComponent .builder() + .testThreadFactoryModule(threadFactoryModule) .testDatabaseConfigModule(dbModule) .build(); injectEagerSingletons(component); diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/TestLogFormatter.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/TestLogFormatter.java new file mode 100644 index 000000000..b5b819d15 --- /dev/null +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/test/TestLogFormatter.java @@ -0,0 +1,57 @@ +package org.briarproject.bramble.test; + +import org.briarproject.nullsafety.NotNullByDefault; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.ConsoleHandler; +import java.util.logging.LogManager; +import java.util.logging.LogRecord; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; + +import javax.annotation.concurrent.ThreadSafe; + +@ThreadSafe +@NotNullByDefault +public class TestLogFormatter extends SimpleFormatter { + + private final Object lock = new Object(); + private final DateFormat dateFormat; // Locking: lock + private final Date date; // Locking: lock + + public static void use() { + LogManager.getLogManager().reset(); + Logger rootLogger = LogManager.getLogManager().getLogger(""); + ConsoleHandler handler = new ConsoleHandler(); + handler.setFormatter(new TestLogFormatter()); + rootLogger.addHandler(handler); + } + + private TestLogFormatter() { + synchronized (lock) { + dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); + date = new Date(); + } + } + + @Override + public String format(LogRecord rec) { + if (rec.getThrown() == null) { + String dateString; + synchronized (lock) { + date.setTime(rec.getMillis()); + dateString = dateFormat.format(date); + } + return String.format("%s [%s] %s %s - %s\n", + dateString, + Thread.currentThread().getName(), + rec.getLevel().getName(), + rec.getLoggerName(), + rec.getMessage()); + } else { + return super.format(rec); + } + } +} From b7e1a987fcad79bbbb6844c2b02c94ff18651cdf Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 3 Nov 2022 10:57:06 -0300 Subject: [PATCH 7/9] Don't depend on briar for mailbox integration tests Use transport properties instead of sending private messages --- mailbox-integration-tests/build.gradle | 7 ++--- .../AbstractMailboxIntegrationTest.java | 30 ++++++++++++------- .../mailbox/MailboxIntegrationTest.java | 8 ++--- .../MailboxIntegrationTestComponent.java | 29 +++++++++++------- 4 files changed, 43 insertions(+), 31 deletions(-) diff --git a/mailbox-integration-tests/build.gradle b/mailbox-integration-tests/build.gradle index 4b942d159..3b833cc2b 100644 --- a/mailbox-integration-tests/build.gradle +++ b/mailbox-integration-tests/build.gradle @@ -7,14 +7,11 @@ apply from: '../dagger.gradle' dependencies { testImplementation project(path: ':bramble-api', configuration: 'default') + testImplementation project(path: ':bramble-api', configuration: 'testOutput') testImplementation project(path: ':bramble-core', configuration: 'default') - testImplementation project(path: ':briar-api', configuration: 'default') - testImplementation project(path: ':briar-core', configuration: 'default') + testImplementation project(path: ':bramble-core', configuration: 'testOutput') testImplementation project(path: ':mailbox-core', configuration: 'default') testImplementation project(path: ':mailbox-lib', configuration: 'default') - testImplementation project(path: ':bramble-api', configuration: 'testOutput') - testImplementation project(path: ':bramble-core', configuration: 'testOutput') - testImplementation project(path: ':briar-core', configuration: 'testOutput') testImplementation "junit:junit:$junit_version" testImplementation "ch.qos.logback:logback-classic:1.2.11" diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java index 39a4ba1b4..2eb0eef4f 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/AbstractMailboxIntegrationTest.java @@ -15,28 +15,29 @@ import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; -import org.briarproject.bramble.api.sync.GroupId; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.test.BrambleIntegrationTest; import org.briarproject.bramble.test.TestDatabaseConfigModule; import org.briarproject.bramble.test.TestLogFormatter; import org.briarproject.bramble.test.TestThreadFactoryModule; -import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.mailbox.lib.AbstractMailbox; import org.briarproject.mailbox.lib.TestMailbox; import org.junit.After; import org.junit.Before; import java.io.File; +import java.util.Map; import java.util.concurrent.CountDownLatch; -import static java.util.Collections.emptyList; import static java.util.concurrent.TimeUnit.SECONDS; import static org.briarproject.bramble.api.mailbox.MailboxAuthToken.fromString; import static org.briarproject.bramble.mailbox.MailboxIntegrationTestComponent.Helper.injectEagerSingletons; import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.createMailboxApi; import static org.briarproject.bramble.mailbox.MailboxTestUtils.getQrCodePayload; import static org.briarproject.bramble.test.TestUtils.getSecretKey; -import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; @@ -49,6 +50,7 @@ abstract class AbstractMailboxIntegrationTest TestLogFormatter.use(); } + private final TransportId transportId = new TransportId(getRandomString(4)); private final File dir1 = new File(testDir, "alice"); private final File dir2 = new File(testDir, "bob"); private final SecretKey rootKey = getSecretKey(); @@ -185,13 +187,12 @@ abstract class AbstractMailboxIntegrationTest return update.getMailboxProperties(); } - void sendMessage(MailboxIntegrationTestComponent from, - ContactId toContactId, String text) throws Exception { - GroupId g = from.getMessagingManager().getConversationId(toContactId); - PrivateMessage m = from.getPrivateMessageFactory().createPrivateMessage( - g, from.getClock().currentTimeMillis(), text, emptyList(), - NO_AUTO_DELETE_TIMER); - from.getMessagingManager().addLocalMessage(m); + void broadcastMessage(MailboxIntegrationTestComponent from) + throws Exception { + TransportProperties p = from.getTransportPropertyManager() + .getLocalProperties(transportId); + p.put(getRandomString(23), getRandomString(8)); + from.getTransportPropertyManager().mergeLocalProperties(transportId, p); } void sync1To2(int num, boolean valid) throws Exception { @@ -210,4 +211,11 @@ abstract class AbstractMailboxIntegrationTest sendAcks(c2, c1, contact1From2.getId(), num); } + void assertNumMessages(MailboxIntegrationTestComponent c, + ContactId contactId, int num) throws DbException { + Map p = c.getTransportPropertyManager() + .getRemoteProperties(transportId); + assertEquals(num, p.get(contactId).size()); + } + } diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java index 02fa6bfc9..274b5e9e2 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java @@ -38,7 +38,7 @@ public class MailboxIntegrationTest extends AbstractMailboxIntegrationTest { assertNotNull(props2.getInboxId()); // send message and wait for it to arrive via mailbox - sendMessage(c1, contact2From1.getId(), "test"); + broadcastMessage(c1); // wait until file arrived on mailbox retryUntilSuccessOrTimeout(5_000, 500, () -> { @@ -50,10 +50,8 @@ public class MailboxIntegrationTest extends AbstractMailboxIntegrationTest { // this might require 2nd download cycle after Tor reachability period awaitPendingMessageDelivery(1); - // assert that private message arrived for c2 - int size = getFromDb(c2, txn -> c2.getMessagingManager() - .getMessageHeaders(txn, contact1From2.getId()).size()); - assertEquals(1, size); + // assert that message arrived for c2 + assertNumMessages(c2, contact1From2.getId(), 1); // all files were deleted from mailbox assertEquals(0, api.getFiles(props2, props2.getInboxId()).size()); diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java index 7ead8facc..c6c7fd931 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTestComponent.java @@ -2,18 +2,20 @@ package org.briarproject.bramble.mailbox; import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; import org.briarproject.bramble.BrambleCoreModule; +import org.briarproject.bramble.api.contact.ContactManager; +import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.identity.AuthorFactory; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.mailbox.MailboxManager; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxUpdateManager; -import org.briarproject.bramble.api.plugin.PluginManager; +import org.briarproject.bramble.api.properties.TransportPropertyManager; +import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; +import org.briarproject.bramble.test.BrambleIntegrationTestComponent; import org.briarproject.bramble.test.MailboxTestPluginConfigModule; import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestSocksModule; -import org.briarproject.briar.BriarCoreModule; -import org.briarproject.briar.identity.IdentityModule; -import org.briarproject.briar.messaging.MessagingModule; -import org.briarproject.briar.test.BriarIntegrationTestComponent; import javax.inject.Singleton; @@ -23,14 +25,23 @@ import dagger.Component; @Component(modules = { BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, - BriarCoreModule.class, TestModularMailboxModule.class, MailboxTestPluginConfigModule.class, TestSocksModule.class, TestDnsModule.class, }) interface MailboxIntegrationTestComponent extends - BriarIntegrationTestComponent { + BrambleIntegrationTestComponent { + + LifecycleManager getLifecycleManager(); + + DatabaseComponent getDatabaseComponent(); + + ContactManager getContactManager(); + + AuthorFactory getAuthorFactory(); + + Clock getClock(); MailboxManager getMailboxManager(); @@ -38,15 +49,13 @@ interface MailboxIntegrationTestComponent extends MailboxUpdateManager getMailboxUpdateManager(); - PluginManager getPluginManager(); + TransportPropertyManager getTransportPropertyManager(); class Helper { static void injectEagerSingletons( MailboxIntegrationTestComponent c) { BrambleCoreIntegrationTestEagerSingletons.Helper .injectEagerSingletons(c); - c.inject(new IdentityModule.EagerSingletons()); - c.inject(new MessagingModule.EagerSingletons()); } } } From 6680abf925e5c96200f5f407cd97175c2f8de6a1 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 4 Nov 2022 12:01:00 -0300 Subject: [PATCH 8/9] Make MailboxIntegrationTest a bit more thorough by checking, after adding the contact to the mailbox but before creating the message, that the first file containing the mailbox update gets uploaded. Then after creating the message, the second file should be uploaded. --- .../mailbox/MailboxIntegrationTest.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java index 274b5e9e2..96748a018 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java @@ -7,13 +7,18 @@ import org.junit.Test; import java.util.Collection; import java.util.List; +import java.util.logging.Logger; +import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.mailbox.MailboxIntegrationTestUtils.retryUntilSuccessOrTimeout; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class MailboxIntegrationTest extends AbstractMailboxIntegrationTest { + private static final Logger LOG = + getLogger(MailboxIntegrationTest.class.getSimpleName()); + @Test public void testSendMessageViaMailbox() throws Exception { addContacts(); @@ -37,21 +42,30 @@ public class MailboxIntegrationTest extends AbstractMailboxIntegrationTest { getMailboxProperties(c2, contact1From2.getId()); assertNotNull(props2.getInboxId()); + // wait until file containing mailbox properties arrived on mailbox + retryUntilSuccessOrTimeout(5_000, 500, () -> { + List files = api.getFiles(props2, props2.getInboxId()); + return files.size() == 1; + }); + LOG.info("Mailbox properties uploaded"); + // send message and wait for it to arrive via mailbox broadcastMessage(c1); - // wait until file arrived on mailbox - retryUntilSuccessOrTimeout(5_000, 500, () -> { + // wait until file with broadcast message arrived on mailbox + retryUntilSuccessOrTimeout(10_000, 500, () -> { List files = api.getFiles(props2, props2.getInboxId()); - return files.size() > 1; + return files.size() == 2; }); + LOG.info("Broadcast message uploaded"); // wait for message to arrive // this might require 2nd download cycle after Tor reachability period + LOG.info("Waiting for delivery of broadcast message"); awaitPendingMessageDelivery(1); // assert that message arrived for c2 - assertNumMessages(c2, contact1From2.getId(), 1); + assertNumMessages(c2, contact1From2.getId(), 1); // all files were deleted from mailbox assertEquals(0, api.getFiles(props2, props2.getInboxId()).size()); From 5e1564de6c327a1241afc923d97a2e2a952685b1 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 4 Nov 2022 13:53:58 -0300 Subject: [PATCH 9/9] don't insist on 2 uploaded messages in case Bob deletes one of them quickly --- .../bramble/mailbox/MailboxIntegrationTest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java index 96748a018..043257eaf 100644 --- a/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java +++ b/mailbox-integration-tests/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java @@ -52,12 +52,8 @@ public class MailboxIntegrationTest extends AbstractMailboxIntegrationTest { // send message and wait for it to arrive via mailbox broadcastMessage(c1); - // wait until file with broadcast message arrived on mailbox - retryUntilSuccessOrTimeout(10_000, 500, () -> { - List files = api.getFiles(props2, props2.getInboxId()); - return files.size() == 2; - }); - LOG.info("Broadcast message uploaded"); + // we don't check for two messages now, because 2 (Bob) might have + // download the first message still in their 1st download cycle. // wait for message to arrive // this might require 2nd download cycle after Tor reachability period