From 9c2e3917bfa453db7ee4d470370ec1221b6cb994 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Wed, 28 Sep 2011 14:43:23 +0100 Subject: [PATCH] Added an integration test for batch transports. --- .../sf/briar/protocol/MessageEncoderImpl.java | 5 +- test/build.xml | 1 + .../batch/BatchConnectionReadWriteTest.java | 168 ++++++++++++++++++ 3 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java diff --git a/components/net/sf/briar/protocol/MessageEncoderImpl.java b/components/net/sf/briar/protocol/MessageEncoderImpl.java index 326faf07d0..833bc3e418 100644 --- a/components/net/sf/briar/protocol/MessageEncoderImpl.java +++ b/components/net/sf/briar/protocol/MessageEncoderImpl.java @@ -12,6 +12,7 @@ import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.protocol.Author; import net.sf.briar.api.protocol.AuthorId; import net.sf.briar.api.protocol.Group; +import net.sf.briar.api.protocol.GroupId; import net.sf.briar.api.protocol.Message; import net.sf.briar.api.protocol.MessageEncoder; import net.sf.briar.api.protocol.MessageId; @@ -113,8 +114,8 @@ class MessageEncoderImpl implements MessageEncoder { messageDigest.reset(); messageDigest.update(raw); MessageId id = new MessageId(messageDigest.digest()); + GroupId groupId = group == null ? null : group.getId(); AuthorId authorId = author == null ? null : author.getId(); - return new MessageImpl(id, parent, group.getId(), authorId, timestamp, - raw); + return new MessageImpl(id, parent, groupId, authorId, timestamp, raw); } } diff --git a/test/build.xml b/test/build.xml index 793c9d63a3..4a1e8c1157 100644 --- a/test/build.xml +++ b/test/build.xml @@ -44,6 +44,7 @@ <test name='net.sf.briar.transport.ConnectionWriterTest'/> <test name='net.sf.briar.transport.FrameReadWriteTest'/> <test name='net.sf.briar.transport.PaddedConnectionWriterTest'/> + <test name='net.sf.briar.transport.batch.BatchConnectionReadWriteTest'/> <test name='net.sf.briar.util.ByteUtilsTest'/> <test name='net.sf.briar.util.FileUtilsTest'/> <test name='net.sf.briar.util.StringUtilsTest'/> diff --git a/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java b/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java new file mode 100644 index 0000000000..3aae49e1c5 --- /dev/null +++ b/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java @@ -0,0 +1,168 @@ +package net.sf.briar.transport.batch; + +import static net.sf.briar.api.transport.TransportConstants.IV_LENGTH; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.util.Collections; +import java.util.Map; + +import junit.framework.TestCase; +import net.sf.briar.TestDatabaseModule; +import net.sf.briar.TestUtils; +import net.sf.briar.api.ContactId; +import net.sf.briar.api.db.DatabaseComponent; +import net.sf.briar.api.db.DatabaseListener; +import net.sf.briar.api.protocol.Message; +import net.sf.briar.api.protocol.MessageEncoder; +import net.sf.briar.api.protocol.ProtocolReaderFactory; +import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; +import net.sf.briar.api.transport.ConnectionReader; +import net.sf.briar.api.transport.ConnectionReaderFactory; +import net.sf.briar.api.transport.ConnectionRecogniser; +import net.sf.briar.api.transport.ConnectionRecogniserFactory; +import net.sf.briar.api.transport.ConnectionWriter; +import net.sf.briar.api.transport.ConnectionWriterFactory; +import net.sf.briar.crypto.CryptoModule; +import net.sf.briar.db.DatabaseModule; +import net.sf.briar.protocol.ProtocolModule; +import net.sf.briar.protocol.writers.ProtocolWritersModule; +import net.sf.briar.serial.SerialModule; +import net.sf.briar.transport.TransportModule; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.google.inject.Guice; +import com.google.inject.Injector; + +public class BatchConnectionReadWriteTest extends TestCase { + + private final File testDir = TestUtils.getTestDirectory(); + private final File aliceDir = new File(testDir, "alice"); + private final File bobDir = new File(testDir, "bob"); + private final Map<String, Map<String, String>> transports = + Collections.emptyMap(); + private final byte[] aliceSecret, bobSecret; + private final int transportId = 123; + + private Injector alice, bob; + + public BatchConnectionReadWriteTest() throws Exception { + super(); + // Create matching secrets for Alice and Bob + aliceSecret = new byte[100]; + aliceSecret[16] = (byte) 1; + bobSecret = new byte[100]; + } + + @Before + public void setUp() { + testDir.mkdirs(); + // Create Alice's injector + alice = Guice.createInjector(new CryptoModule(), new DatabaseModule(), + new ProtocolModule(), new ProtocolWritersModule(), + new SerialModule(), new TestDatabaseModule(aliceDir), + new TransportModule()); + // Create Bob's injector + bob = Guice.createInjector(new CryptoModule(), new DatabaseModule(), + new ProtocolModule(), new ProtocolWritersModule(), + new SerialModule(), new TestDatabaseModule(bobDir), + new TransportModule()); + } + + @Test + public void testInjection() { + DatabaseComponent aliceDb = alice.getInstance(DatabaseComponent.class); + DatabaseComponent bobDb = bob.getInstance(DatabaseComponent.class); + assertFalse(aliceDb == bobDb); + } + + @Test + public void testWriteAndRead() throws Exception { + read(write()); + } + + private byte[] write() throws Exception { + // Open Alice's database + DatabaseComponent db = alice.getInstance(DatabaseComponent.class); + db.open(false); + // Add Bob as a contact and send him a message + ContactId contactId = db.addContact(transports, aliceSecret); + byte[] messageBody = "Hi Bob!".getBytes("UTF-8"); + MessageEncoder encoder = alice.getInstance(MessageEncoder.class); + Message message = encoder.encodeMessage(null, messageBody); + db.addLocalPrivateMessage(message, contactId); + // Create an outgoing batch connection + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ConnectionWriterFactory connFactory = + alice.getInstance(ConnectionWriterFactory.class); + ConnectionWriter conn = connFactory.createConnectionWriter(out, + Long.MAX_VALUE, true, transportId, 0L, aliceSecret); + ProtocolWriterFactory protoFactory = + alice.getInstance(ProtocolWriterFactory.class); + OutgoingBatchConnection batchOut = new OutgoingBatchConnection(conn, db, + protoFactory, contactId); + // Write whatever needs to be written + batchOut.write(); + // Close Alice's database + db.close(); + // Return the contents of the batch connection + return out.toByteArray(); + } + + private void read(byte[] b) throws Exception { + // Open Bob's database + DatabaseComponent db = bob.getInstance(DatabaseComponent.class); + db.open(false); + // Set up a database listener + MessageListener listener = new MessageListener(); + db.addListener(listener); + // Add Alice as a contact + ContactId contactId = db.addContact(transports, bobSecret); + // Create a connection recogniser and recognise the connection + ByteArrayInputStream in = new ByteArrayInputStream(b); + ConnectionRecogniserFactory recFactory = + bob.getInstance(ConnectionRecogniserFactory.class); + ConnectionRecogniser rec = + recFactory.createConnectionRecogniser(transportId); + byte[] encryptedIv = new byte[IV_LENGTH]; + int read = in.read(encryptedIv); + assertEquals(encryptedIv.length, read); + ContactId accepted = rec.acceptConnection(encryptedIv); + assertEquals(contactId, accepted); + // Create an incoming batch connection + ConnectionReaderFactory connFactory = + bob.getInstance(ConnectionReaderFactory.class); + ConnectionReader conn = connFactory.createConnectionReader(in, + encryptedIv, bobSecret); + ProtocolReaderFactory protoFactory = + bob.getInstance(ProtocolReaderFactory.class); + IncomingBatchConnection batchIn = new IncomingBatchConnection(conn, + db, protoFactory, contactId); + // No messages should have been added yet + assertFalse(listener.messagesAdded); + // Read whatever needs to be read + batchIn.read(); + // The private message from Alice should have been added + assertTrue(listener.messagesAdded); + // Close Bob's database + db.close(); + } + + @After + public void tearDown() { + TestUtils.deleteTestDirectory(testDir); + } + + private static class MessageListener implements DatabaseListener { + + private boolean messagesAdded = false; + + public void eventOccurred(Event e) { + if(e == Event.MESSAGES_ADDED) messagesAdded = true; + } + } +} -- GitLab