Remove client ID from validator's DB methods.

This commit is contained in:
akwizgran
2018-03-09 12:28:48 +00:00
parent 85cc23444c
commit 5fe68e6f82
8 changed files with 82 additions and 94 deletions

View File

@@ -259,31 +259,30 @@ public interface DatabaseComponent {
Collection<LocalAuthor> getLocalAuthors(Transaction txn) throws DbException; Collection<LocalAuthor> getLocalAuthors(Transaction txn) throws DbException;
/** /**
* Returns the IDs of any messages that need to be validated by the given * Returns the IDs of any messages that need to be validated.
* client.
* <p/> * <p/>
* Read-only. * Read-only.
*/ */
Collection<MessageId> getMessagesToValidate(Transaction txn, ClientId c) Collection<MessageId> getMessagesToValidate(Transaction txn)
throws DbException; throws DbException;
/** /**
* Returns the IDs of any messages that are valid but pending delivery due * Returns the IDs of any messages that are pending delivery due to
* to dependencies on other messages for the given client. * dependencies on other messages.
* <p/> * <p/>
* Read-only. * Read-only.
*/ */
Collection<MessageId> getPendingMessages(Transaction txn, ClientId c) Collection<MessageId> getPendingMessages(Transaction txn)
throws DbException; throws DbException;
/** /**
* Returns the IDs of any messages from the given client * Returns the IDs of any messages that have shared dependents but have
* that have a shared dependent, but are still not shared themselves. * not yet been shared themselves.
* <p/> * <p/>
* Read-only. * Read-only.
*/ */
Collection<MessageId> getMessagesToShare(Transaction txn, Collection<MessageId> getMessagesToShare(Transaction txn)
ClientId c) throws DbException; throws DbException;
/** /**
* Returns the message with the given ID, in serialised form, or null if * Returns the message with the given ID, in serialised form, or null if

View File

@@ -424,31 +424,27 @@ interface Database<T> {
throws DbException; throws DbException;
/** /**
* Returns the IDs of any messages that need to be validated by the given * Returns the IDs of any messages that need to be validated.
* client.
* <p/> * <p/>
* Read-only. * Read-only.
*/ */
Collection<MessageId> getMessagesToValidate(T txn, ClientId c) Collection<MessageId> getMessagesToValidate(T txn) throws DbException;
throws DbException;
/** /**
* Returns the IDs of any messages that are still pending due to * Returns the IDs of any messages that are pending delivery due to
* dependencies to other messages for the given client. * dependencies on other messages.
* <p/> * <p/>
* Read-only. * Read-only.
*/ */
Collection<MessageId> getPendingMessages(T txn, ClientId c) Collection<MessageId> getPendingMessages(T txn) throws DbException;
throws DbException;
/** /**
* Returns the IDs of any messages from the given client * Returns the IDs of any messages that have a shared dependent but have
* that have a shared dependent, but are still not shared themselves. * not yet been shared themselves.
* <p/> * <p/>
* Read-only. * Read-only.
*/ */
Collection<MessageId> getMessagesToShare(T txn, ClientId c) Collection<MessageId> getMessagesToShare(T txn) throws DbException;
throws DbException;
/** /**
* Returns the next time (in milliseconds since the Unix epoch) when a * Returns the next time (in milliseconds since the Unix epoch) when a

View File

@@ -455,24 +455,24 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
} }
@Override @Override
public Collection<MessageId> getMessagesToValidate(Transaction transaction, public Collection<MessageId> getMessagesToValidate(Transaction transaction)
ClientId c) throws DbException { throws DbException {
T txn = unbox(transaction); T txn = unbox(transaction);
return db.getMessagesToValidate(txn, c); return db.getMessagesToValidate(txn);
} }
@Override @Override
public Collection<MessageId> getPendingMessages(Transaction transaction, public Collection<MessageId> getPendingMessages(Transaction transaction)
ClientId c) throws DbException { throws DbException {
T txn = unbox(transaction); T txn = unbox(transaction);
return db.getPendingMessages(txn, c); return db.getPendingMessages(txn);
} }
@Override @Override
public Collection<MessageId> getMessagesToShare( public Collection<MessageId> getMessagesToShare(Transaction transaction)
Transaction transaction, ClientId c) throws DbException { throws DbException {
T txn = unbox(transaction); T txn = unbox(transaction);
return db.getMessagesToShare(txn, c); return db.getMessagesToShare(txn);
} }
@Nullable @Nullable
@@ -573,7 +573,7 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
@Override @Override
public long getNextSendTime(Transaction transaction, ContactId c) public long getNextSendTime(Transaction transaction, ContactId c)
throws DbException { throws DbException {
T txn = unbox(transaction); T txn = unbox(transaction);
return db.getNextSendTime(txn, c); return db.getNextSendTime(txn, c);
} }

View File

@@ -1868,28 +1868,26 @@ abstract class JdbcDatabase implements Database<Connection> {
} }
@Override @Override
public Collection<MessageId> getMessagesToValidate(Connection txn, public Collection<MessageId> getMessagesToValidate(Connection txn)
ClientId c) throws DbException { throws DbException {
return getMessagesInState(txn, c, UNKNOWN); return getMessagesInState(txn, UNKNOWN);
} }
@Override @Override
public Collection<MessageId> getPendingMessages(Connection txn, public Collection<MessageId> getPendingMessages(Connection txn)
ClientId c) throws DbException { throws DbException {
return getMessagesInState(txn, c, PENDING); return getMessagesInState(txn, PENDING);
} }
private Collection<MessageId> getMessagesInState(Connection txn, ClientId c, private Collection<MessageId> getMessagesInState(Connection txn,
State state) throws DbException { State state) throws DbException {
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
try { try {
String sql = "SELECT messageId FROM messages AS m" String sql = "SELECT messageId FROM messages"
+ " JOIN groups AS g ON m.groupId = g.groupId" + " WHERE state = ? AND raw IS NOT NULL";
+ " WHERE state = ? AND clientId = ? AND raw IS NOT NULL";
ps = txn.prepareStatement(sql); ps = txn.prepareStatement(sql);
ps.setInt(1, state.getValue()); ps.setInt(1, state.getValue());
ps.setString(2, c.getString());
rs = ps.executeQuery(); rs = ps.executeQuery();
List<MessageId> ids = new ArrayList<>(); List<MessageId> ids = new ArrayList<>();
while (rs.next()) ids.add(new MessageId(rs.getBytes(1))); while (rs.next()) ids.add(new MessageId(rs.getBytes(1)));
@@ -1904,7 +1902,7 @@ abstract class JdbcDatabase implements Database<Connection> {
} }
@Override @Override
public Collection<MessageId> getMessagesToShare(Connection txn, ClientId c) public Collection<MessageId> getMessagesToShare(Connection txn)
throws DbException { throws DbException {
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
@@ -1914,12 +1912,10 @@ abstract class JdbcDatabase implements Database<Connection> {
+ " ON m.messageId = d.dependencyId" + " ON m.messageId = d.dependencyId"
+ " JOIN messages AS m1" + " JOIN messages AS m1"
+ " ON d.messageId = m1.messageId" + " ON d.messageId = m1.messageId"
+ " JOIN groups AS g" + " WHERE m.state = ?"
+ " ON m.groupId = g.groupId" + " AND m.shared = FALSE AND m1.shared = TRUE";
+ " WHERE m.shared = FALSE AND m1.shared = TRUE"
+ " AND g.clientId = ?";
ps = txn.prepareStatement(sql); ps = txn.prepareStatement(sql);
ps.setString(1, c.getString()); ps.setInt(1, DELIVERED.getValue());
rs = ps.executeQuery(); rs = ps.executeQuery();
List<MessageId> ids = new ArrayList<>(); List<MessageId> ids = new ArrayList<>();
while (rs.next()) ids.add(new MessageId(rs.getBytes(1))); while (rs.next()) ids.add(new MessageId(rs.getBytes(1)));

View File

@@ -71,11 +71,9 @@ class ValidationManagerImpl implements ValidationManager, Service,
@Override @Override
public void startService() { public void startService() {
if (used.getAndSet(true)) throw new IllegalStateException(); if (used.getAndSet(true)) throw new IllegalStateException();
for (ClientId c : validators.keySet()) { validateOutstandingMessagesAsync();
validateOutstandingMessagesAsync(c); deliverOutstandingMessagesAsync();
deliverOutstandingMessagesAsync(c); shareOutstandingMessagesAsync();
shareOutstandingMessagesAsync(c);
}
} }
@Override @Override
@@ -93,17 +91,17 @@ class ValidationManagerImpl implements ValidationManager, Service,
hooks.put(c, hook); hooks.put(c, hook);
} }
private void validateOutstandingMessagesAsync(ClientId c) { private void validateOutstandingMessagesAsync() {
dbExecutor.execute(() -> validateOutstandingMessages(c)); dbExecutor.execute(this::validateOutstandingMessages);
} }
@DatabaseExecutor @DatabaseExecutor
private void validateOutstandingMessages(ClientId c) { private void validateOutstandingMessages() {
try { try {
Queue<MessageId> unvalidated = new LinkedList<>(); Queue<MessageId> unvalidated = new LinkedList<>();
Transaction txn = db.startTransaction(true); Transaction txn = db.startTransaction(true);
try { try {
unvalidated.addAll(db.getMessagesToValidate(txn, c)); unvalidated.addAll(db.getMessagesToValidate(txn));
db.commitTransaction(txn); db.commitTransaction(txn);
} finally { } finally {
db.endTransaction(txn); db.endTransaction(txn);
@@ -148,17 +146,17 @@ class ValidationManagerImpl implements ValidationManager, Service,
} }
} }
private void deliverOutstandingMessagesAsync(ClientId c) { private void deliverOutstandingMessagesAsync() {
dbExecutor.execute(() -> deliverOutstandingMessages(c)); dbExecutor.execute(this::deliverOutstandingMessages);
} }
@DatabaseExecutor @DatabaseExecutor
private void deliverOutstandingMessages(ClientId c) { private void deliverOutstandingMessages() {
try { try {
Queue<MessageId> pending = new LinkedList<>(); Queue<MessageId> pending = new LinkedList<>();
Transaction txn = db.startTransaction(true); Transaction txn = db.startTransaction(true);
try { try {
pending.addAll(db.getPendingMessages(txn, c)); pending.addAll(db.getPendingMessages(txn));
db.commitTransaction(txn); db.commitTransaction(txn);
} finally { } finally {
db.endTransaction(txn); db.endTransaction(txn);
@@ -353,17 +351,17 @@ class ValidationManagerImpl implements ValidationManager, Service,
return pending; return pending;
} }
private void shareOutstandingMessagesAsync(ClientId c) { private void shareOutstandingMessagesAsync() {
dbExecutor.execute(() -> shareOutstandingMessages(c)); dbExecutor.execute(this::shareOutstandingMessages);
} }
@DatabaseExecutor @DatabaseExecutor
private void shareOutstandingMessages(ClientId c) { private void shareOutstandingMessages() {
try { try {
Queue<MessageId> toShare = new LinkedList<>(); Queue<MessageId> toShare = new LinkedList<>();
Transaction txn = db.startTransaction(true); Transaction txn = db.startTransaction(true);
try { try {
toShare.addAll(db.getMessagesToShare(txn, c)); toShare.addAll(db.getMessagesToShare(txn));
db.commitTransaction(txn); db.commitTransaction(txn);
} finally { } finally {
db.endTransaction(txn); db.endTransaction(txn);

View File

@@ -477,30 +477,30 @@ public abstract class DatabasePerformanceTest extends BrambleTestCase {
@Test @Test
public void testGetMessagesToShare() throws Exception { public void testGetMessagesToShare() throws Exception {
String name = "getMessagesToShare(T, ClientId)"; String name = "getMessagesToShare(T)";
benchmark(name, db -> { benchmark(name, db -> {
Connection txn = db.startTransaction(); Connection txn = db.startTransaction();
db.getMessagesToShare(txn, pickRandom(clientIds)); db.getMessagesToShare(txn);
db.commitTransaction(txn); db.commitTransaction(txn);
}); });
} }
@Test @Test
public void testGetMessagesToValidate() throws Exception { public void testGetMessagesToValidate() throws Exception {
String name = "getMessagesToValidate(T, ClientId)"; String name = "getMessagesToValidate(T)";
benchmark(name, db -> { benchmark(name, db -> {
Connection txn = db.startTransaction(); Connection txn = db.startTransaction();
db.getMessagesToValidate(txn, pickRandom(clientIds)); db.getMessagesToValidate(txn);
db.commitTransaction(txn); db.commitTransaction(txn);
}); });
} }
@Test @Test
public void testGetPendingMessages() throws Exception { public void testGetPendingMessages() throws Exception {
String name = "getPendingMessages(T, ClientId)"; String name = "getPendingMessages(T)";
benchmark(name, db -> { benchmark(name, db -> {
Connection txn = db.startTransaction(); Connection txn = db.startTransaction();
db.getPendingMessages(txn, pickRandom(clientIds)); db.getPendingMessages(txn);
db.commitTransaction(txn); db.commitTransaction(txn);
}); });
} }

View File

@@ -1376,12 +1376,12 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
Collection<MessageId> result; Collection<MessageId> result;
// Retrieve messages to be validated // Retrieve messages to be validated
result = db.getMessagesToValidate(txn, clientId); result = db.getMessagesToValidate(txn);
assertEquals(1, result.size()); assertEquals(1, result.size());
assertTrue(result.contains(mId1)); assertTrue(result.contains(mId1));
// Retrieve pending messages // Retrieve pending messages
result = db.getPendingMessages(txn, clientId); result = db.getPendingMessages(txn);
assertEquals(1, result.size()); assertEquals(1, result.size());
assertTrue(result.contains(mId3)); assertTrue(result.contains(mId3));
@@ -1416,8 +1416,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
db.addMessageDependency(txn, groupId, mId4, mId3); db.addMessageDependency(txn, groupId, mId4, mId3);
// Retrieve messages to be shared // Retrieve messages to be shared
Collection<MessageId> result = Collection<MessageId> result = db.getMessagesToShare(txn);
db.getMessagesToShare(txn, clientId);
assertEquals(2, result.size()); assertEquals(2, result.size());
assertTrue(result.contains(mId2)); assertTrue(result.contains(mId2));
assertTrue(result.contains(mId3)); assertTrue(result.contains(mId3));

View File

@@ -100,21 +100,21 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// validateOutstandingMessages() // validateOutstandingMessages()
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn)); will(returnValue(txn));
oneOf(db).getMessagesToValidate(txn, clientId); oneOf(db).getMessagesToValidate(txn);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn); oneOf(db).commitTransaction(txn);
oneOf(db).endTransaction(txn); oneOf(db).endTransaction(txn);
// deliverOutstandingMessages() // deliverOutstandingMessages()
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn1)); will(returnValue(txn1));
oneOf(db).getPendingMessages(txn1, clientId); oneOf(db).getPendingMessages(txn1);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn1); oneOf(db).commitTransaction(txn1);
oneOf(db).endTransaction(txn1); oneOf(db).endTransaction(txn1);
// shareOutstandingMessages() // shareOutstandingMessages()
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn2)); will(returnValue(txn2));
oneOf(db).getMessagesToShare(txn2, clientId); oneOf(db).getMessagesToShare(txn2);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn2); oneOf(db).commitTransaction(txn2);
oneOf(db).endTransaction(txn2); oneOf(db).endTransaction(txn2);
@@ -138,7 +138,7 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get messages to validate // Get messages to validate
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn)); will(returnValue(txn));
oneOf(db).getMessagesToValidate(txn, clientId); oneOf(db).getMessagesToValidate(txn);
will(returnValue(Arrays.asList(messageId, messageId1))); will(returnValue(Arrays.asList(messageId, messageId1)));
oneOf(db).commitTransaction(txn); oneOf(db).commitTransaction(txn);
oneOf(db).endTransaction(txn); oneOf(db).endTransaction(txn);
@@ -199,14 +199,14 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get pending messages to deliver // Get pending messages to deliver
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn5)); will(returnValue(txn5));
oneOf(db).getPendingMessages(txn5, clientId); oneOf(db).getPendingMessages(txn5);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn5); oneOf(db).commitTransaction(txn5);
oneOf(db).endTransaction(txn5); oneOf(db).endTransaction(txn5);
// Get messages to share // Get messages to share
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn6)); will(returnValue(txn6));
oneOf(db).getMessagesToShare(txn6, clientId); oneOf(db).getMessagesToShare(txn6);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn6); oneOf(db).commitTransaction(txn6);
oneOf(db).endTransaction(txn6); oneOf(db).endTransaction(txn6);
@@ -227,14 +227,14 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get messages to validate // Get messages to validate
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn)); will(returnValue(txn));
oneOf(db).getMessagesToValidate(txn, clientId); oneOf(db).getMessagesToValidate(txn);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn); oneOf(db).commitTransaction(txn);
oneOf(db).endTransaction(txn); oneOf(db).endTransaction(txn);
// Get pending messages to deliver // Get pending messages to deliver
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn1)); will(returnValue(txn1));
oneOf(db).getPendingMessages(txn1, clientId); oneOf(db).getPendingMessages(txn1);
will(returnValue(Collections.singletonList(messageId))); will(returnValue(Collections.singletonList(messageId)));
oneOf(db).commitTransaction(txn1); oneOf(db).commitTransaction(txn1);
oneOf(db).endTransaction(txn1); oneOf(db).endTransaction(txn1);
@@ -292,7 +292,7 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get messages to share // Get messages to share
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn4)); will(returnValue(txn4));
oneOf(db).getMessagesToShare(txn4, clientId); oneOf(db).getMessagesToShare(txn4);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn4); oneOf(db).commitTransaction(txn4);
oneOf(db).endTransaction(txn4); oneOf(db).endTransaction(txn4);
@@ -313,14 +313,14 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// No messages to validate // No messages to validate
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn)); will(returnValue(txn));
oneOf(db).getMessagesToValidate(txn, clientId); oneOf(db).getMessagesToValidate(txn);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn); oneOf(db).commitTransaction(txn);
oneOf(db).endTransaction(txn); oneOf(db).endTransaction(txn);
// No pending messages to deliver // No pending messages to deliver
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn1)); will(returnValue(txn1));
oneOf(db).getPendingMessages(txn1, clientId); oneOf(db).getPendingMessages(txn1);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn1); oneOf(db).commitTransaction(txn1);
oneOf(db).endTransaction(txn1); oneOf(db).endTransaction(txn1);
@@ -328,7 +328,7 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get messages to share // Get messages to share
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn2)); will(returnValue(txn2));
oneOf(db).getMessagesToShare(txn2, clientId); oneOf(db).getMessagesToShare(txn2);
will(returnValue(Collections.singletonList(messageId))); will(returnValue(Collections.singletonList(messageId)));
oneOf(db).commitTransaction(txn2); oneOf(db).commitTransaction(txn2);
oneOf(db).endTransaction(txn2); oneOf(db).endTransaction(txn2);
@@ -416,7 +416,7 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get messages to validate // Get messages to validate
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn)); will(returnValue(txn));
oneOf(db).getMessagesToValidate(txn, clientId); oneOf(db).getMessagesToValidate(txn);
will(returnValue(Arrays.asList(messageId, messageId1))); will(returnValue(Arrays.asList(messageId, messageId1)));
oneOf(db).commitTransaction(txn); oneOf(db).commitTransaction(txn);
oneOf(db).endTransaction(txn); oneOf(db).endTransaction(txn);
@@ -457,14 +457,14 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get pending messages to deliver // Get pending messages to deliver
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn4)); will(returnValue(txn4));
oneOf(db).getPendingMessages(txn4, clientId); oneOf(db).getPendingMessages(txn4);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn4); oneOf(db).commitTransaction(txn4);
oneOf(db).endTransaction(txn4); oneOf(db).endTransaction(txn4);
// Get messages to share // Get messages to share
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn5)); will(returnValue(txn5));
oneOf(db).getMessagesToShare(txn5, clientId); oneOf(db).getMessagesToShare(txn5);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn5); oneOf(db).commitTransaction(txn5);
oneOf(db).endTransaction(txn5); oneOf(db).endTransaction(txn5);
@@ -487,7 +487,7 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get messages to validate // Get messages to validate
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn)); will(returnValue(txn));
oneOf(db).getMessagesToValidate(txn, clientId); oneOf(db).getMessagesToValidate(txn);
will(returnValue(Arrays.asList(messageId, messageId1))); will(returnValue(Arrays.asList(messageId, messageId1)));
oneOf(db).commitTransaction(txn); oneOf(db).commitTransaction(txn);
oneOf(db).endTransaction(txn); oneOf(db).endTransaction(txn);
@@ -533,14 +533,14 @@ public class ValidationManagerImplTest extends BrambleMockTestCase {
// Get pending messages to deliver // Get pending messages to deliver
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn4)); will(returnValue(txn4));
oneOf(db).getPendingMessages(txn4, clientId); oneOf(db).getPendingMessages(txn4);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn4); oneOf(db).commitTransaction(txn4);
oneOf(db).endTransaction(txn4); oneOf(db).endTransaction(txn4);
// Get messages to share // Get messages to share
oneOf(db).startTransaction(true); oneOf(db).startTransaction(true);
will(returnValue(txn5)); will(returnValue(txn5));
oneOf(db).getMessagesToShare(txn5, clientId); oneOf(db).getMessagesToShare(txn5);
will(returnValue(Collections.emptyList())); will(returnValue(Collections.emptyList()));
oneOf(db).commitTransaction(txn5); oneOf(db).commitTransaction(txn5);
oneOf(db).endTransaction(txn5); oneOf(db).endTransaction(txn5);