From 7f7612ef12cc5b27d644d4d10e770ef6254707c1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 18 Sep 2024 14:14:10 +0200 Subject: [PATCH 1/3] Code cleanup --- .../auth/RustMatrixAuthenticationService.kt | 27 +++++++++---------- .../RustSessionVerificationService.kt | 1 + 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index d1f0d29295..b63e307888 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -251,18 +251,17 @@ class RustMatrixAuthenticationService @Inject constructor( oidcConfiguration = oidcConfiguration, progressListener = progressListener, ) - - client.use { rustClient -> - val sessionData = rustClient.session() + val sessionData = client.use { rustClient -> + rustClient.session() .toSessionData( isTokenValid = true, loginType = LoginType.QR, passphrase = pendingPassphrase, sessionPaths = emptySessionPaths, ) - sessionStore.storeData(sessionData) - SessionId(sessionData.userId) } + sessionStore.storeData(sessionData) + SessionId(sessionData.userId) }.mapFailure { when (it) { is QrCodeDecodeException -> QrErrorMapper.map(it) @@ -285,14 +284,14 @@ class RustMatrixAuthenticationService @Inject constructor( if (slidingSyncType is ClientBuilderSlidingSync.Simplified) { Timber.d("Creating client with simplified sliding sync") try { - return rustMatrixClientFactory - .getBaseClientBuilder( - sessionPaths = sessionPaths, - passphrase = pendingPassphrase, - slidingSyncType = slidingSyncType, - ) - .run { config() } - .build() + return rustMatrixClientFactory + .getBaseClientBuilder( + sessionPaths = sessionPaths, + passphrase = pendingPassphrase, + slidingSyncType = slidingSyncType, + ) + .config() + .build() } catch (e: HumanQrLoginException.SlidingSyncNotAvailable) { Timber.e(e, "Failed to create client with simplified sliding sync, trying with Proxy now") } @@ -304,7 +303,7 @@ class RustMatrixAuthenticationService @Inject constructor( passphrase = pendingPassphrase, slidingSyncType = getSlidingSyncProxy(), ) - .run { config() } + .config() .build() } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt index 9d55d3402c..71004a74d7 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt @@ -206,6 +206,7 @@ class RustSessionVerificationService( } } } + private suspend fun updateVerificationStatus() { if (verificationFlowState.value == VerificationFlowState.Finished) { // Calling `encryptionService.verificationState()` performs a network call and it will deadlock if there is no network From d9f96b8fb39f60ee63ce82fb1397e69da8b907b8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 18 Sep 2024 14:14:44 +0200 Subject: [PATCH 2/3] Move FakeRust classes and factories to a fixtures package --- .../matrix/impl/fixtures/FakeRustRoom.kt | 39 ++++++ .../impl/fixtures/FakeRustRoomListItem.kt | 32 +++++ .../fixtures/FakeRustRoomMembersIterator.kt | 31 +++++ .../matrix/impl/fixtures/RustRoomInfo.kt | 81 +++++++++++++ .../matrix/impl/fixtures/RustRoomMember.kt | 34 ++++++ .../room/member/RoomMemberListFetcherTest.kt | 113 ++++-------------- .../roomlist/RoomSummaryListProcessorTest.kt | 103 +--------------- 7 files changed, 244 insertions(+), 189 deletions(-) create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoom.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoomListItem.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoomMembersIterator.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/RustRoomInfo.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/RustRoomMember.kt diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoom.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoom.kt new file mode 100644 index 0000000000..f8f8b88a98 --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoom.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.fixtures + +import io.element.android.libraries.matrix.test.A_ROOM_ID +import org.matrix.rustcomponents.sdk.NoPointer +import org.matrix.rustcomponents.sdk.Room +import org.matrix.rustcomponents.sdk.RoomMembersIterator + +class FakeRustRoom( + private val getMembers: () -> RoomMembersIterator = { FakeRustRoomMembersIterator() }, + private val getMembersNoSync: () -> RoomMembersIterator = { FakeRustRoomMembersIterator() }, +) : Room(NoPointer) { + var membersCallCount = 0 + var membersNoSyncCallCount = 0 + + override fun id(): String { + return A_ROOM_ID.value + } + + override suspend fun members(): RoomMembersIterator { + membersCallCount++ + return getMembers() + } + + override suspend fun membersNoSync(): RoomMembersIterator { + membersNoSyncCallCount++ + return getMembersNoSync() + } + + override fun close() { + // No-op + } +} diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoomListItem.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoomListItem.kt new file mode 100644 index 0000000000..1b9adee435 --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoomListItem.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.fixtures + +import io.element.android.libraries.matrix.api.core.RoomId +import org.matrix.rustcomponents.sdk.EventTimelineItem +import org.matrix.rustcomponents.sdk.NoPointer +import org.matrix.rustcomponents.sdk.RoomInfo +import org.matrix.rustcomponents.sdk.RoomListItem + +class FakeRustRoomListItem( + private val roomId: RoomId, + private val roomInfo: RoomInfo = aRustRoomInfo(id = roomId.value), + private val latestEvent: EventTimelineItem? = null, +) : RoomListItem(NoPointer) { + override fun id(): String { + return roomId.value + } + + override suspend fun roomInfo(): RoomInfo { + return roomInfo + } + + override suspend fun latestEvent(): EventTimelineItem? { + return latestEvent + } +} diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoomMembersIterator.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoomMembersIterator.kt new file mode 100644 index 0000000000..e5a0646303 --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoomMembersIterator.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.fixtures + +import org.matrix.rustcomponents.sdk.NoPointer +import org.matrix.rustcomponents.sdk.RoomMember +import org.matrix.rustcomponents.sdk.RoomMembersIterator + +class FakeRustRoomMembersIterator( + private var members: List? = null +) : RoomMembersIterator(NoPointer) { + override fun len(): UInt { + return members?.size?.toUInt() ?: 0u + } + + override fun nextChunk(chunkSize: UInt): List? { + if (members?.isEmpty() == true) { + return null + } + return members?.let { + val result = it.take(chunkSize.toInt()) + members = it.subList(result.size, it.size) + result + } + } +} diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/RustRoomInfo.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/RustRoomInfo.kt new file mode 100644 index 0000000000..e64dabf27a --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/RustRoomInfo.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.fixtures + +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.test.A_ROOM_ID +import io.element.android.libraries.matrix.test.A_ROOM_NAME +import org.matrix.rustcomponents.sdk.Membership +import org.matrix.rustcomponents.sdk.RoomHero +import org.matrix.rustcomponents.sdk.RoomInfo +import org.matrix.rustcomponents.sdk.RoomMember +import org.matrix.rustcomponents.sdk.RoomNotificationMode + +fun aRustRoomInfo( + id: String = A_ROOM_ID.value, + displayName: String = A_ROOM_NAME, + rawName: String = A_ROOM_NAME, + topic: String? = null, + avatarUrl: String? = null, + isDirect: Boolean = false, + isPublic: Boolean = false, + isSpace: Boolean = false, + isTombstoned: Boolean = false, + isFavourite: Boolean = false, + canonicalAlias: String? = null, + alternativeAliases: List = listOf(), + membership: Membership = Membership.JOINED, + inviter: RoomMember? = null, + heroes: List = listOf(), + activeMembersCount: ULong = 0uL, + invitedMembersCount: ULong = 0uL, + joinedMembersCount: ULong = 0uL, + userPowerLevels: Map = mapOf(), + highlightCount: ULong = 0uL, + notificationCount: ULong = 0uL, + userDefinedNotificationMode: RoomNotificationMode? = null, + hasRoomCall: Boolean = false, + activeRoomCallParticipants: List = listOf(), + isMarkedUnread: Boolean = false, + numUnreadMessages: ULong = 0uL, + numUnreadNotifications: ULong = 0uL, + numUnreadMentions: ULong = 0uL, + pinnedEventIds: List = listOf(), + roomCreator: UserId? = null, +) = RoomInfo( + id = id, + displayName = displayName, + rawName = rawName, + topic = topic, + avatarUrl = avatarUrl, + isDirect = isDirect, + isPublic = isPublic, + isSpace = isSpace, + isTombstoned = isTombstoned, + isFavourite = isFavourite, + canonicalAlias = canonicalAlias, + alternativeAliases = alternativeAliases, + membership = membership, + inviter = inviter, + heroes = heroes, + activeMembersCount = activeMembersCount, + invitedMembersCount = invitedMembersCount, + joinedMembersCount = joinedMembersCount, + userPowerLevels = userPowerLevels, + highlightCount = highlightCount, + notificationCount = notificationCount, + cachedUserDefinedNotificationMode = userDefinedNotificationMode, + hasRoomCall = hasRoomCall, + activeRoomCallParticipants = activeRoomCallParticipants, + isMarkedUnread = isMarkedUnread, + numUnreadMessages = numUnreadMessages, + numUnreadNotifications = numUnreadNotifications, + numUnreadMentions = numUnreadMentions, + pinnedEventIds = pinnedEventIds, + creator = roomCreator?.value, +) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/RustRoomMember.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/RustRoomMember.kt new file mode 100644 index 0000000000..918ae1fe12 --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/RustRoomMember.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.fixtures + +import io.element.android.libraries.matrix.api.core.UserId +import org.matrix.rustcomponents.sdk.MembershipState +import org.matrix.rustcomponents.sdk.RoomMember +import uniffi.matrix_sdk.RoomMemberRole + +fun aRustRoomMember( + userId: UserId, + displayName: String? = null, + avatarUrl: String? = null, + membership: MembershipState = MembershipState.JOIN, + isNameAmbiguous: Boolean = false, + powerLevel: Long = 0L, + isIgnored: Boolean = false, + role: RoomMemberRole = RoomMemberRole.USER, +) = RoomMember( + userId = userId.value, + displayName = displayName, + avatarUrl = avatarUrl, + membership = membership, + isNameAmbiguous = isNameAmbiguous, + powerLevel = powerLevel, + normalizedPowerLevel = powerLevel, + isIgnored = isIgnored, + suggestedRoleForPowerLevel = role, +) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt index 2411b67c61..87e2f5a0b7 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt @@ -9,13 +9,14 @@ package io.element.android.libraries.matrix.impl.room.member import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState import io.element.android.libraries.matrix.api.room.roomMembers +import io.element.android.libraries.matrix.impl.fixtures.FakeRustRoom +import io.element.android.libraries.matrix.impl.fixtures.FakeRustRoomMembersIterator +import io.element.android.libraries.matrix.impl.fixtures.aRustRoomMember import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher.Source.CACHE import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher.Source.CACHE_AND_SERVER import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher.Source.SERVER -import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.libraries.matrix.test.A_USER_ID_3 @@ -23,22 +24,16 @@ import io.element.android.libraries.matrix.test.A_USER_ID_4 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.test.runTest import org.junit.Test -import org.matrix.rustcomponents.sdk.MembershipState -import org.matrix.rustcomponents.sdk.NoPointer -import org.matrix.rustcomponents.sdk.Room -import org.matrix.rustcomponents.sdk.RoomMember -import org.matrix.rustcomponents.sdk.RoomMembersIterator -import uniffi.matrix_sdk.RoomMemberRole class RoomMemberListFetcherTest { @Test fun `fetchRoomMembers with CACHE source - emits cached members, if any`() = runTest { val room = FakeRustRoom(getMembersNoSync = { - FakeRoomMembersIterator( + FakeRustRoomMembersIterator( listOf( - fakeRustRoomMember(A_USER_ID), - fakeRustRoomMember(A_USER_ID_2), - fakeRustRoomMember(A_USER_ID_3), + aRustRoomMember(A_USER_ID), + aRustRoomMember(A_USER_ID_2), + aRustRoomMember(A_USER_ID_3), ) ) }) @@ -65,7 +60,7 @@ class RoomMemberListFetcherTest { @Test fun `fetchRoomMembers with CACHE source - emits empty list, if no members exist`() = runTest { val room = FakeRustRoom(getMembersNoSync = { - FakeRoomMembersIterator(emptyList()) + FakeRustRoomMembersIterator(emptyList()) }) val fetcher = RoomMemberListFetcher(room, Dispatchers.Default) @@ -95,11 +90,11 @@ class RoomMemberListFetcherTest { @Test fun `fetchRoomMembers with CACHE source - emits all items at once`() = runTest { val room = FakeRustRoom(getMembersNoSync = { - FakeRoomMembersIterator( + FakeRustRoomMembersIterator( listOf( - fakeRustRoomMember(A_USER_ID), - fakeRustRoomMember(A_USER_ID_2), - fakeRustRoomMember(A_USER_ID_3), + aRustRoomMember(A_USER_ID), + aRustRoomMember(A_USER_ID_2), + aRustRoomMember(A_USER_ID_3), ) ) }) @@ -122,11 +117,11 @@ class RoomMemberListFetcherTest { @Test fun `fetchRoomMembers with SERVER source - emits only new members, if any`() = runTest { val room = FakeRustRoom(getMembers = { - FakeRoomMembersIterator( + FakeRustRoomMembersIterator( listOf( - fakeRustRoomMember(A_USER_ID), - fakeRustRoomMember(A_USER_ID_2), - fakeRustRoomMember(A_USER_ID_3), + aRustRoomMember(A_USER_ID), + aRustRoomMember(A_USER_ID_2), + aRustRoomMember(A_USER_ID_3), ) ) }) @@ -163,14 +158,14 @@ class RoomMemberListFetcherTest { fun `fetchRoomMembers with CACHE_AND_SERVER source - returns cached items first, then new ones`() = runTest { val room = FakeRustRoom( getMembersNoSync = { - FakeRoomMembersIterator(listOf(fakeRustRoomMember(A_USER_ID_4))) + FakeRustRoomMembersIterator(listOf(aRustRoomMember(A_USER_ID_4))) }, getMembers = { - FakeRoomMembersIterator( + FakeRustRoomMembersIterator( listOf( - fakeRustRoomMember(A_USER_ID), - fakeRustRoomMember(A_USER_ID_2), - fakeRustRoomMember(A_USER_ID_3), + aRustRoomMember(A_USER_ID), + aRustRoomMember(A_USER_ID_2), + aRustRoomMember(A_USER_ID_3), ) ) } @@ -203,69 +198,3 @@ class RoomMemberListFetcherTest { } } } - -class FakeRustRoom( - private val getMembers: () -> RoomMembersIterator = { FakeRoomMembersIterator() }, - private val getMembersNoSync: () -> RoomMembersIterator = { FakeRoomMembersIterator() }, -) : Room(NoPointer) { - var membersCallCount = 0 - var membersNoSyncCallCount = 0 - - override fun id(): String { - return A_ROOM_ID.value - } - - override suspend fun members(): RoomMembersIterator { - membersCallCount++ - return getMembers() - } - - override suspend fun membersNoSync(): RoomMembersIterator { - membersNoSyncCallCount++ - return getMembersNoSync() - } - - override fun close() { - // No-op - } -} - -class FakeRoomMembersIterator( - private var members: List? = null -) : RoomMembersIterator(NoPointer) { - override fun len(): UInt { - return members?.size?.toUInt() ?: 0u - } - - override fun nextChunk(chunkSize: UInt): List? { - if (members?.isEmpty() == true) { - return null - } - return members?.let { - val result = it.take(chunkSize.toInt()) - members = it.subList(result.size, it.size) - result - } - } -} - -private fun fakeRustRoomMember( - userId: UserId, - displayName: String? = null, - avatarUrl: String? = null, - membership: MembershipState = MembershipState.JOIN, - isNameAmbiguous: Boolean = false, - powerLevel: Long = 0L, - isIgnored: Boolean = false, - role: RoomMemberRole = RoomMemberRole.USER, -) = RoomMember( - userId = userId.value, - displayName = displayName, - avatarUrl = avatarUrl, - membership = membership, - isNameAmbiguous = isNameAmbiguous, - powerLevel = powerLevel, - normalizedPowerLevel = powerLevel, - isIgnored = isIgnored, - suggestedRoleForPowerLevel = role, -) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt index faa8a1102e..93096ee227 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt @@ -9,12 +9,10 @@ package io.element.android.libraries.matrix.impl.roomlist import com.google.common.truth.Truth.assertThat import com.sun.jna.Pointer -import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.roomlist.RoomSummary +import io.element.android.libraries.matrix.impl.fixtures.FakeRustRoomListItem import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_ID_2 -import io.element.android.libraries.matrix.test.A_ROOM_NAME import io.element.android.libraries.matrix.test.room.aRoomSummary import io.element.android.libraries.matrix.test.room.aRoomSummaryFilled import kotlinx.coroutines.flow.MutableStateFlow @@ -22,19 +20,12 @@ import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runTest import org.junit.Test -import org.matrix.rustcomponents.sdk.EventTimelineItem -import org.matrix.rustcomponents.sdk.Membership -import org.matrix.rustcomponents.sdk.NoPointer -import org.matrix.rustcomponents.sdk.RoomHero -import org.matrix.rustcomponents.sdk.RoomInfo import org.matrix.rustcomponents.sdk.RoomList import org.matrix.rustcomponents.sdk.RoomListEntriesUpdate import org.matrix.rustcomponents.sdk.RoomListItem import org.matrix.rustcomponents.sdk.RoomListServiceInterface import org.matrix.rustcomponents.sdk.RoomListServiceStateListener import org.matrix.rustcomponents.sdk.RoomListServiceSyncIndicatorListener -import org.matrix.rustcomponents.sdk.RoomMember -import org.matrix.rustcomponents.sdk.RoomNotificationMode import org.matrix.rustcomponents.sdk.RoomSubscription import org.matrix.rustcomponents.sdk.TaskHandle @@ -48,7 +39,7 @@ class RoomSummaryListProcessorTest { summaries.value = listOf(aRoomSummary()) val processor = createProcessor() - val newEntry = FakeRoomListItem(A_ROOM_ID_2) + val newEntry = FakeRustRoomListItem(A_ROOM_ID_2) processor.postUpdate(listOf(RoomListEntriesUpdate.Append(listOf(newEntry, newEntry, newEntry)))) assertThat(summaries.value.count()).isEqualTo(4) @@ -59,7 +50,7 @@ class RoomSummaryListProcessorTest { fun `PushBack adds a new entry at the end of the list`() = runTest { summaries.value = listOf(aRoomSummaryFilled()) val processor = createProcessor() - processor.postUpdate(listOf(RoomListEntriesUpdate.PushBack(FakeRoomListItem(A_ROOM_ID_2)))) + processor.postUpdate(listOf(RoomListEntriesUpdate.PushBack(FakeRustRoomListItem(A_ROOM_ID_2)))) assertThat(summaries.value.count()).isEqualTo(2) assertThat(summaries.value.last().roomId).isEqualTo(A_ROOM_ID_2) @@ -69,7 +60,7 @@ class RoomSummaryListProcessorTest { fun `PushFront inserts a new entry at the start of the list`() = runTest { summaries.value = listOf(aRoomSummaryFilled()) val processor = createProcessor() - processor.postUpdate(listOf(RoomListEntriesUpdate.PushFront(FakeRoomListItem(A_ROOM_ID_2)))) + processor.postUpdate(listOf(RoomListEntriesUpdate.PushFront(FakeRustRoomListItem(A_ROOM_ID_2)))) assertThat(summaries.value.count()).isEqualTo(2) assertThat(summaries.value.first().roomId).isEqualTo(A_ROOM_ID_2) @@ -81,7 +72,7 @@ class RoomSummaryListProcessorTest { val processor = createProcessor() val index = 0 - processor.postUpdate(listOf(RoomListEntriesUpdate.Set(index.toUInt(), FakeRoomListItem(A_ROOM_ID_2)))) + processor.postUpdate(listOf(RoomListEntriesUpdate.Set(index.toUInt(), FakeRustRoomListItem(A_ROOM_ID_2)))) assertThat(summaries.value.count()).isEqualTo(1) assertThat(summaries.value[index].roomId).isEqualTo(A_ROOM_ID_2) @@ -93,7 +84,7 @@ class RoomSummaryListProcessorTest { val processor = createProcessor() val index = 0 - processor.postUpdate(listOf(RoomListEntriesUpdate.Insert(index.toUInt(), FakeRoomListItem(A_ROOM_ID_2)))) + processor.postUpdate(listOf(RoomListEntriesUpdate.Insert(index.toUInt(), FakeRustRoomListItem(A_ROOM_ID_2)))) assertThat(summaries.value.count()).isEqualTo(2) assertThat(summaries.value[index].roomId).isEqualTo(A_ROOM_ID_2) @@ -185,85 +176,3 @@ class RoomSummaryListProcessorTest { override fun subscribeToRooms(roomIds: List, settings: RoomSubscription?) = Unit } } - -private fun aRustRoomInfo( - id: String = A_ROOM_ID.value, - displayName: String = A_ROOM_NAME, - rawName: String = A_ROOM_NAME, - topic: String? = null, - avatarUrl: String? = null, - isDirect: Boolean = false, - isPublic: Boolean = false, - isSpace: Boolean = false, - isTombstoned: Boolean = false, - isFavourite: Boolean = false, - canonicalAlias: String? = null, - alternativeAliases: List = listOf(), - membership: Membership = Membership.JOINED, - inviter: RoomMember? = null, - heroes: List = listOf(), - activeMembersCount: ULong = 0uL, - invitedMembersCount: ULong = 0uL, - joinedMembersCount: ULong = 0uL, - userPowerLevels: Map = mapOf(), - highlightCount: ULong = 0uL, - notificationCount: ULong = 0uL, - userDefinedNotificationMode: RoomNotificationMode? = null, - hasRoomCall: Boolean = false, - activeRoomCallParticipants: List = listOf(), - isMarkedUnread: Boolean = false, - numUnreadMessages: ULong = 0uL, - numUnreadNotifications: ULong = 0uL, - numUnreadMentions: ULong = 0uL, - pinnedEventIds: List = listOf(), - roomCreator: UserId? = null, -) = RoomInfo( - id = id, - displayName = displayName, - rawName = rawName, - topic = topic, - avatarUrl = avatarUrl, - isDirect = isDirect, - isPublic = isPublic, - isSpace = isSpace, - isTombstoned = isTombstoned, - isFavourite = isFavourite, - canonicalAlias = canonicalAlias, - alternativeAliases = alternativeAliases, - membership = membership, - inviter = inviter, - heroes = heroes, - activeMembersCount = activeMembersCount, - invitedMembersCount = invitedMembersCount, - joinedMembersCount = joinedMembersCount, - userPowerLevels = userPowerLevels, - highlightCount = highlightCount, - notificationCount = notificationCount, - cachedUserDefinedNotificationMode = userDefinedNotificationMode, - hasRoomCall = hasRoomCall, - activeRoomCallParticipants = activeRoomCallParticipants, - isMarkedUnread = isMarkedUnread, - numUnreadMessages = numUnreadMessages, - numUnreadNotifications = numUnreadNotifications, - numUnreadMentions = numUnreadMentions, - pinnedEventIds = pinnedEventIds, - creator = roomCreator?.value, -) - -class FakeRoomListItem( - private val roomId: RoomId, - private val roomInfo: RoomInfo = aRustRoomInfo(id = roomId.value), - private val latestEvent: EventTimelineItem? = null, -) : RoomListItem(NoPointer) { - override fun id(): String { - return roomId.value - } - - override suspend fun roomInfo(): RoomInfo { - return roomInfo - } - - override suspend fun latestEvent(): EventTimelineItem? { - return latestEvent - } -} From d7c92e38243d21cbd090b2232c31398467101d74 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 18 Sep 2024 14:26:45 +0200 Subject: [PATCH 3/3] Cleanup tests. --- .../libraries/matrix/impl/fixtures/FakeRustRoom.kt | 14 ++++++-------- .../impl/room/member/RoomMemberListFetcherTest.kt | 12 ------------ 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoom.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoom.kt index f8f8b88a98..a9321bf347 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoom.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/FakeRustRoom.kt @@ -7,29 +7,27 @@ package io.element.android.libraries.matrix.impl.fixtures +import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.test.A_ROOM_ID +import io.element.android.tests.testutils.lambda.lambdaError import org.matrix.rustcomponents.sdk.NoPointer import org.matrix.rustcomponents.sdk.Room import org.matrix.rustcomponents.sdk.RoomMembersIterator class FakeRustRoom( - private val getMembers: () -> RoomMembersIterator = { FakeRustRoomMembersIterator() }, - private val getMembersNoSync: () -> RoomMembersIterator = { FakeRustRoomMembersIterator() }, + private val roomId: RoomId = A_ROOM_ID, + private val getMembers: () -> RoomMembersIterator = { lambdaError() }, + private val getMembersNoSync: () -> RoomMembersIterator = { lambdaError() }, ) : Room(NoPointer) { - var membersCallCount = 0 - var membersNoSyncCallCount = 0 - override fun id(): String { - return A_ROOM_ID.value + return roomId.value } override suspend fun members(): RoomMembersIterator { - membersCallCount++ return getMembers() } override suspend fun membersNoSync(): RoomMembersIterator { - membersNoSyncCallCount++ return getMembersNoSync() } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt index 87e2f5a0b7..dc8489e48f 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt @@ -50,10 +50,6 @@ class RoomMemberListFetcherTest { val cachedItemsState = awaitItem() assertThat(cachedItemsState).isInstanceOf(MatrixRoomMembersState.Ready::class.java) assertThat((cachedItemsState as? MatrixRoomMembersState.Ready)?.roomMembers).hasSize(3) - - // Assert only the 'no sync' method was called, so no new member sync happened - assertThat(room.membersNoSyncCallCount).isEqualTo(1) - assertThat(room.membersCallCount).isEqualTo(0) } } @@ -133,10 +129,6 @@ class RoomMemberListFetcherTest { assertThat(awaitItem()).isInstanceOf(MatrixRoomMembersState.Unknown::class.java) assertThat(awaitItem()).isInstanceOf(MatrixRoomMembersState.Pending::class.java) assertThat((awaitItem() as? MatrixRoomMembersState.Ready)?.roomMembers?.size).isEqualTo(3) - - // Assert only the 'sync' method was called, so a new member sync happened - assertThat(room.membersNoSyncCallCount).isEqualTo(0) - assertThat(room.membersCallCount).isEqualTo(1) } } @@ -191,10 +183,6 @@ class RoomMemberListFetcherTest { assertThat(ready).isInstanceOf(MatrixRoomMembersState.Ready::class.java) assertThat(ready.roomMembers()).hasSize(3) } - - // Assert both member methods were called, so both the cache was hit and a new member sync happened - assertThat(room.membersNoSyncCallCount).isEqualTo(1) - assertThat(room.membersCallCount).isEqualTo(1) } } }