diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/protocol/MailboxProtocolIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/protocol/MailboxProtocolIntegrationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..702179b959ac9bdb4fe6d42e32a5b75579489a78 --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/protocol/MailboxProtocolIntegrationTest.java @@ -0,0 +1,158 @@ +package org.briarproject.bramble.mailbox.protocol; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.data.BdfReader; +import org.briarproject.bramble.api.data.BdfReaderFactory; +import org.briarproject.bramble.api.data.BdfWriter; +import org.briarproject.bramble.api.data.BdfWriterFactory; +import org.briarproject.bramble.api.lifecycle.IoExecutor; +import org.briarproject.bramble.test.BrambleTestCase; +import org.junit.Test; + +import java.io.IOException; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; + +import javax.inject.Inject; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.junit.Assert.assertEquals; + +public class MailboxProtocolIntegrationTest extends BrambleTestCase { + + @IoExecutor + Executor ioExecutor; + + @Inject + BdfReaderFactory bdfReaderFactory; + + @Inject + BdfWriterFactory bdfWriterFactory; + + + private final BdfWriter bdfWriter; + private final BdfReader bdfReader; + private final PipedOutputStream pipedOS; + private final PipedInputStream pipedIS; + + private final MailboxProtocol mailboxProtocol; + + + public MailboxProtocolIntegrationTest() throws Exception { + // The thread pool is unbounded, so use direct handoff + BlockingQueue<Runnable> 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); + + MailboxProtocolIntegrationTestComponent component = + DaggerMailboxProtocolIntegrationTestComponent.builder().build(); + component.inject(this); + + pipedIS = new PipedInputStream(); + pipedOS = new PipedOutputStream(pipedIS); + + + bdfWriter = bdfWriterFactory.createWriter(pipedOS); + bdfReader = bdfReaderFactory.createReader(pipedIS); + mailboxProtocol = new MailboxProtocol(ioExecutor, bdfWriter, bdfReader); + } + + + @Test + public void testRequestsAndHandling() + throws IOException, InterruptedException { + ioExecutor.execute(mailboxProtocol); + try { + errorResponse(); + storeRequest(); + syncRequest(); + takeRequest(); + endRequest(); + } finally { + mailboxProtocol.stop(); + } + } + + private void errorResponse() throws InterruptedException, IOException { + // Test Error Response + MailboxRequestTake req = + new MailboxRequestTake(new ContactId(123), "Test".getBytes()); + mailboxProtocol.writeRequest(req); + MailboxRequestTake recvReq = + (MailboxRequestTake) mailboxProtocol.getNextRequest(); + mailboxProtocol.writeErrorResponse(recvReq, "Error"); + req.awaitResponse(); + assertEquals(false, req.wasSuccessfull()); + assertEquals("Error", req.getResponseError()); + } + + private void takeRequest() throws IOException, InterruptedException { + // Generate and write TAKE request + MailboxRequestTake req = + new MailboxRequestTake(new ContactId(123), "Test".getBytes()); + mailboxProtocol.writeRequest(req); + + MailboxRequestTake recvReq = + (MailboxRequestTake) mailboxProtocol.getNextRequest(); + + assertEquals(req.getId(), recvReq.getId()); + assertEquals(req.getType(), recvReq.getType()); + assertEquals(req.getContactId(), recvReq.getContactId()); + assertEquals("Test", new String(req.getEncryptedSyncStream())); + + // Write Success Response + mailboxProtocol.writeSucessResponse(recvReq); + req.awaitResponse(); + assertEquals(true, req.wasSuccessfull()); + } + + private void endRequest() throws IOException, InterruptedException { + MailboxRequest req = new MailboxRequestEnd(); + mailboxProtocol.writeRequest(req); + MailboxRequest recvReq = mailboxProtocol.getNextRequest(); + assertEquals(req.getId(), recvReq.getId()); + assertEquals(req.getType(), recvReq.getType()); + } + + + private void storeRequest() throws IOException, InterruptedException { + // Generate and write TAKE request + MailboxRequestStore req = + new MailboxRequestStore(new ContactId(123), "Test".getBytes()); + mailboxProtocol.writeRequest(req); + + MailboxRequestStore recvReq = + (MailboxRequestStore) mailboxProtocol.getNextRequest(); + + assertEquals(req.getId(), recvReq.getId()); + assertEquals(req.getType(), recvReq.getType()); + assertEquals(req.getContactId(), recvReq.getContactId()); + assertEquals("Test", new String(req.getEncryptedSyncStream())); + + // Write Success Response + mailboxProtocol.writeSucessResponse(recvReq); + req.awaitResponse(); + assertEquals(true, req.wasSuccessfull()); + } + + private void syncRequest() throws IOException, InterruptedException { + MailboxRequestSync req = new MailboxRequestSync("Test".getBytes()); + mailboxProtocol.writeRequest(req); + MailboxRequestSync recvReq = + (MailboxRequestSync) mailboxProtocol.getNextRequest(); + assertEquals(req.getId(), recvReq.getId()); + assertEquals(req.getType(), recvReq.getType()); + assertEquals("Test", new String(recvReq.getSyncStream())); + } + + +} \ No newline at end of file diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/protocol/MailboxProtocolIntegrationTestComponent.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/protocol/MailboxProtocolIntegrationTestComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..e1e35dfd632b50db46747a5e0f565475be2328a2 --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/protocol/MailboxProtocolIntegrationTestComponent.java @@ -0,0 +1,18 @@ +package org.briarproject.bramble.mailbox.protocol; + +import org.briarproject.bramble.data.DataModule; + +import javax.inject.Singleton; + +import dagger.Component; + +@Singleton +@Component(modules = { + DataModule.class +}) + +interface MailboxProtocolIntegrationTestComponent { + + void inject(MailboxProtocolIntegrationTest testCase); + +}