From bab6ec70f521e3811c22fc938d3f4a5074245911 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Fri, 21 Oct 2022 11:35:25 -0300
Subject: [PATCH] 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 ce08b2f252..368c7ed7c6 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 0000000000..7f03dff6dd
--- /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 0000000000..fa6a1f528b
--- /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 cc9d446987..8ddbd78246 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 359e704605..20afebe30f 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 becb74db81..f01e365f1d 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 2612fe16ab..b625a94a8e 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 032095cd6b..547041a1f2 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 59435bdb0f..a353f6fcbe 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 d6571298e3..8a4cda6548 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 db5ef337be..9544d7e9bf 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 88a4747a21..64dfa6f2ca 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 001c44d634..d627025ab6 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 8003bb7e55..3f47a3541c 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 6216e241a2..df1d043c34 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 a12e480d23..e597363786 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 c1ec805a62..468782cd49 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 fe4afa241c..896df814ab 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 69f7bdc4d1..f054a55cb3 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 6b4083adef..c01400b820 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 e3498608dd..f929bab690 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 a2486c3470..c2010c3458 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 34cb73948b..02fa6bfc99 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<ContactId> 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<MailboxFile> 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 278fa75fe6..7ead8faccc 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 9fd708fcda..bcea13ea36 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 0000000000..e2744913cf
--- /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 a47ac069a2..22e001bae8 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;
 
-- 
GitLab