diff --git a/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt b/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt index 70ffee14b4374f0339cf097ab8b8e5a85d16f6d7..558810c4656c14904440afdca9ba65a435a6777f 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt @@ -9,6 +9,7 @@ import androidx.compose.ui.window.Window import org.briarproject.bramble.api.account.AccountManager import org.briarproject.bramble.api.lifecycle.LifecycleManager import org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING +import org.briarproject.briar.api.privategroup.PrivateGroupManager import org.briarproject.briar.desktop.contact.ContactListViewModel import org.briarproject.briar.desktop.contact.add.remote.AddContactViewModel import org.briarproject.briar.desktop.conversation.ConversationViewModel @@ -54,6 +55,7 @@ constructor( private val sidebarViewModel: SidebarViewModel, private val accountManager: AccountManager, private val lifecycleManager: LifecycleManager, + private val privateGroupManager: PrivateGroupManager, ) : BriarUi { companion object { @@ -103,7 +105,7 @@ constructor( contactListViewModel.loadContacts() screenState = Screen.MAIN } - else -> + else -> { MainScreen( contactListViewModel, conversationViewModel, @@ -113,6 +115,8 @@ constructor( isDark, setDark ) + privateGroupManager.privateGroups.forEach { println(it.name) } + } } } } diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt index 50f555bab1f491e2df916dffa3da9cad49e674ae..db867a8e7da7e0ca0dddfc0bcb4e68d8cc1845a3 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/TestDeterministicConversations.kt @@ -1,5 +1,5 @@ package org.briarproject.briar.desktop fun main() = RunWithTemporaryAccount { - getDeterministicTestDataCreator().createTestData(5, 20, 50) + getDeterministicTestDataCreator().createTestData(5, 20, 50, 4, 20) }.run() diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestMixedConversations.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestMixedConversations.kt index 32c1f1447081f99e70f27017e5b37a853c843a89..939e40adb190aef8a410391ac10bac01400109bf 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/TestMixedConversations.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/TestMixedConversations.kt @@ -1,6 +1,6 @@ package org.briarproject.briar.desktop fun main() = RunWithTemporaryAccount { - getDeterministicTestDataCreator().createTestData(5, 20, 50) + getDeterministicTestDataCreator().createTestData(5, 20, 50, 4, 20) getTestDataCreator().createTestData(5, 20, 50, 4, 4, 10) }.run() diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt index 13257a39f4bc4d3359af4050dfbd10d04a5a816f..f60001132cc5d21ba0fee542e5ed4f157857f3ae 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt @@ -4,7 +4,7 @@ import org.briarproject.briar.desktop.TestUtils.connectAll fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob")) { forEach { - it.getDeterministicTestDataCreator().createTestData(5, 20, 50) + it.getDeterministicTestDataCreator().createTestData(5, 20, 50, 4, 20) } connectAll() }.run() diff --git a/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoTemporaryAccounts.kt b/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoTemporaryAccounts.kt index 110456aa4e31a2157741b9670cf686e059966a4f..0b124123956440b2e68cba676183d53c8f71445c 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoTemporaryAccounts.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoTemporaryAccounts.kt @@ -2,6 +2,6 @@ package org.briarproject.briar.desktop fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob")) { forEach { - it.getDeterministicTestDataCreator().createTestData(5, 20, 50) + it.getDeterministicTestDataCreator().createTestData(5, 20, 50, 4, 20) } }.run() 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 d62c030b53a78fbca9fa1f660dd15b08be26022c..e22293e3eaf499c8b1f3f3728aefc32f50b5aac3 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreator.kt @@ -14,7 +14,13 @@ interface DeterministicTestDataCreator { * @param avatarPercent Percentage of contacts * that will use a random profile image. Between 0 and 100. */ - fun createTestData(numContacts: Int, numPrivateMsgs: Int, avatarPercent: Int) + fun createTestData( + numContacts: Int, + numPrivateMsgs: Int, + avatarPercent: Int, + numPrivateGroups: Int, + numPrivateGroupPosts: Int, + ) @IoExecutor @Throws(DbException::class) 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 52f09dbc7afc7cd7f963ea146bc590ff2cd0f2e4..917ec636724d6c85c35a22ab8c7663d4b0f97496 100644 --- a/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt +++ b/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt @@ -23,6 +23,7 @@ import org.briarproject.bramble.api.sync.Group import org.briarproject.bramble.api.sync.GroupFactory import org.briarproject.bramble.api.sync.GroupId import org.briarproject.bramble.api.sync.Message +import org.briarproject.bramble.api.sync.MessageId import org.briarproject.bramble.api.system.Clock import org.briarproject.bramble.util.LogUtils import org.briarproject.briar.api.autodelete.AutoDeleteConstants @@ -30,7 +31,13 @@ import org.briarproject.briar.api.avatar.AvatarManager import org.briarproject.briar.api.avatar.AvatarMessageEncoder import org.briarproject.briar.api.messaging.MessagingManager import org.briarproject.briar.api.messaging.PrivateMessageFactory +import org.briarproject.briar.api.privategroup.GroupMessage +import org.briarproject.briar.api.privategroup.GroupMessageFactory +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.test.TestData import java.io.IOException import java.io.InputStream import java.time.ZoneOffset @@ -46,10 +53,13 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor( private val authorFactory: AuthorFactory, private val clock: Clock, private val groupFactory: GroupFactory, + private val groupMessageFactory: GroupMessageFactory, private val privateMessageFactory: PrivateMessageFactory, private val db: DatabaseComponent, private val identityManager: IdentityManager, private val contactManager: ContactManager, + private val privateGroupManager: PrivateGroupManager, + private val privateGroupFactory: PrivateGroupFactory, private val transportPropertyManager: TransportPropertyManager, private val messagingManager: MessagingManager, private val testAvatarCreator: TestAvatarCreator, @@ -66,13 +76,15 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor( override fun createTestData( numContacts: Int, numPrivateMsgs: Int, - avatarPercent: Int + avatarPercent: Int, + numPrivateGroups: Int, + numPrivateGroupPosts: Int, ) { require(numContacts != 0) require(!(avatarPercent < 0 || avatarPercent > 100)) ioExecutor.execute { try { - createTestDataOnIoExecutor(numContacts, numPrivateMsgs, avatarPercent) + createTestDataOnIoExecutor(numContacts, numPrivateMsgs, avatarPercent, numPrivateGroups, numPrivateGroupPosts) } catch (e: DbException) { LogUtils.logException(LOG, Level.WARNING, e) } @@ -84,10 +96,18 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor( private fun createTestDataOnIoExecutor( numContacts: Int, numPrivateMsgs: Int, - avatarPercent: Int + avatarPercent: Int, + numPrivateGroups: Int, + numPrivateGroupPosts: Int ) { val contacts = createContacts(numContacts, avatarPercent) createPrivateMessages(contacts, numPrivateMsgs) + + val privateGroups = createPrivateGroups(contacts, numPrivateGroups) + checkNotNull(privateGroups) + for (privateGroup in privateGroups) { + createRandomPrivateGroupMessages(privateGroup, contacts, numPrivateGroupPosts) + } } @Throws(DbException::class) @@ -326,4 +346,64 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor( throw AssertionError(e) } } + + @Throws(DbException::class) + private fun createPrivateGroups(contacts: List<Contact>, numPrivateGroups: Int): List<PrivateGroup>? { + val privateGroups: MutableList<PrivateGroup> = java.util.ArrayList(numPrivateGroups) + for (i in 0 until numPrivateGroups) { + // create private group + val name = TestData.GROUP_NAMES[random.nextInt(TestData.GROUP_NAMES.size)] + val privateGroup = privateGroupFactory.createPrivateGroup("Private group $i", identityManager.localAuthor) + val joinMsg = groupMessageFactory.createJoinMessage( + privateGroup.id, + clock.currentTimeMillis() - i * 60 * 1000, identityManager.localAuthor + ) + privateGroupManager.addPrivateGroup(privateGroup, joinMsg, true) + + // share with all contacts + for (contact in contacts) { + shareGroup(contact.id, privateGroup.id) + } + privateGroups.add(privateGroup) + } + if (LOG.isLoggable(Level.INFO)) { + LOG.info("Created $numPrivateGroups private groups.") + } + return privateGroups + } + + @Throws(DbException::class) + private fun createRandomPrivateGroupMessages( + privateGroup: PrivateGroup, + contacts: List<Contact>, + numPrivateGroupMessages: Int + ) { + val messages: MutableList<GroupMessage> = java.util.ArrayList() + for (i in 0 until numPrivateGroupMessages) { + val contact = contacts[random.nextInt(contacts.size)] + val author = localAuthors[contact] + val timestamp = clock.currentTimeMillis() - i * 60 * 1000 + val text: String = "This is a message" + var parent: MessageId? = null + if (random.nextBoolean() && messages.size > 0) { + val parentMessage = messages[random.nextInt(messages.size)] + parent = parentMessage.message.id + } + val message = groupMessageFactory.createGroupMessage(privateGroup.id, timestamp, null, author, text, parent) + privateGroupManager.addLocalMessage(message) + messages.add(message) + db.transaction<RuntimeException>( + false + ) { txn: Transaction? -> + db.receiveMessage( + txn, + contact.id, + message.message + ) + } + } + if (LOG.isLoggable(Level.INFO)) { + LOG.info("Created $numPrivateGroupMessages private group posts.") + } + } }