Skip to content
Snippets Groups Projects
Commit 70cc586c authored by Sebastian's avatar Sebastian
Browse files

When adding test data, hack GroupCount timestamp

Because the MessageTracker in briar initializes the GroupCount timestamp
to the current time when the contact is being added, we cannot have
realistic test data in the database where the GroupCount timestamp
matches that of the last message in the chat history. This is a dirty
workaround to make this possible.
parent 47bce567
No related branches found
No related tags found
No related merge requests found
Pipeline #8384 passed
package org.briarproject.briar.desktop
import org.briarproject.bramble.api.FormatException
import org.briarproject.bramble.api.client.ClientHelper
import org.briarproject.bramble.api.contact.ContactManager
import org.briarproject.bramble.api.data.BdfDictionary
import org.briarproject.bramble.api.data.BdfEntry
import org.briarproject.bramble.api.db.DatabaseComponent
import org.briarproject.bramble.api.db.DbException
import org.briarproject.bramble.api.db.Transaction
import org.briarproject.bramble.api.sync.GroupId
import org.briarproject.briar.api.client.MessageTracker.GroupCount
import org.briarproject.briar.api.messaging.MessagingManager
import org.briarproject.briar.client.MessageTrackerConstants
import java.lang.Long.max
object GroupCountHelper {
internal fun resetGroupTimestamps(
contactManager: ContactManager,
messagingManager: MessagingManager,
db: DatabaseComponent,
clientHelper: ClientHelper,
) {
db.transaction<RuntimeException>(false) { txn ->
val contacts = contactManager.getContacts(txn)
for (contact in contacts) {
val gc = messagingManager.getGroupCount(txn, contact.id)
val headers = messagingManager.getMessageHeaders(txn, contact.id)
if (headers.isEmpty()) {
continue
}
val groupId = headers.iterator().next().groupId
var latest = 0L
for (header in headers) {
latest = max(latest, header.timestamp)
}
val copy = GroupCount(gc.msgCount, gc.unreadCount, latest)
storeGroupCount(clientHelper, txn, groupId, copy)
}
}
}
@Throws(DbException::class)
private fun storeGroupCount(clientHelper: ClientHelper, txn: Transaction, g: GroupId, c: GroupCount) {
try {
val d = BdfDictionary.of(
BdfEntry(MessageTrackerConstants.GROUP_KEY_MSG_COUNT, c.msgCount),
BdfEntry(MessageTrackerConstants.GROUP_KEY_UNREAD_COUNT, c.unreadCount),
BdfEntry(MessageTrackerConstants.GROUP_KEY_LATEST_MSG, c.latestMsgTime)
)
clientHelper.mergeGroupMetadata(txn, g, d)
} catch (e: FormatException) {
throw DbException(e)
}
}
}
...@@ -2,13 +2,16 @@ package org.briarproject.briar.desktop.testdata ...@@ -2,13 +2,16 @@ package org.briarproject.briar.desktop.testdata
import mu.KotlinLogging import mu.KotlinLogging
import org.briarproject.bramble.api.FormatException import org.briarproject.bramble.api.FormatException
import org.briarproject.bramble.api.client.ClientHelper
import org.briarproject.bramble.api.contact.Contact import org.briarproject.bramble.api.contact.Contact
import org.briarproject.bramble.api.contact.ContactId import org.briarproject.bramble.api.contact.ContactId
import org.briarproject.bramble.api.contact.ContactManager import org.briarproject.bramble.api.contact.ContactManager
import org.briarproject.bramble.api.contact.event.ContactAddedEvent
import org.briarproject.bramble.api.crypto.SecretKey import org.briarproject.bramble.api.crypto.SecretKey
import org.briarproject.bramble.api.db.DatabaseComponent import org.briarproject.bramble.api.db.DatabaseComponent
import org.briarproject.bramble.api.db.DbException import org.briarproject.bramble.api.db.DbException
import org.briarproject.bramble.api.db.Transaction import org.briarproject.bramble.api.db.Transaction
import org.briarproject.bramble.api.event.EventBus
import org.briarproject.bramble.api.identity.AuthorFactory import org.briarproject.bramble.api.identity.AuthorFactory
import org.briarproject.bramble.api.identity.AuthorId import org.briarproject.bramble.api.identity.AuthorId
import org.briarproject.bramble.api.identity.IdentityManager import org.briarproject.bramble.api.identity.IdentityManager
...@@ -28,6 +31,7 @@ import org.briarproject.bramble.api.system.Clock ...@@ -28,6 +31,7 @@ import org.briarproject.bramble.api.system.Clock
import org.briarproject.briar.api.autodelete.AutoDeleteConstants import org.briarproject.briar.api.autodelete.AutoDeleteConstants
import org.briarproject.briar.api.avatar.AvatarManager import org.briarproject.briar.api.avatar.AvatarManager
import org.briarproject.briar.api.avatar.AvatarMessageEncoder import org.briarproject.briar.api.avatar.AvatarMessageEncoder
import org.briarproject.briar.api.conversation.ConversationManager
import org.briarproject.briar.api.messaging.MessagingManager import org.briarproject.briar.api.messaging.MessagingManager
import org.briarproject.briar.api.messaging.PrivateMessageFactory import org.briarproject.briar.api.messaging.PrivateMessageFactory
import org.briarproject.briar.api.privategroup.GroupMessageFactory import org.briarproject.briar.api.privategroup.GroupMessageFactory
...@@ -35,6 +39,7 @@ import org.briarproject.briar.api.privategroup.PrivateGroup ...@@ -35,6 +39,7 @@ import org.briarproject.briar.api.privategroup.PrivateGroup
import org.briarproject.briar.api.privategroup.PrivateGroupFactory import org.briarproject.briar.api.privategroup.PrivateGroupFactory
import org.briarproject.briar.api.privategroup.PrivateGroupManager import org.briarproject.briar.api.privategroup.PrivateGroupManager
import org.briarproject.briar.api.test.TestAvatarCreator import org.briarproject.briar.api.test.TestAvatarCreator
import org.briarproject.briar.desktop.GroupCountHelper.resetGroupTimestamps
import java.io.IOException import java.io.IOException
import java.io.InputStream import java.io.InputStream
import java.time.ZoneOffset import java.time.ZoneOffset
...@@ -56,9 +61,12 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor( ...@@ -56,9 +61,12 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
private val privateGroupManager: PrivateGroupManager, private val privateGroupManager: PrivateGroupManager,
private val privateGroupFactory: PrivateGroupFactory, private val privateGroupFactory: PrivateGroupFactory,
private val transportPropertyManager: TransportPropertyManager, private val transportPropertyManager: TransportPropertyManager,
private val conversationManager: ConversationManager,
private val messagingManager: MessagingManager, private val messagingManager: MessagingManager,
private val testAvatarCreator: TestAvatarCreator, private val testAvatarCreator: TestAvatarCreator,
private val avatarMessageEncoder: AvatarMessageEncoder, private val avatarMessageEncoder: AvatarMessageEncoder,
private val clientHelper: ClientHelper,
private val eventBus: EventBus,
@field:IoExecutor @param:IoExecutor private val ioExecutor: Executor @field:IoExecutor @param:IoExecutor private val ioExecutor: Executor
) : DeterministicTestDataCreator { ) : DeterministicTestDataCreator {
...@@ -103,6 +111,10 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor( ...@@ -103,6 +111,10 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
for (privateGroup in privateGroups) { for (privateGroup in privateGroups) {
createRandomPrivateGroupMessages(privateGroup, contacts, numPrivateGroupPosts) createRandomPrivateGroupMessages(privateGroup, contacts, numPrivateGroupPosts)
} }
resetGroupTimestamps(contactManager, messagingManager, db, clientHelper)
// HACK: broadcast contact added event so that the view model reloads the contact list
eventBus.broadcast(ContactAddedEvent(null, true))
} }
@Throws(DbException::class) @Throws(DbException::class)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment