diff --git a/src/test/kotlin/org/briarproject/briar/desktop/GroupCountHelper.kt b/src/test/kotlin/org/briarproject/briar/desktop/GroupCountHelper.kt new file mode 100644 index 0000000000000000000000000000000000000000..b753e73b06dd32a20ec07be284391237fee41114 --- /dev/null +++ b/src/test/kotlin/org/briarproject/briar/desktop/GroupCountHelper.kt @@ -0,0 +1,43 @@ +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(txn, 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) + } + } +} diff --git a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt index bb89f14f70f1061890c1b7fec42ff661d27f04ef..a896931e16342cd11a2f82d2dab1fa6d3a1d84b8 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt @@ -1,9 +1,5 @@ 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 @@ -22,8 +18,4 @@ interface DeterministicTestDataCreator { numPrivateGroups: Int, numPrivateGroupPosts: Int, ) - - @IoExecutor - @Throws(DbException::class) - fun addContact(name: String, alias: String?, avatar: Boolean): Contact } diff --git a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt index b75891546e680b61b1b0741b972dcf24c4cde003..113125fe5eef9d04c3e376f188a4159c293cc5fc 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt @@ -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 { @@ -119,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 @@ -130,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 @@ -147,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" } @@ -155,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)