diff --git a/components/net/sf/briar/db/JdbcDatabase.java b/components/net/sf/briar/db/JdbcDatabase.java index 07b244a77cc745d7c32ea4acab57696643e278c0..16799e6bc3093e0d77f09331bedc724ab606da4a 100644 --- a/components/net/sf/briar/db/JdbcDatabase.java +++ b/components/net/sf/briar/db/JdbcDatabase.java @@ -1113,7 +1113,8 @@ abstract class JdbcDatabase implements Database<Connection> { Collection<MessageHeader> headers = new ArrayList<MessageHeader>(); while(rs.next()) { MessageId id = new MessageId(rs.getBytes(1)); - MessageId parent = new MessageId(rs.getBytes(2)); + byte[] p = rs.getBytes(2); + MessageId parent = p == null ? null : new MessageId(p); AuthorId author = new AuthorId(rs.getBytes(3)); String subject = rs.getString(4); long timestamp = rs.getLong(5); diff --git a/test/net/sf/briar/db/H2DatabaseTest.java b/test/net/sf/briar/db/H2DatabaseTest.java index 29792f445181bacd492c7e02ac54e4dc0e161220..edc59a800e2d42f7d4621c2691107e03ec2829f2 100644 --- a/test/net/sf/briar/db/H2DatabaseTest.java +++ b/test/net/sf/briar/db/H2DatabaseTest.java @@ -33,6 +33,7 @@ import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.GroupId; import net.sf.briar.api.protocol.Message; +import net.sf.briar.api.protocol.MessageHeader; import net.sf.briar.api.protocol.MessageHeaderFactory; import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.transport.ConnectionWindow; @@ -1650,6 +1651,72 @@ public class H2DatabaseTest extends TestCase { db.close(); } + @Test + public void testGetMessageHeaders() throws Exception { + Database<Connection> db = open(false); + Connection txn = db.startTransaction(); + + // Subscribe to a group + db.addSubscription(txn, group); + + // Store a couple of messages + db.addGroupMessage(txn, message); + MessageId messageId1 = new MessageId(TestUtils.getRandomId()); + MessageId parentId = new MessageId(TestUtils.getRandomId()); + long timestamp1 = System.currentTimeMillis(); + Message message1 = new TestMessage(messageId1, parentId, groupId, + authorId, subject, timestamp1, raw); + db.addGroupMessage(txn, message1); + + // Retrieve the message headers + Collection<MessageHeader> headers = db.getMessageHeaders(txn, groupId); + Iterator<MessageHeader> it = headers.iterator(); + boolean messageFound = false, message1Found = false; + // First header (order is undefined) + assertTrue(it.hasNext()); + MessageHeader header = it.next(); + if(messageId.equals(header.getId())) { + assertHeadersAreEqual(message, header); + messageFound = true; + } else if(messageId1.equals(header.getId())) { + assertHeadersAreEqual(message1, header); + message1Found = true; + } else { + fail(); + } + // Second header + assertTrue(it.hasNext()); + header = it.next(); + if(messageId.equals(header.getId())) { + assertHeadersAreEqual(message, header); + messageFound = true; + } else if(messageId1.equals(header.getId())) { + assertHeadersAreEqual(message1, header); + message1Found = true; + } else { + fail(); + } + // No more headers + assertFalse(it.hasNext()); + assertTrue(messageFound); + assertTrue(message1Found); + + db.commitTransaction(txn); + db.close(); + } + + private void assertHeadersAreEqual(MessageHeader h1, MessageHeader h2) { + assertEquals(h1.getId(), h2.getId()); + if(h1.getParent() == null) assertNull(h2.getParent()); + else assertEquals(h1.getParent(), h2.getParent()); + if(h1.getGroup() == null) assertNull(h2.getGroup()); + else assertEquals(h1.getGroup(), h2.getGroup()); + if(h1.getAuthor() == null) assertNull(h2.getAuthor()); + else assertEquals(h1.getAuthor(), h2.getAuthor()); + assertEquals(h1.getSubject(), h2.getSubject()); + assertEquals(h1.getTimestamp(), h2.getTimestamp()); + } + @Test public void testExceptionHandling() throws Exception { Database<Connection> db = open(false);