mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-14 19:59:05 +01:00
Decouple the database from IO.
This will enable asynchronous access to the database for IO threads.
This commit is contained in:
@@ -37,11 +37,11 @@
|
||||
<test name='net.sf.briar.plugins.socket.SimpleSocketPluginTest'/>
|
||||
<test name='net.sf.briar.protocol.AckReaderTest'/>
|
||||
<test name='net.sf.briar.protocol.BatchReaderTest'/>
|
||||
<test name='net.sf.briar.protocol.ConstantsTest'/>
|
||||
<test name='net.sf.briar.protocol.ConsumersTest'/>
|
||||
<test name='net.sf.briar.protocol.ProtocolReadWriteTest'/>
|
||||
<test name='net.sf.briar.protocol.ProtocolWriterImplTest'/>
|
||||
<test name='net.sf.briar.protocol.RequestReaderTest'/>
|
||||
<test name='net.sf.briar.protocol.writers.ConstantsTest'/>
|
||||
<test name='net.sf.briar.protocol.writers.RequestWriterImplTest'/>
|
||||
<test name='net.sf.briar.serial.ReaderImplTest'/>
|
||||
<test name='net.sf.briar.serial.WriterImplTest'/>
|
||||
<test name='net.sf.briar.setup.SetupWorkerTest'/>
|
||||
|
||||
@@ -8,6 +8,7 @@ import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.security.KeyPair;
|
||||
import java.util.Arrays;
|
||||
import java.util.BitSet;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
@@ -16,7 +17,7 @@ import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import net.sf.briar.api.crypto.CryptoComponent;
|
||||
@@ -31,21 +32,18 @@ import net.sf.briar.api.protocol.Message;
|
||||
import net.sf.briar.api.protocol.MessageFactory;
|
||||
import net.sf.briar.api.protocol.MessageId;
|
||||
import net.sf.briar.api.protocol.Offer;
|
||||
import net.sf.briar.api.protocol.PacketFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolReader;
|
||||
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolWriter;
|
||||
import net.sf.briar.api.protocol.ProtocolWriterFactory;
|
||||
import net.sf.briar.api.protocol.RawBatch;
|
||||
import net.sf.briar.api.protocol.Request;
|
||||
import net.sf.briar.api.protocol.SubscriptionUpdate;
|
||||
import net.sf.briar.api.protocol.Transport;
|
||||
import net.sf.briar.api.protocol.TransportId;
|
||||
import net.sf.briar.api.protocol.TransportIndex;
|
||||
import net.sf.briar.api.protocol.TransportUpdate;
|
||||
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||
import net.sf.briar.api.protocol.writers.OfferWriter;
|
||||
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
|
||||
import net.sf.briar.api.protocol.writers.RequestWriter;
|
||||
import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
|
||||
import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
|
||||
import net.sf.briar.api.transport.ConnectionReader;
|
||||
import net.sf.briar.api.transport.ConnectionReaderFactory;
|
||||
import net.sf.briar.api.transport.ConnectionWriter;
|
||||
@@ -54,7 +52,6 @@ import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.db.DatabaseModule;
|
||||
import net.sf.briar.lifecycle.LifecycleModule;
|
||||
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 net.sf.briar.transport.batch.TransportBatchModule;
|
||||
@@ -76,6 +73,7 @@ public class ProtocolIntegrationTest extends TestCase {
|
||||
private final ConnectionWriterFactory connectionWriterFactory;
|
||||
private final ProtocolReaderFactory protocolReaderFactory;
|
||||
private final ProtocolWriterFactory protocolWriterFactory;
|
||||
private final PacketFactory packetFactory;
|
||||
private final CryptoComponent crypto;
|
||||
private final byte[] secret;
|
||||
private final TransportIndex transportIndex = new TransportIndex(13);
|
||||
@@ -93,19 +91,19 @@ public class ProtocolIntegrationTest extends TestCase {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(Executor.class).toInstance(
|
||||
new ScheduledThreadPoolExecutor(5));
|
||||
Executors.newCachedThreadPool());
|
||||
}
|
||||
};
|
||||
Injector i = Guice.createInjector(testModule, new CryptoModule(),
|
||||
new DatabaseModule(), new LifecycleModule(),
|
||||
new ProtocolModule(), new ProtocolWritersModule(),
|
||||
new SerialModule(), new TestDatabaseModule(),
|
||||
new TransportBatchModule(), new TransportModule(),
|
||||
new TransportStreamModule());
|
||||
new ProtocolModule(), new SerialModule(),
|
||||
new TestDatabaseModule(), new TransportBatchModule(),
|
||||
new TransportModule(), new TransportStreamModule());
|
||||
connectionReaderFactory = i.getInstance(ConnectionReaderFactory.class);
|
||||
connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);
|
||||
protocolReaderFactory = i.getInstance(ProtocolReaderFactory.class);
|
||||
protocolWriterFactory = i.getInstance(ProtocolWriterFactory.class);
|
||||
packetFactory = i.getInstance(PacketFactory.class);
|
||||
crypto = i.getInstance(CryptoComponent.class);
|
||||
// Create a shared secret
|
||||
Random r = new Random();
|
||||
@@ -149,47 +147,51 @@ public class ProtocolIntegrationTest extends TestCase {
|
||||
|
||||
private byte[] write() throws Exception {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
ConnectionWriter w = connectionWriterFactory.createConnectionWriter(out,
|
||||
Long.MAX_VALUE, secret.clone());
|
||||
OutputStream out1 = w.getOutputStream();
|
||||
ConnectionWriter conn = connectionWriterFactory.createConnectionWriter(
|
||||
out, Long.MAX_VALUE, secret.clone());
|
||||
OutputStream out1 = conn.getOutputStream();
|
||||
ProtocolWriter proto = protocolWriterFactory.createProtocolWriter(out1);
|
||||
|
||||
AckWriter a = protocolWriterFactory.createAckWriter(out1);
|
||||
assertTrue(a.writeBatchId(ack));
|
||||
a.finish();
|
||||
Ack a = packetFactory.createAck(Collections.singletonList(ack));
|
||||
proto.writeAck(a);
|
||||
|
||||
BatchWriter b = protocolWriterFactory.createBatchWriter(out1);
|
||||
assertTrue(b.writeMessage(message.getSerialised()));
|
||||
assertTrue(b.writeMessage(message1.getSerialised()));
|
||||
assertTrue(b.writeMessage(message2.getSerialised()));
|
||||
assertTrue(b.writeMessage(message3.getSerialised()));
|
||||
b.finish();
|
||||
Collection<byte[]> batch = Arrays.asList(new byte[][] {
|
||||
message.getSerialised(),
|
||||
message1.getSerialised(),
|
||||
message2.getSerialised(),
|
||||
message3.getSerialised()
|
||||
});
|
||||
RawBatch b = packetFactory.createBatch(batch);
|
||||
proto.writeBatch(b);
|
||||
|
||||
OfferWriter o = protocolWriterFactory.createOfferWriter(out1);
|
||||
assertTrue(o.writeMessageId(message.getId()));
|
||||
assertTrue(o.writeMessageId(message1.getId()));
|
||||
assertTrue(o.writeMessageId(message2.getId()));
|
||||
assertTrue(o.writeMessageId(message3.getId()));
|
||||
o.finish();
|
||||
Collection<MessageId> offer = Arrays.asList(new MessageId[] {
|
||||
message.getId(),
|
||||
message1.getId(),
|
||||
message2.getId(),
|
||||
message3.getId()
|
||||
});
|
||||
Offer o = packetFactory.createOffer(offer);
|
||||
proto.writeOffer(o);
|
||||
|
||||
RequestWriter r = protocolWriterFactory.createRequestWriter(out1);
|
||||
BitSet requested = new BitSet(4);
|
||||
requested.set(1);
|
||||
requested.set(3);
|
||||
r.writeRequest(requested, 4);
|
||||
Request r = packetFactory.createRequest(requested, 4);
|
||||
proto.writeRequest(r);
|
||||
|
||||
SubscriptionUpdateWriter s =
|
||||
protocolWriterFactory.createSubscriptionUpdateWriter(out1);
|
||||
// Use a LinkedHashMap for predictable iteration order
|
||||
Map<Group, Long> subs = new LinkedHashMap<Group, Long>();
|
||||
subs.put(group, 0L);
|
||||
subs.put(group1, 0L);
|
||||
s.writeSubscriptions(subs, timestamp);
|
||||
SubscriptionUpdate s = packetFactory.createSubscriptionUpdate(subs,
|
||||
timestamp);
|
||||
proto.writeSubscriptionUpdate(s);
|
||||
|
||||
TransportUpdateWriter t =
|
||||
protocolWriterFactory.createTransportUpdateWriter(out1);
|
||||
t.writeTransports(transports, timestamp);
|
||||
TransportUpdate t = packetFactory.createTransportUpdate(transports,
|
||||
timestamp);
|
||||
proto.writeTransportUpdate(t);
|
||||
|
||||
out1.close();
|
||||
out1.flush();
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import java.util.Collections;
|
||||
import net.sf.briar.api.db.DatabaseComponent;
|
||||
import net.sf.briar.api.db.DbException;
|
||||
import net.sf.briar.api.lifecycle.ShutdownManager;
|
||||
import net.sf.briar.api.protocol.PacketFactory;
|
||||
import net.sf.briar.db.DatabaseCleaner.Callback;
|
||||
|
||||
import org.jmock.Expectations;
|
||||
@@ -27,11 +28,13 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(database).getFreeSpace();
|
||||
will(returnValue(MIN_FREE_SPACE));
|
||||
}});
|
||||
Callback db = createDatabaseComponentImpl(database, cleaner, shutdown);
|
||||
Callback db = createDatabaseComponentImpl(database, cleaner, shutdown,
|
||||
packetFactory);
|
||||
|
||||
db.checkFreeSpaceAndClean();
|
||||
|
||||
@@ -45,6 +48,7 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(database).getFreeSpace();
|
||||
will(returnValue(MIN_FREE_SPACE - 1));
|
||||
@@ -57,7 +61,8 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
|
||||
oneOf(database).getFreeSpace();
|
||||
will(returnValue(MIN_FREE_SPACE));
|
||||
}});
|
||||
Callback db = createDatabaseComponentImpl(database, cleaner, shutdown);
|
||||
Callback db = createDatabaseComponentImpl(database, cleaner, shutdown,
|
||||
packetFactory);
|
||||
|
||||
db.checkFreeSpaceAndClean();
|
||||
|
||||
@@ -72,6 +77,7 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(database).getFreeSpace();
|
||||
will(returnValue(MIN_FREE_SPACE - 1));
|
||||
@@ -86,7 +92,8 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
|
||||
oneOf(database).getFreeSpace();
|
||||
will(returnValue(MIN_FREE_SPACE));
|
||||
}});
|
||||
Callback db = createDatabaseComponentImpl(database, cleaner, shutdown);
|
||||
Callback db = createDatabaseComponentImpl(database, cleaner, shutdown,
|
||||
packetFactory);
|
||||
|
||||
db.checkFreeSpaceAndClean();
|
||||
|
||||
@@ -101,6 +108,7 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(database).getFreeSpace();
|
||||
will(returnValue(MIN_FREE_SPACE - 1));
|
||||
@@ -117,7 +125,8 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
|
||||
oneOf(database).getFreeSpace();
|
||||
will(returnValue(MIN_FREE_SPACE));
|
||||
}});
|
||||
Callback db = createDatabaseComponentImpl(database, cleaner, shutdown);
|
||||
Callback db = createDatabaseComponentImpl(database, cleaner, shutdown,
|
||||
packetFactory);
|
||||
|
||||
db.checkFreeSpaceAndClean();
|
||||
|
||||
@@ -127,13 +136,15 @@ public class DatabaseComponentImplTest extends DatabaseComponentTest {
|
||||
@Override
|
||||
protected <T> DatabaseComponent createDatabaseComponent(
|
||||
Database<T> database, DatabaseCleaner cleaner,
|
||||
ShutdownManager shutdown) {
|
||||
return createDatabaseComponentImpl(database, cleaner, shutdown);
|
||||
ShutdownManager shutdown, PacketFactory packetFactory) {
|
||||
return createDatabaseComponentImpl(database, cleaner, shutdown,
|
||||
packetFactory);
|
||||
}
|
||||
|
||||
private <T> DatabaseComponentImpl<T> createDatabaseComponentImpl(
|
||||
Database<T> database, DatabaseCleaner cleaner,
|
||||
ShutdownManager shutdown) {
|
||||
return new DatabaseComponentImpl<T>(database, cleaner, shutdown);
|
||||
ShutdownManager shutdown, PacketFactory packetFactory) {
|
||||
return new DatabaseComponentImpl<T>(database, cleaner, shutdown,
|
||||
packetFactory);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package net.sf.briar.db;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.BitSet;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
@@ -32,18 +33,14 @@ import net.sf.briar.api.protocol.GroupId;
|
||||
import net.sf.briar.api.protocol.Message;
|
||||
import net.sf.briar.api.protocol.MessageId;
|
||||
import net.sf.briar.api.protocol.Offer;
|
||||
import net.sf.briar.api.protocol.ProtocolConstants;
|
||||
import net.sf.briar.api.protocol.PacketFactory;
|
||||
import net.sf.briar.api.protocol.RawBatch;
|
||||
import net.sf.briar.api.protocol.Request;
|
||||
import net.sf.briar.api.protocol.SubscriptionUpdate;
|
||||
import net.sf.briar.api.protocol.Transport;
|
||||
import net.sf.briar.api.protocol.TransportId;
|
||||
import net.sf.briar.api.protocol.TransportIndex;
|
||||
import net.sf.briar.api.protocol.TransportUpdate;
|
||||
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||
import net.sf.briar.api.protocol.writers.OfferWriter;
|
||||
import net.sf.briar.api.protocol.writers.RequestWriter;
|
||||
import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
|
||||
import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
|
||||
import net.sf.briar.api.transport.ConnectionWindow;
|
||||
|
||||
import org.jmock.Expectations;
|
||||
@@ -105,7 +102,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
|
||||
protected abstract <T> DatabaseComponent createDatabaseComponent(
|
||||
Database<T> database, DatabaseCleaner cleaner,
|
||||
ShutdownManager shutdown);
|
||||
ShutdownManager shutdown, PacketFactory packetFactory);
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -115,6 +112,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final ConnectionWindow connectionWindow =
|
||||
context.mock(ConnectionWindow.class);
|
||||
final Group group = context.mock(Group.class);
|
||||
@@ -200,7 +198,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).close();
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.open(false);
|
||||
db.addListener(listener);
|
||||
@@ -233,6 +231,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
// setRating(authorId, Rating.GOOD)
|
||||
allowing(database).startTransaction();
|
||||
@@ -251,7 +250,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.setRating(authorId, Rating.GOOD);
|
||||
|
||||
@@ -265,6 +264,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
// setRating(authorId, Rating.GOOD)
|
||||
oneOf(database).startTransaction();
|
||||
@@ -287,7 +287,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.setRating(authorId, Rating.GOOD);
|
||||
|
||||
@@ -302,6 +302,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
// setRating(authorId, Rating.GOOD)
|
||||
oneOf(database).startTransaction();
|
||||
@@ -327,7 +328,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.setRating(authorId, Rating.GOOD);
|
||||
|
||||
@@ -342,6 +343,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
// addLocalGroupMessage(message)
|
||||
oneOf(database).startTransaction();
|
||||
@@ -351,7 +353,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addLocalGroupMessage(message);
|
||||
|
||||
@@ -365,6 +367,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
// addLocalGroupMessage(message)
|
||||
oneOf(database).startTransaction();
|
||||
@@ -376,7 +379,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addLocalGroupMessage(message);
|
||||
|
||||
@@ -390,6 +393,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
// addLocalGroupMessage(message)
|
||||
oneOf(database).startTransaction();
|
||||
@@ -410,7 +414,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addLocalGroupMessage(message);
|
||||
|
||||
@@ -425,6 +429,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
// addLocalGroupMessage(message)
|
||||
oneOf(database).startTransaction();
|
||||
@@ -448,7 +453,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addLocalGroupMessage(message);
|
||||
|
||||
@@ -462,6 +467,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -473,7 +479,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
will(returnValue(false));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addLocalPrivateMessage(privateMessage, contactId);
|
||||
|
||||
@@ -487,6 +493,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -499,7 +506,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).setStatus(txn, contactId, messageId, Status.NEW);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addLocalPrivateMessage(privateMessage, contactId);
|
||||
|
||||
@@ -514,17 +521,10 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final AckWriter ackWriter = context.mock(AckWriter.class);
|
||||
final BatchWriter batchWriter = context.mock(BatchWriter.class);
|
||||
final OfferWriter offerWriter = context.mock(OfferWriter.class);
|
||||
final SubscriptionUpdateWriter subscriptionUpdateWriter =
|
||||
context.mock(SubscriptionUpdateWriter.class);
|
||||
final TransportUpdateWriter transportUpdateWriter =
|
||||
context.mock(TransportUpdateWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Ack ack = context.mock(Ack.class);
|
||||
final Batch batch = context.mock(Batch.class);
|
||||
final Offer offer = context.mock(Offer.class);
|
||||
final RequestWriter requestWriter = context.mock(RequestWriter.class);
|
||||
final SubscriptionUpdate subscriptionUpdate =
|
||||
context.mock(SubscriptionUpdate.class);
|
||||
final TransportUpdate transportUpdate =
|
||||
@@ -538,7 +538,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
exactly(19).of(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
try {
|
||||
db.addLocalPrivateMessage(privateMessage, contactId);
|
||||
@@ -546,33 +546,33 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
try {
|
||||
db.generateAck(contactId, ackWriter);
|
||||
db.generateAck(contactId, 123);
|
||||
fail();
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
try {
|
||||
db.generateBatch(contactId, batchWriter);
|
||||
db.generateBatch(contactId, 123);
|
||||
fail();
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
try {
|
||||
db.generateBatch(contactId, batchWriter,
|
||||
db.generateBatch(contactId, 123,
|
||||
Collections.<MessageId>emptyList());
|
||||
fail();
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
try {
|
||||
db.generateOffer(contactId, offerWriter);
|
||||
db.generateOffer(contactId, 123);
|
||||
fail();
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
try {
|
||||
db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
|
||||
db.generateSubscriptionUpdate(contactId);
|
||||
fail();
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
try {
|
||||
db.generateTransportUpdate(contactId, transportUpdateWriter);
|
||||
db.generateTransportUpdate(contactId);
|
||||
fail();
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
@@ -607,7 +607,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
try {
|
||||
db.receiveOffer(contactId, offer, requestWriter);
|
||||
db.receiveOffer(contactId, offer);
|
||||
fail();
|
||||
} catch(NoSuchContactException expected) {}
|
||||
|
||||
@@ -650,7 +650,8 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final AckWriter ackWriter = context.mock(AckWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Ack ack = context.mock(Ack.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -658,22 +659,18 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
allowing(database).containsContact(txn, contactId);
|
||||
will(returnValue(true));
|
||||
// Get the batches to ack
|
||||
oneOf(database).getBatchesToAck(txn, contactId);
|
||||
oneOf(database).getBatchesToAck(txn, contactId, 123);
|
||||
will(returnValue(batchesToAck));
|
||||
// Try to add both batches to the writer - only manage to add one
|
||||
oneOf(ackWriter).writeBatchId(batchId);
|
||||
will(returnValue(true));
|
||||
oneOf(ackWriter).writeBatchId(batchId1);
|
||||
will(returnValue(false));
|
||||
oneOf(ackWriter).finish();
|
||||
// Record the batch that was acked
|
||||
oneOf(database).removeBatchesToAck(txn, contactId,
|
||||
Collections.singletonList(batchId));
|
||||
// Create the packet
|
||||
oneOf(packetFactory).createAck(batchesToAck);
|
||||
will(returnValue(ack));
|
||||
// Record the batches that were acked
|
||||
oneOf(database).removeBatchesToAck(txn, contactId, batchesToAck);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.generateAck(contactId, ackWriter);
|
||||
assertEquals(ack, db.generateAck(contactId, 123));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
@@ -682,47 +679,47 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
public void testGenerateBatch() throws Exception {
|
||||
final MessageId messageId1 = new MessageId(TestUtils.getRandomId());
|
||||
final byte[] raw1 = new byte[size];
|
||||
final Collection<MessageId> sendable = new ArrayList<MessageId>();
|
||||
sendable.add(messageId);
|
||||
sendable.add(messageId1);
|
||||
final Collection<MessageId> sendable = Arrays.asList(new MessageId[] {
|
||||
messageId,
|
||||
messageId1
|
||||
});
|
||||
final Collection<byte[]> messages = Arrays.asList(new byte[][] {
|
||||
raw,
|
||||
raw1
|
||||
});
|
||||
Mockery context = new Mockery();
|
||||
@SuppressWarnings("unchecked")
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final BatchWriter batchWriter = context.mock(BatchWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final RawBatch batch = context.mock(RawBatch.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
allowing(database).commitTransaction(txn);
|
||||
allowing(database).containsContact(txn, contactId);
|
||||
will(returnValue(true));
|
||||
// Find out how much space we've got
|
||||
oneOf(batchWriter).getCapacity();
|
||||
will(returnValue(ProtocolConstants.MAX_PACKET_LENGTH));
|
||||
// Get the sendable messages
|
||||
oneOf(database).getSendableMessages(txn, contactId,
|
||||
ProtocolConstants.MAX_PACKET_LENGTH);
|
||||
oneOf(database).getSendableMessages(txn, contactId, size * 2);
|
||||
will(returnValue(sendable));
|
||||
oneOf(database).getMessage(txn, messageId);
|
||||
will(returnValue(raw));
|
||||
oneOf(database).getMessage(txn, messageId1);
|
||||
will(returnValue(raw1));
|
||||
// Add the sendable messages to the batch
|
||||
oneOf(batchWriter).writeMessage(raw);
|
||||
will(returnValue(true));
|
||||
oneOf(batchWriter).writeMessage(raw1);
|
||||
will(returnValue(true));
|
||||
oneOf(batchWriter).finish();
|
||||
// Create the packet
|
||||
oneOf(packetFactory).createBatch(messages);
|
||||
will(returnValue(batch));
|
||||
// Record the outstanding batch
|
||||
oneOf(batch).getId();
|
||||
will(returnValue(batchId));
|
||||
// Record the message that was sent
|
||||
oneOf(database).addOutstandingBatch(txn, contactId, batchId,
|
||||
sendable);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.generateBatch(contactId, batchWriter);
|
||||
assertEquals(batch, db.generateBatch(contactId, size * 2));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
@@ -736,21 +733,22 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
requested.add(messageId);
|
||||
requested.add(messageId1);
|
||||
requested.add(messageId2);
|
||||
final Collection<byte[]> msgs = Arrays.asList(new byte[][] {
|
||||
raw1
|
||||
});
|
||||
Mockery context = new Mockery();
|
||||
@SuppressWarnings("unchecked")
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final BatchWriter batchWriter = context.mock(BatchWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final RawBatch batch = context.mock(RawBatch.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
allowing(database).commitTransaction(txn);
|
||||
allowing(database).containsContact(txn, contactId);
|
||||
will(returnValue(true));
|
||||
// Find out how much space we've got
|
||||
oneOf(batchWriter).getCapacity();
|
||||
will(returnValue(ProtocolConstants.MAX_PACKET_LENGTH));
|
||||
// Try to get the requested messages
|
||||
oneOf(database).getMessageIfSendable(txn, contactId, messageId);
|
||||
will(returnValue(null)); // Message is not sendable
|
||||
@@ -758,19 +756,19 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
will(returnValue(raw1)); // Message is sendable
|
||||
oneOf(database).getMessageIfSendable(txn, contactId, messageId2);
|
||||
will(returnValue(null)); // Message is not sendable
|
||||
// Add the sendable message to the batch
|
||||
oneOf(batchWriter).writeMessage(raw1);
|
||||
will(returnValue(true));
|
||||
oneOf(batchWriter).finish();
|
||||
// Create the packet
|
||||
oneOf(packetFactory).createBatch(msgs);
|
||||
will(returnValue(batch));
|
||||
// Record the outstanding batch
|
||||
oneOf(batch).getId();
|
||||
will(returnValue(batchId));
|
||||
// Record the message that was sent
|
||||
oneOf(database).addOutstandingBatch(txn, contactId, batchId,
|
||||
Collections.singletonList(messageId1));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.generateBatch(contactId, batchWriter, requested);
|
||||
assertEquals(batch, db.generateBatch(contactId, size * 3, requested));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
@@ -778,15 +776,16 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
@Test
|
||||
public void testGenerateOffer() throws Exception {
|
||||
final MessageId messageId1 = new MessageId(TestUtils.getRandomId());
|
||||
final Collection<MessageId> sendable = new ArrayList<MessageId>();
|
||||
sendable.add(messageId);
|
||||
sendable.add(messageId1);
|
||||
final Collection<MessageId> offerable = new ArrayList<MessageId>();
|
||||
offerable.add(messageId);
|
||||
offerable.add(messageId1);
|
||||
Mockery context = new Mockery();
|
||||
@SuppressWarnings("unchecked")
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final OfferWriter offerWriter = context.mock(OfferWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Offer offer = context.mock(Offer.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -794,20 +793,16 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
allowing(database).containsContact(txn, contactId);
|
||||
will(returnValue(true));
|
||||
// Get the sendable message IDs
|
||||
oneOf(database).getSendableMessages(txn, contactId);
|
||||
will(returnValue(sendable));
|
||||
// Try to add both IDs to the writer - only manage to add one
|
||||
oneOf(offerWriter).writeMessageId(messageId);
|
||||
will(returnValue(true));
|
||||
oneOf(offerWriter).writeMessageId(messageId1);
|
||||
will(returnValue(false));
|
||||
oneOf(offerWriter).finish();
|
||||
oneOf(database).getOfferableMessages(txn, contactId, 123);
|
||||
will(returnValue(offerable));
|
||||
// Create the packet
|
||||
oneOf(packetFactory).createOffer(offerable);
|
||||
will(returnValue(offer));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
assertEquals(Collections.singletonList(messageId),
|
||||
db.generateOffer(contactId, offerWriter));
|
||||
assertEquals(offer, db.generateOffer(contactId, 123));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
@@ -820,8 +815,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final SubscriptionUpdateWriter subscriptionUpdateWriter =
|
||||
context.mock(SubscriptionUpdateWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -835,26 +829,23 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
will(returnValue(now));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
|
||||
assertNull(db.generateSubscriptionUpdate(contactId));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateSubscriptionUpdate() throws Exception {
|
||||
final MessageId messageId1 = new MessageId(TestUtils.getRandomId());
|
||||
final Collection<MessageId> sendable = new ArrayList<MessageId>();
|
||||
sendable.add(messageId);
|
||||
sendable.add(messageId1);
|
||||
Mockery context = new Mockery();
|
||||
@SuppressWarnings("unchecked")
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final SubscriptionUpdateWriter subscriptionUpdateWriter =
|
||||
context.mock(SubscriptionUpdateWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final SubscriptionUpdate subscriptionUpdate =
|
||||
context.mock(SubscriptionUpdate.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -871,15 +862,17 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
will(returnValue(Collections.singletonMap(group, 0L)));
|
||||
oneOf(database).setSubscriptionsSent(with(txn), with(contactId),
|
||||
with(any(long.class)));
|
||||
// Add the subscriptions to the writer
|
||||
oneOf(subscriptionUpdateWriter).writeSubscriptions(
|
||||
// Create the packet
|
||||
oneOf(packetFactory).createSubscriptionUpdate(
|
||||
with(Collections.singletonMap(group, 0L)),
|
||||
with(any(long.class)));
|
||||
will(returnValue(subscriptionUpdate));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
|
||||
assertEquals(subscriptionUpdate,
|
||||
db.generateSubscriptionUpdate(contactId));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
@@ -892,8 +885,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final TransportUpdateWriter transportUpdateWriter =
|
||||
context.mock(TransportUpdateWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -907,26 +899,23 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
will(returnValue(now));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.generateTransportUpdate(contactId, transportUpdateWriter);
|
||||
assertNull(db.generateTransportUpdate(contactId));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateTransportUpdate() throws Exception {
|
||||
final MessageId messageId1 = new MessageId(TestUtils.getRandomId());
|
||||
final Collection<MessageId> sendable = new ArrayList<MessageId>();
|
||||
sendable.add(messageId);
|
||||
sendable.add(messageId1);
|
||||
Mockery context = new Mockery();
|
||||
@SuppressWarnings("unchecked")
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final TransportUpdateWriter transportUpdateWriter =
|
||||
context.mock(TransportUpdateWriter.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final TransportUpdate transportUpdate =
|
||||
context.mock(TransportUpdate.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -943,14 +932,15 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
will(returnValue(transports));
|
||||
oneOf(database).setTransportsSent(with(txn), with(contactId),
|
||||
with(any(long.class)));
|
||||
// Add the properties to the writer
|
||||
oneOf(transportUpdateWriter).writeTransports(with(transports),
|
||||
// Create the packet
|
||||
oneOf(packetFactory).createTransportUpdate(with(transports),
|
||||
with(any(long.class)));
|
||||
will(returnValue(transportUpdate));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.generateTransportUpdate(contactId, transportUpdateWriter);
|
||||
assertEquals(transportUpdate, db.generateTransportUpdate(contactId));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
@@ -963,6 +953,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Ack ack = context.mock(Ack.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -980,7 +971,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).removeLostBatch(txn, contactId, batchId1);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveAck(contactId, ack);
|
||||
|
||||
@@ -994,6 +985,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Batch batch = context.mock(Batch.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -1013,7 +1005,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).addBatchToAck(txn, contactId, batchId);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveBatch(contactId, batch);
|
||||
|
||||
@@ -1027,6 +1019,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Batch batch = context.mock(Batch.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -1045,7 +1038,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).addBatchToAck(txn, contactId, batchId);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveBatch(contactId, batch);
|
||||
|
||||
@@ -1060,6 +1053,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Batch batch = context.mock(Batch.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -1079,7 +1073,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).addBatchToAck(txn, contactId, batchId);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveBatch(contactId, batch);
|
||||
|
||||
@@ -1094,6 +1088,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Batch batch = context.mock(Batch.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -1117,7 +1112,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).addBatchToAck(txn, contactId, batchId);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveBatch(contactId, batch);
|
||||
|
||||
@@ -1131,6 +1126,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Batch batch = context.mock(Batch.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -1163,7 +1159,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).addBatchToAck(txn, contactId, batchId);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveBatch(contactId, batch);
|
||||
|
||||
@@ -1177,6 +1173,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Batch batch = context.mock(Batch.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -1211,7 +1208,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).addBatchToAck(txn, contactId, batchId);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveBatch(contactId, batch);
|
||||
|
||||
@@ -1234,8 +1231,9 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final Offer offer = context.mock(Offer.class);
|
||||
final RequestWriter requestWriter = context.mock(RequestWriter.class);
|
||||
final Request request = context.mock(Request.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -1251,12 +1249,14 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
will(returnValue(true)); // Visible - do not request message # 1
|
||||
oneOf(database).setStatusSeenIfVisible(txn, contactId, messageId2);
|
||||
will(returnValue(false)); // Not visible - request message # 2
|
||||
oneOf(requestWriter).writeRequest(expectedRequest, 3);
|
||||
// Create the packet
|
||||
oneOf(packetFactory).createRequest(expectedRequest, 3);
|
||||
will(returnValue(request));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveOffer(contactId, offer, requestWriter);
|
||||
assertEquals(request, db.receiveOffer(contactId, offer));
|
||||
|
||||
context.assertIsSatisfied();
|
||||
}
|
||||
@@ -1269,6 +1269,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final SubscriptionUpdate subscriptionUpdate =
|
||||
context.mock(SubscriptionUpdate.class);
|
||||
context.checking(new Expectations() {{
|
||||
@@ -1286,7 +1287,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
Collections.singletonMap(group, 0L), timestamp);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveSubscriptionUpdate(contactId, subscriptionUpdate);
|
||||
|
||||
@@ -1301,6 +1302,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final TransportUpdate transportUpdate =
|
||||
context.mock(TransportUpdate.class);
|
||||
context.checking(new Expectations() {{
|
||||
@@ -1318,7 +1320,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
timestamp);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.receiveTransportUpdate(contactId, transportUpdate);
|
||||
|
||||
@@ -1332,6 +1334,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final DatabaseListener listener = context.mock(DatabaseListener.class);
|
||||
context.checking(new Expectations() {{
|
||||
// addLocalGroupMessage(message)
|
||||
@@ -1354,7 +1357,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(listener).eventOccurred(with(any(MessagesAddedEvent.class)));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addListener(listener);
|
||||
db.addLocalGroupMessage(message);
|
||||
@@ -1369,6 +1372,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final DatabaseListener listener = context.mock(DatabaseListener.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -1384,7 +1388,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(listener).eventOccurred(with(any(MessagesAddedEvent.class)));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addListener(listener);
|
||||
db.addLocalPrivateMessage(privateMessage, contactId);
|
||||
@@ -1400,6 +1404,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final DatabaseListener listener = context.mock(DatabaseListener.class);
|
||||
context.checking(new Expectations() {{
|
||||
// addLocalGroupMessage(message)
|
||||
@@ -1413,7 +1418,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
// The message was not added, so the listener should not be called
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addListener(listener);
|
||||
db.addLocalGroupMessage(message);
|
||||
@@ -1429,6 +1434,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final DatabaseListener listener = context.mock(DatabaseListener.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
@@ -1442,7 +1448,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
// The message was not added, so the listener should not be called
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addListener(listener);
|
||||
db.addLocalPrivateMessage(privateMessage, contactId);
|
||||
@@ -1460,6 +1466,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final DatabaseListener listener = context.mock(DatabaseListener.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(database).startTransaction();
|
||||
@@ -1474,7 +1481,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
TransportAddedEvent.class)));
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addListener(listener);
|
||||
db.setLocalProperties(transportId, properties);
|
||||
@@ -1492,6 +1499,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
final DatabaseListener listener = context.mock(DatabaseListener.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(database).startTransaction();
|
||||
@@ -1501,7 +1509,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).commitTransaction(txn);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.addListener(listener);
|
||||
db.setLocalProperties(transportId, properties);
|
||||
@@ -1516,6 +1524,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
final Database<Object> database = context.mock(Database.class);
|
||||
final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
|
||||
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
context.checking(new Expectations() {{
|
||||
allowing(database).startTransaction();
|
||||
will(returnValue(txn));
|
||||
@@ -1526,7 +1535,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
||||
oneOf(database).setStatusSeenIfVisible(txn, contactId, messageId);
|
||||
}});
|
||||
DatabaseComponent db = createDatabaseComponent(database, cleaner,
|
||||
shutdown);
|
||||
shutdown, packetFactory);
|
||||
|
||||
db.setSeen(contactId, Collections.singletonList(messageId));
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@ import net.sf.briar.api.transport.ConnectionWindowFactory;
|
||||
import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.lifecycle.LifecycleModule;
|
||||
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 net.sf.briar.transport.batch.TransportBatchModule;
|
||||
@@ -107,10 +106,9 @@ public class H2DatabaseTest extends TestCase {
|
||||
};
|
||||
Injector i = Guice.createInjector(testModule, new CryptoModule(),
|
||||
new DatabaseModule(), new LifecycleModule(),
|
||||
new ProtocolModule(), new ProtocolWritersModule(),
|
||||
new SerialModule(), new TransportBatchModule(),
|
||||
new TransportModule(), new TransportStreamModule(),
|
||||
new TestDatabaseModule(testDir));
|
||||
new ProtocolModule(), new SerialModule(),
|
||||
new TransportBatchModule(), new TransportModule(),
|
||||
new TransportStreamModule(), new TestDatabaseModule(testDir));
|
||||
connectionContextFactory =
|
||||
i.getInstance(ConnectionContextFactory.class);
|
||||
connectionWindowFactory = i.getInstance(ConnectionWindowFactory.class);
|
||||
@@ -588,7 +586,7 @@ public class H2DatabaseTest extends TestCase {
|
||||
db.addBatchToAck(txn, contactId, batchId1);
|
||||
|
||||
// Both batch IDs should be returned
|
||||
Collection<BatchId> acks = db.getBatchesToAck(txn, contactId);
|
||||
Collection<BatchId> acks = db.getBatchesToAck(txn, contactId, 1234);
|
||||
assertEquals(2, acks.size());
|
||||
assertTrue(acks.contains(batchId));
|
||||
assertTrue(acks.contains(batchId1));
|
||||
@@ -597,7 +595,7 @@ public class H2DatabaseTest extends TestCase {
|
||||
db.removeBatchesToAck(txn, contactId, acks);
|
||||
|
||||
// Both batch IDs should have been removed
|
||||
acks = db.getBatchesToAck(txn, contactId);
|
||||
acks = db.getBatchesToAck(txn, contactId, 1234);
|
||||
assertEquals(0, acks.size());
|
||||
|
||||
db.commitTransaction(txn);
|
||||
@@ -615,7 +613,7 @@ public class H2DatabaseTest extends TestCase {
|
||||
db.addBatchToAck(txn, contactId, batchId);
|
||||
|
||||
// The batch ID should only be returned once
|
||||
Collection<BatchId> acks = db.getBatchesToAck(txn, contactId);
|
||||
Collection<BatchId> acks = db.getBatchesToAck(txn, contactId, 1234);
|
||||
assertEquals(1, acks.size());
|
||||
assertTrue(acks.contains(batchId));
|
||||
|
||||
@@ -623,7 +621,7 @@ public class H2DatabaseTest extends TestCase {
|
||||
db.removeBatchesToAck(txn, contactId, acks);
|
||||
|
||||
// The batch ID should have been removed
|
||||
acks = db.getBatchesToAck(txn, contactId);
|
||||
acks = db.getBatchesToAck(txn, contactId, 1234);
|
||||
assertEquals(0, acks.size());
|
||||
|
||||
db.commitTransaction(txn);
|
||||
|
||||
@@ -61,10 +61,6 @@ class TestMessage implements Message {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
public int getLength() {
|
||||
return raw.length;
|
||||
}
|
||||
|
||||
public byte[] getSerialised() {
|
||||
return raw;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import junit.framework.TestCase;
|
||||
import net.sf.briar.api.FormatException;
|
||||
import net.sf.briar.api.protocol.Ack;
|
||||
import net.sf.briar.api.protocol.BatchId;
|
||||
import net.sf.briar.api.protocol.PacketFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolConstants;
|
||||
import net.sf.briar.api.protocol.Types;
|
||||
import net.sf.briar.api.protocol.UniqueId;
|
||||
@@ -42,8 +43,8 @@ public class AckReaderTest extends TestCase {
|
||||
|
||||
@Test
|
||||
public void testFormatExceptionIfAckIsTooLarge() throws Exception {
|
||||
AckFactory ackFactory = context.mock(AckFactory.class);
|
||||
AckReader ackReader = new AckReader(ackFactory);
|
||||
PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
AckReader ackReader = new AckReader(packetFactory);
|
||||
|
||||
byte[] b = createAck(true);
|
||||
ByteArrayInputStream in = new ByteArrayInputStream(b);
|
||||
@@ -60,11 +61,11 @@ public class AckReaderTest extends TestCase {
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void testNoFormatExceptionIfAckIsMaximumSize() throws Exception {
|
||||
final AckFactory ackFactory = context.mock(AckFactory.class);
|
||||
AckReader ackReader = new AckReader(ackFactory);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
AckReader ackReader = new AckReader(packetFactory);
|
||||
final Ack ack = context.mock(Ack.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(ackFactory).createAck(with(any(Collection.class)));
|
||||
oneOf(packetFactory).createAck(with(any(Collection.class)));
|
||||
will(returnValue(ack));
|
||||
}});
|
||||
|
||||
@@ -79,11 +80,11 @@ public class AckReaderTest extends TestCase {
|
||||
|
||||
@Test
|
||||
public void testEmptyAck() throws Exception {
|
||||
final AckFactory ackFactory = context.mock(AckFactory.class);
|
||||
AckReader ackReader = new AckReader(ackFactory);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
AckReader ackReader = new AckReader(packetFactory);
|
||||
final Ack ack = context.mock(Ack.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(ackFactory).createAck(
|
||||
oneOf(packetFactory).createAck(
|
||||
with(Collections.<BatchId>emptyList()));
|
||||
will(returnValue(ack));
|
||||
}});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package net.sf.briar.protocol.writers;
|
||||
package net.sf.briar.protocol;
|
||||
|
||||
import static net.sf.briar.api.protocol.ProtocolConstants.MAX_AUTHOR_NAME_LENGTH;
|
||||
import static net.sf.briar.api.protocol.ProtocolConstants.MAX_BODY_LENGTH;
|
||||
@@ -15,12 +15,14 @@ import java.io.ByteArrayOutputStream;
|
||||
import java.security.PrivateKey;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import net.sf.briar.TestUtils;
|
||||
import net.sf.briar.api.crypto.CryptoComponent;
|
||||
import net.sf.briar.api.protocol.Ack;
|
||||
import net.sf.briar.api.protocol.Author;
|
||||
import net.sf.briar.api.protocol.AuthorFactory;
|
||||
import net.sf.briar.api.protocol.BatchId;
|
||||
@@ -29,19 +31,18 @@ import net.sf.briar.api.protocol.GroupFactory;
|
||||
import net.sf.briar.api.protocol.Message;
|
||||
import net.sf.briar.api.protocol.MessageFactory;
|
||||
import net.sf.briar.api.protocol.MessageId;
|
||||
import net.sf.briar.api.protocol.Offer;
|
||||
import net.sf.briar.api.protocol.PacketFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolWriter;
|
||||
import net.sf.briar.api.protocol.ProtocolWriterFactory;
|
||||
import net.sf.briar.api.protocol.RawBatch;
|
||||
import net.sf.briar.api.protocol.SubscriptionUpdate;
|
||||
import net.sf.briar.api.protocol.Transport;
|
||||
import net.sf.briar.api.protocol.TransportId;
|
||||
import net.sf.briar.api.protocol.TransportIndex;
|
||||
import net.sf.briar.api.protocol.TransportUpdate;
|
||||
import net.sf.briar.api.protocol.UniqueId;
|
||||
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||
import net.sf.briar.api.protocol.writers.OfferWriter;
|
||||
import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
|
||||
import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
|
||||
import net.sf.briar.api.serial.SerialComponent;
|
||||
import net.sf.briar.api.serial.WriterFactory;
|
||||
import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.protocol.ProtocolModule;
|
||||
import net.sf.briar.serial.SerialModule;
|
||||
|
||||
import org.junit.Test;
|
||||
@@ -51,23 +52,23 @@ import com.google.inject.Injector;
|
||||
|
||||
public class ConstantsTest extends TestCase {
|
||||
|
||||
private final WriterFactory writerFactory;
|
||||
private final CryptoComponent crypto;
|
||||
private final SerialComponent serial;
|
||||
private final GroupFactory groupFactory;
|
||||
private final AuthorFactory authorFactory;
|
||||
private final MessageFactory messageFactory;
|
||||
private final PacketFactory packetFactory;
|
||||
private final ProtocolWriterFactory protocolWriterFactory;
|
||||
|
||||
public ConstantsTest() throws Exception {
|
||||
super();
|
||||
Injector i = Guice.createInjector(new CryptoModule(),
|
||||
new ProtocolModule(), new SerialModule());
|
||||
writerFactory = i.getInstance(WriterFactory.class);
|
||||
crypto = i.getInstance(CryptoComponent.class);
|
||||
serial = i.getInstance(SerialComponent.class);
|
||||
groupFactory = i.getInstance(GroupFactory.class);
|
||||
authorFactory = i.getInstance(AuthorFactory.class);
|
||||
messageFactory = i.getInstance(MessageFactory.class);
|
||||
packetFactory = i.getInstance(PacketFactory.class);
|
||||
protocolWriterFactory = i.getInstance(ProtocolWriterFactory.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -83,25 +84,18 @@ public class ConstantsTest extends TestCase {
|
||||
private void testBatchesFitIntoAck(int length) throws Exception {
|
||||
// Create an ack with as many batch IDs as possible
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(length);
|
||||
AckWriter a = new AckWriterImpl(out, serial, writerFactory);
|
||||
a.setMaxPacketLength(length);
|
||||
while(a.writeBatchId(new BatchId(TestUtils.getRandomId())));
|
||||
a.finish();
|
||||
ProtocolWriter writer = protocolWriterFactory.createProtocolWriter(out);
|
||||
int maxBatches = writer.getMaxBatchesForAck(length);
|
||||
Collection<BatchId> acked = new ArrayList<BatchId>();
|
||||
for(int i = 0; i < maxBatches; i++) {
|
||||
acked.add(new BatchId(TestUtils.getRandomId()));
|
||||
}
|
||||
Ack a = packetFactory.createAck(acked);
|
||||
writer.writeAck(a);
|
||||
// Check the size of the serialised ack
|
||||
assertTrue(out.size() <= length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyAck() throws Exception {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
AckWriter a = new AckWriterImpl(out, serial, writerFactory);
|
||||
// There's not enough room for a batch ID
|
||||
a.setMaxPacketLength(4);
|
||||
assertFalse(a.writeBatchId(new BatchId(TestUtils.getRandomId())));
|
||||
// Check that nothing was written
|
||||
assertEquals(0, out.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageFitsIntoBatch() throws Exception {
|
||||
// Create a maximum-length group
|
||||
@@ -122,10 +116,10 @@ public class ConstantsTest extends TestCase {
|
||||
// Add the message to a batch
|
||||
ByteArrayOutputStream out =
|
||||
new ByteArrayOutputStream(MAX_PACKET_LENGTH);
|
||||
BatchWriter b = new BatchWriterImpl(out, serial, writerFactory,
|
||||
crypto.getMessageDigest());
|
||||
assertTrue(b.writeMessage(message.getSerialised()));
|
||||
b.finish();
|
||||
ProtocolWriter writer = protocolWriterFactory.createProtocolWriter(out);
|
||||
RawBatch b = packetFactory.createBatch(Collections.singletonList(
|
||||
message.getSerialised()));
|
||||
writer.writeBatch(b);
|
||||
// Check the size of the serialised batch
|
||||
assertTrue(out.size() > UniqueId.LENGTH + MAX_GROUP_NAME_LENGTH
|
||||
+ MAX_PUBLIC_KEY_LENGTH + MAX_AUTHOR_NAME_LENGTH
|
||||
@@ -133,18 +127,6 @@ public class ConstantsTest extends TestCase {
|
||||
assertTrue(out.size() <= MAX_PACKET_LENGTH);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyBatch() throws Exception {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
BatchWriter b = new BatchWriterImpl(out, serial, writerFactory,
|
||||
crypto.getMessageDigest());
|
||||
// There's not enough room for a message
|
||||
b.setMaxPacketLength(4);
|
||||
assertFalse(b.writeMessage(new byte[4]));
|
||||
// Check that nothing was written
|
||||
assertEquals(0, out.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessagesFitIntoLargeOffer() throws Exception {
|
||||
testMessagesFitIntoOffer(MAX_PACKET_LENGTH);
|
||||
@@ -158,25 +140,18 @@ public class ConstantsTest extends TestCase {
|
||||
private void testMessagesFitIntoOffer(int length) throws Exception {
|
||||
// Create an offer with as many message IDs as possible
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(length);
|
||||
OfferWriter o = new OfferWriterImpl(out, serial, writerFactory);
|
||||
o.setMaxPacketLength(length);
|
||||
while(o.writeMessageId(new MessageId(TestUtils.getRandomId())));
|
||||
o.finish();
|
||||
ProtocolWriter writer = protocolWriterFactory.createProtocolWriter(out);
|
||||
int maxMessages = writer.getMaxMessagesForOffer(length);
|
||||
Collection<MessageId> offered = new ArrayList<MessageId>();
|
||||
for(int i = 0; i < maxMessages; i++) {
|
||||
offered.add(new MessageId(TestUtils.getRandomId()));
|
||||
}
|
||||
Offer o = packetFactory.createOffer(offered);
|
||||
writer.writeOffer(o);
|
||||
// Check the size of the serialised offer
|
||||
assertTrue(out.size() <= length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyOffer() throws Exception {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
OfferWriter o = new OfferWriterImpl(out, serial, writerFactory);
|
||||
// There's not enough room for a message ID
|
||||
o.setMaxPacketLength(4);
|
||||
assertFalse(o.writeMessageId(new MessageId(TestUtils.getRandomId())));
|
||||
// Check that nothing was written
|
||||
assertEquals(0, out.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSubscriptionsFitIntoUpdate() throws Exception {
|
||||
// Create the maximum number of maximum-length subscriptions
|
||||
@@ -190,9 +165,10 @@ public class ConstantsTest extends TestCase {
|
||||
// Add the subscriptions to an update
|
||||
ByteArrayOutputStream out =
|
||||
new ByteArrayOutputStream(MAX_PACKET_LENGTH);
|
||||
SubscriptionUpdateWriter s =
|
||||
new SubscriptionUpdateWriterImpl(out, writerFactory);
|
||||
s.writeSubscriptions(subs, Long.MAX_VALUE);
|
||||
ProtocolWriter writer = protocolWriterFactory.createProtocolWriter(out);
|
||||
SubscriptionUpdate s = packetFactory.createSubscriptionUpdate(subs,
|
||||
Long.MAX_VALUE);
|
||||
writer.writeSubscriptionUpdate(s);
|
||||
// Check the size of the serialised update
|
||||
assertTrue(out.size() > MAX_GROUPS *
|
||||
(MAX_GROUP_NAME_LENGTH + MAX_PUBLIC_KEY_LENGTH + 8) + 8);
|
||||
@@ -218,9 +194,10 @@ public class ConstantsTest extends TestCase {
|
||||
// Add the transports to an update
|
||||
ByteArrayOutputStream out =
|
||||
new ByteArrayOutputStream(MAX_PACKET_LENGTH);
|
||||
TransportUpdateWriter t =
|
||||
new TransportUpdateWriterImpl(out, writerFactory);
|
||||
t.writeTransports(transports, Long.MAX_VALUE);
|
||||
ProtocolWriter writer = protocolWriterFactory.createProtocolWriter(out);
|
||||
TransportUpdate t = packetFactory.createTransportUpdate(transports,
|
||||
Long.MAX_VALUE);
|
||||
writer.writeTransportUpdate(t);
|
||||
// Check the size of the serialised update
|
||||
assertTrue(out.size() > MAX_TRANSPORTS * (UniqueId.LENGTH + 4
|
||||
+ (MAX_PROPERTIES_PER_TRANSPORT * MAX_PROPERTY_LENGTH * 2))
|
||||
@@ -17,23 +17,19 @@ import net.sf.briar.api.protocol.GroupFactory;
|
||||
import net.sf.briar.api.protocol.Message;
|
||||
import net.sf.briar.api.protocol.MessageFactory;
|
||||
import net.sf.briar.api.protocol.Offer;
|
||||
import net.sf.briar.api.protocol.PacketFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolReader;
|
||||
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolWriter;
|
||||
import net.sf.briar.api.protocol.ProtocolWriterFactory;
|
||||
import net.sf.briar.api.protocol.RawBatch;
|
||||
import net.sf.briar.api.protocol.Request;
|
||||
import net.sf.briar.api.protocol.SubscriptionUpdate;
|
||||
import net.sf.briar.api.protocol.Transport;
|
||||
import net.sf.briar.api.protocol.TransportId;
|
||||
import net.sf.briar.api.protocol.TransportIndex;
|
||||
import net.sf.briar.api.protocol.TransportUpdate;
|
||||
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||
import net.sf.briar.api.protocol.writers.OfferWriter;
|
||||
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
|
||||
import net.sf.briar.api.protocol.writers.RequestWriter;
|
||||
import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
|
||||
import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
|
||||
import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.protocol.writers.ProtocolWritersModule;
|
||||
import net.sf.briar.serial.SerialModule;
|
||||
|
||||
import org.junit.Test;
|
||||
@@ -45,6 +41,7 @@ public class ProtocolReadWriteTest extends TestCase {
|
||||
|
||||
private final ProtocolReaderFactory readerFactory;
|
||||
private final ProtocolWriterFactory writerFactory;
|
||||
private final PacketFactory packetFactory;
|
||||
private final BatchId batchId;
|
||||
private final Group group;
|
||||
private final Message message;
|
||||
@@ -58,10 +55,10 @@ public class ProtocolReadWriteTest extends TestCase {
|
||||
public ProtocolReadWriteTest() throws Exception {
|
||||
super();
|
||||
Injector i = Guice.createInjector(new CryptoModule(),
|
||||
new ProtocolModule(), new ProtocolWritersModule(),
|
||||
new SerialModule());
|
||||
new ProtocolModule(), new SerialModule());
|
||||
readerFactory = i.getInstance(ProtocolReaderFactory.class);
|
||||
writerFactory = i.getInstance(ProtocolWriterFactory.class);
|
||||
packetFactory = i.getInstance(PacketFactory.class);
|
||||
batchId = new BatchId(TestUtils.getRandomId());
|
||||
GroupFactory groupFactory = i.getInstance(GroupFactory.class);
|
||||
group = groupFactory.createGroup("Unrestricted group", null);
|
||||
@@ -83,53 +80,54 @@ public class ProtocolReadWriteTest extends TestCase {
|
||||
public void testWriteAndRead() throws Exception {
|
||||
// Write
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
ProtocolWriter writer = writerFactory.createProtocolWriter(out);
|
||||
|
||||
AckWriter a = writerFactory.createAckWriter(out);
|
||||
a.writeBatchId(batchId);
|
||||
a.finish();
|
||||
Ack a = packetFactory.createAck(Collections.singletonList(batchId));
|
||||
writer.writeAck(a);
|
||||
|
||||
BatchWriter b = writerFactory.createBatchWriter(out);
|
||||
b.writeMessage(message.getSerialised());
|
||||
b.finish();
|
||||
RawBatch b = packetFactory.createBatch(Collections.singletonList(
|
||||
message.getSerialised()));
|
||||
writer.writeBatch(b);
|
||||
|
||||
OfferWriter o = writerFactory.createOfferWriter(out);
|
||||
o.writeMessageId(message.getId());
|
||||
o.finish();
|
||||
Offer o = packetFactory.createOffer(Collections.singletonList(
|
||||
message.getId()));
|
||||
writer.writeOffer(o);
|
||||
|
||||
RequestWriter r = writerFactory.createRequestWriter(out);
|
||||
r.writeRequest(bitSet, 10);
|
||||
Request r = packetFactory.createRequest(bitSet, 10);
|
||||
writer.writeRequest(r);
|
||||
|
||||
SubscriptionUpdateWriter s =
|
||||
writerFactory.createSubscriptionUpdateWriter(out);
|
||||
s.writeSubscriptions(subscriptions, timestamp);
|
||||
SubscriptionUpdate s = packetFactory.createSubscriptionUpdate(
|
||||
subscriptions, timestamp);
|
||||
writer.writeSubscriptionUpdate(s);
|
||||
|
||||
TransportUpdateWriter t =
|
||||
writerFactory.createTransportUpdateWriter(out);
|
||||
t.writeTransports(transports, timestamp);
|
||||
TransportUpdate t = packetFactory.createTransportUpdate(transports,
|
||||
timestamp);
|
||||
writer.writeTransportUpdate(t);
|
||||
|
||||
// Read
|
||||
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
|
||||
ProtocolReader reader = readerFactory.createProtocolReader(in);
|
||||
|
||||
Ack ack = reader.readAck();
|
||||
assertEquals(Collections.singletonList(batchId), ack.getBatchIds());
|
||||
a = reader.readAck();
|
||||
assertEquals(Collections.singletonList(batchId), a.getBatchIds());
|
||||
|
||||
Batch batch = reader.readBatch().verify();
|
||||
assertEquals(Collections.singletonList(message), batch.getMessages());
|
||||
Batch b1 = reader.readBatch().verify();
|
||||
assertEquals(Collections.singletonList(message), b1.getMessages());
|
||||
|
||||
Offer offer = reader.readOffer();
|
||||
o = reader.readOffer();
|
||||
assertEquals(Collections.singletonList(message.getId()),
|
||||
offer.getMessageIds());
|
||||
o.getMessageIds());
|
||||
|
||||
Request request = reader.readRequest();
|
||||
assertEquals(bitSet, request.getBitmap());
|
||||
r = reader.readRequest();
|
||||
assertEquals(bitSet, r.getBitmap());
|
||||
assertEquals(10, r.getLength());
|
||||
|
||||
SubscriptionUpdate subscriptionUpdate = reader.readSubscriptionUpdate();
|
||||
assertEquals(subscriptions, subscriptionUpdate.getSubscriptions());
|
||||
assertTrue(subscriptionUpdate.getTimestamp() == timestamp);
|
||||
s = reader.readSubscriptionUpdate();
|
||||
assertEquals(subscriptions, s.getSubscriptions());
|
||||
assertEquals(timestamp, s.getTimestamp());
|
||||
|
||||
TransportUpdate transportUpdate = reader.readTransportUpdate();
|
||||
assertEquals(transports, transportUpdate.getTransports());
|
||||
assertTrue(transportUpdate.getTimestamp() == timestamp);
|
||||
t = reader.readTransportUpdate();
|
||||
assertEquals(transports, t.getTransports());
|
||||
assertEquals(timestamp, t.getTimestamp());
|
||||
}
|
||||
}
|
||||
|
||||
83
test/net/sf/briar/protocol/ProtocolWriterImplTest.java
Normal file
83
test/net/sf/briar/protocol/ProtocolWriterImplTest.java
Normal file
@@ -0,0 +1,83 @@
|
||||
package net.sf.briar.protocol;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.BitSet;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import net.sf.briar.api.protocol.PacketFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolWriter;
|
||||
import net.sf.briar.api.protocol.Request;
|
||||
import net.sf.briar.api.serial.SerialComponent;
|
||||
import net.sf.briar.api.serial.WriterFactory;
|
||||
import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.serial.SerialModule;
|
||||
import net.sf.briar.util.StringUtils;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
|
||||
public class ProtocolWriterImplTest extends TestCase {
|
||||
|
||||
private final PacketFactory packetFactory;
|
||||
private final SerialComponent serial;
|
||||
private final WriterFactory writerFactory;
|
||||
|
||||
public ProtocolWriterImplTest() {
|
||||
super();
|
||||
Injector i = Guice.createInjector(new CryptoModule(),
|
||||
new ProtocolModule(), new SerialModule());
|
||||
packetFactory = i.getInstance(PacketFactory.class);
|
||||
serial = i.getInstance(SerialComponent.class);
|
||||
writerFactory = i.getInstance(WriterFactory.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteBitmapNoPadding() throws IOException {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
ProtocolWriter w = new ProtocolWriterImpl(serial, writerFactory, out);
|
||||
BitSet b = new BitSet();
|
||||
// 11011001 = 0xD9
|
||||
b.set(0);
|
||||
b.set(1);
|
||||
b.set(3);
|
||||
b.set(4);
|
||||
b.set(7);
|
||||
// 01011001 = 0x59
|
||||
b.set(9);
|
||||
b.set(11);
|
||||
b.set(12);
|
||||
b.set(15);
|
||||
Request r = packetFactory.createRequest(b, 16);
|
||||
w.writeRequest(r);
|
||||
// Short user tag 8, 0 as uint7, short bytes with length 2, 0xD959
|
||||
byte[] output = out.toByteArray();
|
||||
assertEquals("C8" + "00" + "92" + "D959",
|
||||
StringUtils.toHexString(output));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteBitmapWithPadding() throws IOException {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
ProtocolWriter w = new ProtocolWriterImpl(serial, writerFactory, out);
|
||||
BitSet b = new BitSet();
|
||||
// 01011001 = 0x59
|
||||
b.set(1);
|
||||
b.set(3);
|
||||
b.set(4);
|
||||
b.set(7);
|
||||
// 11011xxx = 0xD8, after padding
|
||||
b.set(8);
|
||||
b.set(9);
|
||||
b.set(11);
|
||||
b.set(12);
|
||||
Request r = packetFactory.createRequest(b, 13);
|
||||
w.writeRequest(r);
|
||||
// Short user tag 8, 3 as uint7, short bytes with length 2, 0x59D8
|
||||
byte[] output = out.toByteArray();
|
||||
assertEquals("C8" + "03" + "92" + "59D8",
|
||||
StringUtils.toHexString(output));
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import java.util.BitSet;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import net.sf.briar.api.FormatException;
|
||||
import net.sf.briar.api.protocol.PacketFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolConstants;
|
||||
import net.sf.briar.api.protocol.Request;
|
||||
import net.sf.briar.api.protocol.Types;
|
||||
@@ -13,6 +14,7 @@ import net.sf.briar.api.serial.Reader;
|
||||
import net.sf.briar.api.serial.ReaderFactory;
|
||||
import net.sf.briar.api.serial.Writer;
|
||||
import net.sf.briar.api.serial.WriterFactory;
|
||||
import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.serial.SerialModule;
|
||||
|
||||
import org.jmock.Expectations;
|
||||
@@ -26,20 +28,23 @@ public class RequestReaderTest extends TestCase {
|
||||
|
||||
private final ReaderFactory readerFactory;
|
||||
private final WriterFactory writerFactory;
|
||||
private final PacketFactory packetFactory;
|
||||
private final Mockery context;
|
||||
|
||||
public RequestReaderTest() throws Exception {
|
||||
super();
|
||||
Injector i = Guice.createInjector(new SerialModule());
|
||||
Injector i = Guice.createInjector(new CryptoModule(),
|
||||
new ProtocolModule(), new SerialModule());
|
||||
readerFactory = i.getInstance(ReaderFactory.class);
|
||||
writerFactory = i.getInstance(WriterFactory.class);
|
||||
packetFactory = i.getInstance(PacketFactory.class);
|
||||
context = new Mockery();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFormatExceptionIfRequestIsTooLarge() throws Exception {
|
||||
RequestFactory requestFactory = context.mock(RequestFactory.class);
|
||||
RequestReader requestReader = new RequestReader(requestFactory);
|
||||
PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
RequestReader requestReader = new RequestReader(packetFactory);
|
||||
|
||||
byte[] b = createRequest(true);
|
||||
ByteArrayInputStream in = new ByteArrayInputStream(b);
|
||||
@@ -55,12 +60,12 @@ public class RequestReaderTest extends TestCase {
|
||||
|
||||
@Test
|
||||
public void testNoFormatExceptionIfRequestIsMaximumSize() throws Exception {
|
||||
final RequestFactory requestFactory =
|
||||
context.mock(RequestFactory.class);
|
||||
RequestReader requestReader = new RequestReader(requestFactory);
|
||||
final PacketFactory packetFactory = context.mock(PacketFactory.class);
|
||||
RequestReader requestReader = new RequestReader(packetFactory);
|
||||
final Request request = context.mock(Request.class);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(requestFactory).createRequest(with(any(BitSet.class)));
|
||||
oneOf(packetFactory).createRequest(with(any(BitSet.class)),
|
||||
with(any(int.class)));
|
||||
will(returnValue(request));
|
||||
}});
|
||||
|
||||
@@ -96,8 +101,7 @@ public class RequestReaderTest extends TestCase {
|
||||
// Deserialise the request
|
||||
ByteArrayInputStream in = new ByteArrayInputStream(b);
|
||||
Reader reader = readerFactory.createReader(in);
|
||||
RequestReader requestReader =
|
||||
new RequestReader(new RequestFactoryImpl());
|
||||
RequestReader requestReader = new RequestReader(packetFactory);
|
||||
reader.addObjectReader(Types.REQUEST, requestReader);
|
||||
Request r = reader.readStruct(Types.REQUEST, Request.class);
|
||||
BitSet decoded = r.getBitmap();
|
||||
@@ -116,10 +120,13 @@ public class RequestReaderTest extends TestCase {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
Writer w = writerFactory.createWriter(out);
|
||||
w.writeStructId(Types.REQUEST);
|
||||
// Allow one byte for the REQUEST tag, one byte for the BYTES tag,
|
||||
// and five bytes for the length as an int32
|
||||
int size = ProtocolConstants.MAX_PACKET_LENGTH - 7;
|
||||
// Allow one byte for the REQUEST tag, one byte for the padding length
|
||||
// as a uint7, one byte for the BYTES tag, and five bytes for the
|
||||
// length of the byte array as an int32
|
||||
int size = ProtocolConstants.MAX_PACKET_LENGTH - 8;
|
||||
if(tooBig) size++;
|
||||
assertTrue(size > Short.MAX_VALUE);
|
||||
w.writeUint7((byte) 0);
|
||||
w.writeBytes(new byte[size]);
|
||||
assertEquals(tooBig, out.size() > ProtocolConstants.MAX_PACKET_LENGTH);
|
||||
return out.toByteArray();
|
||||
@@ -129,6 +136,7 @@ public class RequestReaderTest extends TestCase {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
Writer w = writerFactory.createWriter(out);
|
||||
w.writeStructId(Types.REQUEST);
|
||||
w.writeUint7((byte) 0);
|
||||
w.writeBytes(bitmap);
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
package net.sf.briar.protocol.writers;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.BitSet;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import net.sf.briar.api.protocol.writers.RequestWriter;
|
||||
import net.sf.briar.api.serial.WriterFactory;
|
||||
import net.sf.briar.serial.SerialModule;
|
||||
import net.sf.briar.util.StringUtils;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
|
||||
public class RequestWriterImplTest extends TestCase {
|
||||
|
||||
private final WriterFactory writerFactory;
|
||||
|
||||
public RequestWriterImplTest() {
|
||||
super();
|
||||
Injector i = Guice.createInjector(new SerialModule());
|
||||
writerFactory = i.getInstance(WriterFactory.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteBitmapNoPadding() throws IOException {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
RequestWriter r = new RequestWriterImpl(out, writerFactory);
|
||||
BitSet b = new BitSet();
|
||||
// 11011001 = 0xD9
|
||||
b.set(0);
|
||||
b.set(1);
|
||||
b.set(3);
|
||||
b.set(4);
|
||||
b.set(7);
|
||||
// 01011001 = 0x59
|
||||
b.set(9);
|
||||
b.set(11);
|
||||
b.set(12);
|
||||
b.set(15);
|
||||
r.writeRequest(b, 16);
|
||||
// Short user tag 8, short bytes with length 2, 0xD959
|
||||
byte[] output = out.toByteArray();
|
||||
assertEquals("C8" + "92" + "D959", StringUtils.toHexString(output));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteBitmapWithPadding() throws IOException {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
RequestWriter r = new RequestWriterImpl(out, writerFactory);
|
||||
BitSet b = new BitSet();
|
||||
// 01011001 = 0x59
|
||||
b.set(1);
|
||||
b.set(3);
|
||||
b.set(4);
|
||||
b.set(7);
|
||||
// 11011xxx = 0xD8, after padding
|
||||
b.set(8);
|
||||
b.set(9);
|
||||
b.set(11);
|
||||
b.set(12);
|
||||
r.writeRequest(b, 13);
|
||||
// Short user tag 8, short bytes with length 2, 0x59D8
|
||||
byte[] output = out.toByteArray();
|
||||
assertEquals("C8" + "92" + "59D8", StringUtils.toHexString(output));
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,6 @@ import net.sf.briar.crypto.CryptoModule;
|
||||
import net.sf.briar.db.DatabaseModule;
|
||||
import net.sf.briar.lifecycle.LifecycleModule;
|
||||
import net.sf.briar.protocol.ProtocolModule;
|
||||
import net.sf.briar.protocol.writers.ProtocolWritersModule;
|
||||
import net.sf.briar.serial.SerialModule;
|
||||
import net.sf.briar.transport.batch.TransportBatchModule;
|
||||
import net.sf.briar.transport.stream.TransportStreamModule;
|
||||
@@ -44,10 +43,9 @@ public class ConnectionWriterTest extends TestCase {
|
||||
};
|
||||
Injector i = Guice.createInjector(testModule, new CryptoModule(),
|
||||
new DatabaseModule(), new LifecycleModule(),
|
||||
new ProtocolModule(), new ProtocolWritersModule(),
|
||||
new SerialModule(), new TestDatabaseModule(),
|
||||
new TransportBatchModule(), new TransportModule(),
|
||||
new TransportStreamModule());
|
||||
new ProtocolModule(), new SerialModule(),
|
||||
new TestDatabaseModule(), new TransportBatchModule(),
|
||||
new TransportModule(), new TransportStreamModule());
|
||||
connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);
|
||||
secret = new byte[32];
|
||||
new Random().nextBytes(secret);
|
||||
|
||||
@@ -26,11 +26,11 @@ import net.sf.briar.api.db.event.MessagesAddedEvent;
|
||||
import net.sf.briar.api.protocol.Message;
|
||||
import net.sf.briar.api.protocol.MessageFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
||||
import net.sf.briar.api.protocol.ProtocolWriterFactory;
|
||||
import net.sf.briar.api.protocol.Transport;
|
||||
import net.sf.briar.api.protocol.TransportId;
|
||||
import net.sf.briar.api.protocol.TransportIndex;
|
||||
import net.sf.briar.api.protocol.TransportUpdate;
|
||||
import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
|
||||
import net.sf.briar.api.transport.BatchTransportReader;
|
||||
import net.sf.briar.api.transport.BatchTransportWriter;
|
||||
import net.sf.briar.api.transport.ConnectionContext;
|
||||
@@ -43,7 +43,6 @@ import net.sf.briar.db.DatabaseModule;
|
||||
import net.sf.briar.lifecycle.LifecycleModule;
|
||||
import net.sf.briar.plugins.ImmediateExecutor;
|
||||
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 net.sf.briar.transport.stream.TransportStreamModule;
|
||||
@@ -97,10 +96,9 @@ public class BatchConnectionReadWriteTest extends TestCase {
|
||||
};
|
||||
return Guice.createInjector(testModule, new CryptoModule(),
|
||||
new DatabaseModule(), new LifecycleModule(),
|
||||
new ProtocolModule(), new ProtocolWritersModule(),
|
||||
new SerialModule(), new TestDatabaseModule(dir),
|
||||
new TransportBatchModule(), new TransportModule(),
|
||||
new TransportStreamModule());
|
||||
new ProtocolModule(), new SerialModule(),
|
||||
new TestDatabaseModule(dir), new TransportBatchModule(),
|
||||
new TransportModule(), new TransportStreamModule());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -132,10 +130,10 @@ public class BatchConnectionReadWriteTest extends TestCase {
|
||||
alice.getInstance(ConnectionWriterFactory.class);
|
||||
ProtocolWriterFactory protoFactory =
|
||||
alice.getInstance(ProtocolWriterFactory.class);
|
||||
BatchTransportWriter writer = new TestBatchTransportWriter(out);
|
||||
OutgoingBatchConnection batchOut = new OutgoingBatchConnection(
|
||||
connFactory, db, protoFactory, contactId, transportIndex,
|
||||
writer);
|
||||
BatchTransportWriter transport = new TestBatchTransportWriter(out);
|
||||
OutgoingBatchConnection batchOut = new OutgoingBatchConnection(db,
|
||||
connFactory, protoFactory, contactId, transportIndex,
|
||||
transport);
|
||||
// Write whatever needs to be written
|
||||
batchOut.write();
|
||||
// Close Alice's database
|
||||
@@ -188,7 +186,7 @@ public class BatchConnectionReadWriteTest extends TestCase {
|
||||
bob.getInstance(ProtocolReaderFactory.class);
|
||||
BatchTransportReader reader = new TestBatchTransportReader(in);
|
||||
IncomingBatchConnection batchIn = new IncomingBatchConnection(
|
||||
new ImmediateExecutor(), connFactory, db, protoFactory, ctx,
|
||||
new ImmediateExecutor(), db, connFactory, protoFactory, ctx,
|
||||
reader, tag);
|
||||
// No messages should have been added yet
|
||||
assertFalse(listener.messagesAdded);
|
||||
|
||||
Reference in New Issue
Block a user