First integration test for mailbox with two contacts

one private message gets send via mailbox from one contact to the other
This commit is contained in:
Torsten Grote
2022-10-11 11:56:38 -03:00
parent 648911b3ed
commit a720501fde
9 changed files with 253 additions and 54 deletions

View File

@@ -235,11 +235,16 @@ public abstract class BrambleIntegrationTest<C extends BrambleIntegrationTestCom
protected void awaitPendingMessageDelivery(int num) protected void awaitPendingMessageDelivery(int num)
throws TimeoutException { throws TimeoutException {
deliveryWaiter.await(TIMEOUT, num); awaitPendingMessageDelivery(num, TIMEOUT);
}
protected void awaitPendingMessageDelivery(int num, long timeout)
throws TimeoutException {
deliveryWaiter.await(timeout, num);
assertEquals("Messages delivered", num, deliveryCounter.getAndSet(0)); assertEquals("Messages delivered", num, deliveryCounter.getAndSet(0));
try { try {
messageSemaphore.tryAcquire(num, TIMEOUT, MILLISECONDS); messageSemaphore.tryAcquire(num, timeout, MILLISECONDS);
} catch (InterruptedException e) { } catch (InterruptedException e) {
LOG.info("Interrupted while waiting for messages"); LOG.info("Interrupted while waiting for messages");
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();

View File

@@ -8,13 +8,17 @@ apply from: '../dagger.gradle'
dependencies { dependencies {
testImplementation project(path: ':bramble-api', configuration: 'default') testImplementation project(path: ':bramble-api', configuration: 'default')
testImplementation project(path: ':bramble-core', configuration: 'default') testImplementation project(path: ':bramble-core', configuration: 'default')
testImplementation project(path: ':briar-api', configuration: 'default')
testImplementation project(path: ':briar-core', configuration: 'default')
testImplementation project(path: ':mailbox-core', configuration: 'default') testImplementation project(path: ':mailbox-core', configuration: 'default')
testImplementation project(path: ':mailbox-lib', configuration: 'default') testImplementation project(path: ':mailbox-lib', configuration: 'default')
testImplementation project(path: ':bramble-api', configuration: 'testOutput') testImplementation project(path: ':bramble-api', configuration: 'testOutput')
testImplementation project(path: ':bramble-core', configuration: 'testOutput') testImplementation project(path: ':bramble-core', configuration: 'testOutput')
testImplementation project(path: ':briar-core', configuration: 'testOutput')
testImplementation "junit:junit:$junit_version" testImplementation "junit:junit:$junit_version"
testImplementation "ch.qos.logback:logback-classic:1.2.11" testImplementation "ch.qos.logback:logback-classic:1.2.11"
testImplementation 'net.jodah:concurrentunit:0.4.6'
testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version" testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
} }

View File

@@ -1,47 +1,93 @@
package org.briarproject.bramble.mailbox; package org.briarproject.bramble.mailbox;
import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.crypto.SecretKey;
import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbCallable;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.identity.Identity; import org.briarproject.bramble.api.identity.Identity;
import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.api.identity.LocalAuthor;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.mailbox.MailboxAuthToken; import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingState;
import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxProperties;
import org.briarproject.bramble.test.BrambleTestCase; 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; import org.briarproject.bramble.test.TestDatabaseConfigModule;
import org.briarproject.briar.api.messaging.PrivateMessage;
import org.briarproject.mailbox.lib.AbstractMailbox; 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.io.File;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import static java.util.Collections.emptyList;
import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.concurrent.TimeUnit.SECONDS;
import static org.briarproject.bramble.api.mailbox.MailboxAuthToken.fromString; 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.mailbox.MailboxTestUtils.getQrCodePayload;
import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.briarproject.bramble.test.TestUtils.getSecretKey;
import static org.briarproject.bramble.test.TestUtils.getTestDirectory; import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
abstract class AbstractMailboxIntegrationTest extends BrambleTestCase { abstract class AbstractMailboxIntegrationTest
extends BrambleIntegrationTest<MailboxIntegrationTestComponent> {
static final String URL_BASE = "http://127.0.0.1:8000"; static final String URL_BASE = "http://127.0.0.1:8000";
private final File testDir = getTestDirectory(); private final File dir1 = new File(testDir, "alice");
final File dir1 = new File(testDir, "alice"); private final File dir2 = new File(testDir, "bob");
final File dir2 = new File(testDir, "bob"); private final SecretKey rootKey = getSecretKey();
MailboxIntegrationTestComponent c1, c2; 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( MailboxIntegrationTestComponent startTestComponent(
File databaseDir, String name) throws Exception { File databaseDir, String name) throws Exception {
TestDatabaseConfigModule dbModule =
new TestDatabaseConfigModule(databaseDir);
MailboxIntegrationTestComponent component = MailboxIntegrationTestComponent component =
DaggerMailboxIntegrationTestComponent DaggerMailboxIntegrationTestComponent
.builder() .builder()
.testDatabaseConfigModule( .testDatabaseConfigModule(dbModule)
new TestDatabaseConfigModule(databaseDir))
.build(); .build();
BrambleCoreIntegrationTestEagerSingletons.Helper injectEagerSingletons(component);
.injectEagerSingletons(component); component.getPluginManager().setPluginEnabled(TorConstants.ID, false);
setUp(component, name); setUp(component, name);
return component; return component;
} }
@@ -56,6 +102,7 @@ abstract class AbstractMailboxIntegrationTest extends BrambleTestCase {
LifecycleManager lifecycleManager = device.getLifecycleManager(); LifecycleManager lifecycleManager = device.getLifecycleManager();
lifecycleManager.startServices(getSecretKey()); lifecycleManager.startServices(getSecretKey());
lifecycleManager.waitForStartup(); lifecycleManager.waitForStartup();
addEventListener(device);
} }
MailboxProperties pair(MailboxIntegrationTestComponent c, 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> T getFromDb(MailboxIntegrationTestComponent device,
DbCallable<T, ?> 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);
}
} }

View File

@@ -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<ContactId> 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<MailboxFile> 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());
}
}

View File

@@ -1,18 +1,19 @@
package org.briarproject.bramble.mailbox; package org.briarproject.bramble.mailbox;
import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons;
import org.briarproject.bramble.BrambleCoreModule; 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.MailboxManager;
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; 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.BrambleCoreIntegrationTestModule;
import org.briarproject.bramble.test.BrambleIntegrationTestComponent; import org.briarproject.bramble.test.MailboxTestPluginConfigModule;
import org.briarproject.bramble.test.FakeTorPluginConfigModule;
import org.briarproject.bramble.test.TestDnsModule; import org.briarproject.bramble.test.TestDnsModule;
import org.briarproject.bramble.test.TestSocksModule; 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; import javax.inject.Singleton;
@@ -22,23 +23,30 @@ import dagger.Component;
@Component(modules = { @Component(modules = {
BrambleCoreIntegrationTestModule.class, BrambleCoreIntegrationTestModule.class,
BrambleCoreModule.class, BrambleCoreModule.class,
BriarCoreModule.class,
TestUrlConverterModule.class, TestUrlConverterModule.class,
FakeTorPluginConfigModule.class, MailboxTestPluginConfigModule.class,
TestSocksModule.class, TestSocksModule.class,
TestDnsModule.class, TestDnsModule.class,
}) })
interface MailboxIntegrationTestComponent extends interface MailboxIntegrationTestComponent extends
BrambleIntegrationTestComponent { BriarIntegrationTestComponent {
DatabaseComponent getDatabaseComponent();
MailboxManager getMailboxManager(); MailboxManager getMailboxManager();
MailboxSettingsManager getMailboxSettingsManager(); 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());
}
}
} }

View File

@@ -8,12 +8,8 @@ import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.AuthorFactory;
import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.identity.LocalAuthor;
import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxProperties;
import org.briarproject.mailbox.lib.TestMailbox;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@@ -27,11 +23,6 @@ import static org.junit.Assert.assertEquals;
public class OwnMailboxContactListWorkerIntegrationTest public class OwnMailboxContactListWorkerIntegrationTest
extends AbstractMailboxIntegrationTest { extends AbstractMailboxIntegrationTest {
@Rule
public TemporaryFolder mailboxDataDirectory = new TemporaryFolder();
private TestMailbox mailbox;
private final MailboxApi api = createMailboxApi(); private final MailboxApi api = createMailboxApi();
private MailboxProperties ownerProperties; private MailboxProperties ownerProperties;
@@ -42,21 +33,13 @@ public class OwnMailboxContactListWorkerIntegrationTest
private final long timestamp = System.currentTimeMillis(); private final long timestamp = System.currentTimeMillis();
@Before @Before
@Override
public void setUp() throws Exception { public void setUp() throws Exception {
mailbox = new TestMailbox(mailboxDataDirectory.getRoot()); super.setUp();
mailbox.startLifecycle();
c1 = startTestComponent(dir1, "Alice");
localAuthor1 = c1.getIdentityManager().getLocalAuthor(); localAuthor1 = c1.getIdentityManager().getLocalAuthor();
ownerProperties = pair(c1, mailbox); ownerProperties = pair(c1, mailbox);
} }
@After
public void tearDown() {
mailbox.stopLifecycle(true);
}
@Test @Test
public void testUploadContacts() throws Exception { public void testUploadContacts() throws Exception {
// Check the initial conditions // Check the initial conditions

View File

@@ -4,6 +4,7 @@ import org.briarproject.bramble.api.Pair;
import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.bramble.api.keyagreement.KeyAgreementListener; import org.briarproject.bramble.api.keyagreement.KeyAgreementListener;
import org.briarproject.bramble.api.plugin.ConnectionHandler; 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.TorConstants;
import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; 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 java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; 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; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE;
@NotNullByDefault @NotNullByDefault
@@ -28,9 +28,14 @@ public class FakeTorPlugin implements DuplexPlugin {
private static final Logger LOG = private static final Logger LOG =
getLogger(FakeTorPlugin.class.getName()); getLogger(FakeTorPlugin.class.getName());
private final PluginCallback callback;
private State state = INACTIVE; private State state = INACTIVE;
FakeTorPlugin(PluginCallback callback) {
this.callback = callback;
}
@Override @Override
public TransportId getId() { public TransportId getId() {
return TorConstants.ID; return TorConstants.ID;
@@ -50,12 +55,14 @@ public class FakeTorPlugin implements DuplexPlugin {
public void start() { public void start() {
LOG.info("Starting plugin"); LOG.info("Starting plugin");
state = ACTIVE; state = ACTIVE;
callback.pluginStateChanged(state);
} }
@Override @Override
public void stop() { public void stop() {
LOG.info("Stopping plugin"); LOG.info("Stopping plugin");
state = DISABLED; state = INACTIVE;
callback.pluginStateChanged(state);
} }
@Override @Override

View File

@@ -32,6 +32,6 @@ public class FakeTorPluginFactory implements DuplexPluginFactory {
@Nullable @Nullable
@Override @Override
public DuplexPlugin createPlugin(PluginCallback callback) { public DuplexPlugin createPlugin(PluginCallback callback) {
return new FakeTorPlugin(); return new FakeTorPlugin(callback);
} }
} }

View File

@@ -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.duplex.DuplexPluginFactory;
import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin;
import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory;
import org.briarproject.bramble.plugin.file.MailboxPluginFactory;
import org.briarproject.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import java.util.Collection; import java.util.Collection;
@@ -17,14 +18,14 @@ import javax.annotation.Nullable;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyMap; import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList; 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 @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 private static final int MAX_LATENCY = 30_000; // 30 seconds
@NotNullByDefault @NotNullByDefault
@@ -48,7 +49,8 @@ public class FakeTorPluginConfigModule {
}; };
@Provides @Provides
PluginConfig providePluginConfig(FakeTorPluginFactory tor) { PluginConfig providePluginConfig(FakeTorPluginFactory tor,
MailboxPluginFactory mailboxPluginFactory) {
@NotNullByDefault @NotNullByDefault
PluginConfig pluginConfig = new PluginConfig() { PluginConfig pluginConfig = new PluginConfig() {
@@ -59,7 +61,7 @@ public class FakeTorPluginConfigModule {
@Override @Override
public Collection<SimplexPluginFactory> getSimplexFactories() { public Collection<SimplexPluginFactory> getSimplexFactories() {
return singletonList(simplex); return asList(simplex, mailboxPluginFactory);
} }
@Override @Override