From f95745e485e5985ec3a6db811b85e8bcb88d5b0c Mon Sep 17 00:00:00 2001
From: bontric <benjohnwie@gmail.com>
Date: Wed, 5 Sep 2018 20:40:07 +0200
Subject: [PATCH] Add MailboxProtocol integration test

---
 .../MailboxProtocolIntegrationTest.java       | 158 ++++++++++++++++++
 ...ilboxProtocolIntegrationTestComponent.java |  18 ++
 2 files changed, 176 insertions(+)
 create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/mailbox/protocol/MailboxProtocolIntegrationTest.java
 create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/mailbox/protocol/MailboxProtocolIntegrationTestComponent.java

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 000000000..702179b95
--- /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 000000000..e1e35dfd6
--- /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);
+
+}
-- 
GitLab