Skip to content
Snippets Groups Projects
Commit 46c3ef0b 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 #8600 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.ContactId
import org.briarproject.bramble.api.data.BdfDictionary
import org.briarproject.bramble.api.data.BdfEntry
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
object GroupCountHelper {
internal fun resetGroupTimestamp(
txn: Transaction,
contactId: ContactId,
messagingManager: MessagingManager,
clientHelper: ClientHelper,
timestamp: Long,
) {
val gc = messagingManager.getGroupCount(txn, contactId)
val groupId = messagingManager.getConversationId(contactId)
val copy = GroupCount(gc.msgCount, gc.unreadCount, timestamp)
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)
}
}
}
package org.briarproject.briar.desktop.testdata
import org.briarproject.bramble.api.contact.Contact
import org.briarproject.bramble.api.db.DbException
import org.briarproject.bramble.api.lifecycle.IoExecutor
interface DeterministicTestDataCreator {
/**
* Create fake test data on the IoExecutor
......@@ -23,8 +19,4 @@ interface DeterministicTestDataCreator {
numPrivateGroups: Int,
numPrivateGroupPosts: Int,
)
@IoExecutor
@Throws(DbException::class)
fun addContact(name: String, alias: String?, avatar: Boolean): Contact
}
......@@ -2,6 +2,7 @@ package org.briarproject.briar.desktop.testdata
import mu.KotlinLogging
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.ContactId
import org.briarproject.bramble.api.contact.ContactManager
......@@ -9,6 +10,7 @@ import org.briarproject.bramble.api.crypto.SecretKey
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.event.EventBus
import org.briarproject.bramble.api.identity.AuthorFactory
import org.briarproject.bramble.api.identity.AuthorId
import org.briarproject.bramble.api.identity.IdentityManager
......@@ -28,6 +30,7 @@ import org.briarproject.bramble.api.system.Clock
import org.briarproject.briar.api.autodelete.AutoDeleteConstants
import org.briarproject.briar.api.avatar.AvatarManager
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.PrivateMessageFactory
import org.briarproject.briar.api.privategroup.GroupMessageFactory
......@@ -35,8 +38,10 @@ import org.briarproject.briar.api.privategroup.PrivateGroup
import org.briarproject.briar.api.privategroup.PrivateGroupFactory
import org.briarproject.briar.api.privategroup.PrivateGroupManager
import org.briarproject.briar.api.test.TestAvatarCreator
import org.briarproject.briar.desktop.GroupCountHelper
import java.io.IOException
import java.io.InputStream
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.util.Random
import java.util.UUID
......@@ -56,9 +61,12 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
private val privateGroupManager: PrivateGroupManager,
private val privateGroupFactory: PrivateGroupFactory,
private val transportPropertyManager: TransportPropertyManager,
private val conversationManager: ConversationManager,
private val messagingManager: MessagingManager,
private val testAvatarCreator: TestAvatarCreator,
private val avatarMessageEncoder: AvatarMessageEncoder,
private val clientHelper: ClientHelper,
private val eventBus: EventBus,
@field:IoExecutor @param:IoExecutor private val ioExecutor: Executor
) : DeterministicTestDataCreator {
......@@ -80,7 +88,13 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
require(!(avatarPercent < 0 || avatarPercent > 100))
ioExecutor.execute {
try {
createTestDataOnIoExecutor(numContacts, numPrivateMsgs, avatarPercent, numPrivateGroups, numPrivateGroupPosts)
createTestDataOnIoExecutor(
numContacts,
numPrivateMsgs,
avatarPercent,
numPrivateGroups,
numPrivateGroupPosts
)
} catch (e: DbException) {
LOG.warn(e) { }
}
......@@ -113,7 +127,9 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
for (i in 0 until min(numContacts, conversations.persons.size)) {
val person = conversations.persons[i]
val remote = authorFactory.createLocalAuthor(person.name)
val contact = addContact(localAuthor.id, remote, null, avatarPercent)
val date = person.messages.map { it.date }.sorted().last()
val contact = addContact(localAuthor.id, remote, null, avatarPercent, date)
contacts.add(contact)
}
return contacts
......@@ -124,7 +140,8 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
localAuthorId: AuthorId,
remote: LocalAuthor,
alias: String?,
avatarPercent: Int
avatarPercent: Int,
date: LocalDateTime,
): Contact {
// prepare to add contact
val secretKey = secretKey
......@@ -141,7 +158,10 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
contactManager.setContactAlias(txn, contactId, alias)
}
transportPropertyManager.addRemoteProperties(txn, contactId, props)
db.getContact(txn, contactId)
val contact = db.getContact(txn, contactId)
val timestamp = date.toEpochSecond(ZoneOffset.UTC) * 1000
GroupCountHelper.resetGroupTimestamp(txn, contactId, messagingManager, clientHelper, timestamp)
contact
}
if (random.nextInt(100) + 1 <= avatarPercent) addAvatar(contact)
LOG.info { "Added contact ${remote.name} with transport properties: $props" }
......@@ -149,14 +169,6 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
return contact
}
@Throws(DbException::class)
override fun addContact(name: String, alias: String?, avatar: Boolean): Contact {
val localAuthor = identityManager.localAuthor
val remote = authorFactory.createLocalAuthor(name)
val avatarPercent = if (avatar) 100 else 0
return addContact(localAuthor.id, remote, alias, avatarPercent)
}
private val secretKey: SecretKey
get() {
val b = ByteArray(SecretKey.LENGTH)
......
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