From 4f66a2f470c711f5fe1466588200b463af0f7e75 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Wed, 5 Oct 2022 16:36:58 +0530 Subject: [PATCH 1/8] Fix VerifySessionPassphraseTest --- .../java/im/vector/app/VerificationTestBase.kt | 4 +++- .../vector/app/VerifySessionInteractiveTest.kt | 18 +++++++++++++----- .../vector/app/VerifySessionPassphraseTest.kt | 16 ++++++++++++---- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/VerificationTestBase.kt b/vector-app/src/androidTest/java/im/vector/app/VerificationTestBase.kt index 97a2a14da33..f8ae32b425f 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerificationTestBase.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerificationTestBase.kt @@ -114,7 +114,9 @@ abstract class VerificationTestBase { private fun syncSession(session: Session) { val lock = CountDownLatch(1) - GlobalScope.launch(Dispatchers.Main) { session.open() } + runBlocking(Dispatchers.Main) { + session.open() + } session.syncService().startSync(true) diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt index da13e49e84e..fa91f4f7582 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt @@ -36,12 +36,13 @@ import androidx.test.filters.LargeTest import com.adevinta.android.barista.internal.viewaction.SleepViewAction import im.vector.app.core.utils.getMatrixInstance import im.vector.app.features.MainActivity +import im.vector.app.features.analytics.ui.consent.AnalyticsOptInActivity import im.vector.app.features.home.HomeActivity import org.hamcrest.CoreMatchers.not import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test +import org.junit.rules.RuleChain import org.junit.runner.RunWith import org.matrix.android.sdk.api.auth.UIABaseAuth import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor @@ -59,20 +60,21 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @LargeTest -@Ignore class VerifySessionInteractiveTest : VerificationTestBase() { var existingSession: Session? = null @get:Rule - val activityRule = ActivityScenarioRule(MainActivity::class.java) + val testRule: RuleChain = RuleChain + .outerRule(ActivityScenarioRule(MainActivity::class.java)) + .around(ClearCurrentSessionRule()) @Before fun createSessionWithCrossSigning() { val matrix = getMatrixInstance() val userName = "foobar_${Random.nextLong()}" existingSession = createAccountAndSync(matrix, userName, password, true) - doSync { + doSync { existingSession!!.cryptoService().crossSigningService() .initializeCrossSigning( object : UserInteractiveAuthInterceptor { @@ -96,6 +98,12 @@ class VerifySessionInteractiveTest : VerificationTestBase() { uiTestBase.login(userId = userId, password = password, homeServerUrl = homeServerUrl) + withIdlingResource(activityIdlingResource(AnalyticsOptInActivity::class.java)) { + onView(withId(R.id.later)) + .check(matches(isDisplayed())) + .perform(click()) + } + // Thread.sleep(6000) withIdlingResource(activityIdlingResource(HomeActivity::class.java)) { onView(withId(R.id.roomListContainer)) @@ -241,7 +249,7 @@ class VerifySessionInteractiveTest : VerificationTestBase() { .perform(click()) } - fun verificationStateIdleResource(transactionId: String, checkForState: VerificationTxState, session: Session): IdlingResource { + private fun verificationStateIdleResource(transactionId: String, checkForState: VerificationTxState, session: Session): IdlingResource { val idle = object : IdlingResource, VerificationService.Listener { private var callback: IdlingResource.ResourceCallback? = null diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt index 53e088118b4..cfaeeabec78 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt @@ -37,6 +37,7 @@ import com.adevinta.android.barista.internal.viewaction.SleepViewAction import im.vector.app.core.resources.StringProvider import im.vector.app.core.utils.getMatrixInstance import im.vector.app.features.MainActivity +import im.vector.app.features.analytics.ui.consent.AnalyticsOptInActivity import im.vector.app.features.crypto.quads.SharedSecureStorageActivity import im.vector.app.features.crypto.recover.BootstrapCrossSigningTask import im.vector.app.features.crypto.recover.Params @@ -44,9 +45,9 @@ import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.home.HomeActivity import kotlinx.coroutines.runBlocking import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test +import org.junit.rules.RuleChain import org.junit.runner.RunWith import org.matrix.android.sdk.api.auth.UIABaseAuth import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor @@ -59,14 +60,15 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @LargeTest -@Ignore class VerifySessionPassphraseTest : VerificationTestBase() { var existingSession: Session? = null val passphrase = "person woman camera tv" @get:Rule - val activityRule = ActivityScenarioRule(MainActivity::class.java) + val testRule: RuleChain = RuleChain + .outerRule(ActivityScenarioRule(MainActivity::class.java)) + .around(ClearCurrentSessionRule()) @Before fun createSessionWithCrossSigningAnd4S() { @@ -74,7 +76,7 @@ class VerifySessionPassphraseTest : VerificationTestBase() { val matrix = getMatrixInstance() val userName = "foobar_${Random.nextLong()}" existingSession = createAccountAndSync(matrix, userName, password, true) - doSync { + doSync { existingSession!!.cryptoService().crossSigningService() .initializeCrossSigning( object : UserInteractiveAuthInterceptor { @@ -120,6 +122,12 @@ class VerifySessionPassphraseTest : VerificationTestBase() { uiTestBase.login(userId = userId, password = password, homeServerUrl = homeServerUrl) + withIdlingResource(activityIdlingResource(AnalyticsOptInActivity::class.java)) { + onView(withId(R.id.later)) + .check(matches(isDisplayed())) + .perform(click()) + } + // Thread.sleep(6000) withIdlingResource(activityIdlingResource(HomeActivity::class.java)) { onView(withId(R.id.roomListContainer)) From b58f98a39c63d93a72ba3b301dbb5cf3ba656f75 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Mon, 10 Oct 2022 18:48:34 +0530 Subject: [PATCH 2/8] Accept verification request on existing session in verification test --- .../app/VerifySessionInteractiveTest.kt | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt index 5ca70842bbc..195f245b756 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt @@ -147,13 +147,19 @@ class VerifySessionInteractiveTest : VerificationTestBase() { onView(withId(R.id.bottomSheetFragmentContainer)) .check(matches(not(hasDescendant(withText(R.string.verification_cannot_access_other_session))))) - val request = existingSession!!.cryptoService().verificationService().requestKeyVerification( - listOf(VerificationMethod.SAS, VerificationMethod.QR_CODE_SCAN, VerificationMethod.QR_CODE_SHOW), - existingSession!!.myUserId, - listOf(uiSession.sessionParams.deviceId!!) + val incomingRequest = existingSession!!.cryptoService().verificationService().getExistingVerificationRequests(existingSession!!.myUserId).first { + it.requestInfo?.fromDevice == uiSession.sessionParams.deviceId + } + + existingSession!!.cryptoService().verificationService().readyPendingVerification( + listOf( + VerificationMethod.SAS, + VerificationMethod.QR_CODE_SCAN, + VerificationMethod.QR_CODE_SHOW + ), existingSession!!.myUserId, incomingRequest.transactionId!! ) - val transactionId = request.transactionId!! + val transactionId = incomingRequest.transactionId!! val sasReadyIdle = verificationStateIdleResource(transactionId, VerificationTxState.ShortCodeReady, uiSession) val otherSessionSasReadyIdle = verificationStateIdleResource(transactionId, VerificationTxState.ShortCodeReady, existingSession!!) @@ -161,7 +167,7 @@ class VerifySessionInteractiveTest : VerificationTestBase() { // Assert QR code option is there and available onView(withId(R.id.bottomSheetVerificationRecyclerView)) - .check(matches(hasDescendant(withText(R.string.verification_scan_their_code)))) + .check(matches(hasDescendant(withText(R.string.verification_scan_with_this_device)))) onView(withId(R.id.bottomSheetVerificationRecyclerView)) .check(matches(hasDescendant(withId(R.id.itemVerificationQrCodeImage)))) @@ -181,7 +187,7 @@ class VerifySessionInteractiveTest : VerificationTestBase() { IdlingRegistry.getInstance().register(sasReadyIdle) IdlingRegistry.getInstance().register(otherSessionSasReadyIdle) - onView(isRoot()).perform(SleepViewAction.sleep(300)) + onView(isRoot()).perform(SleepViewAction.sleep(1000)) // will only execute when Idle is ready val expectedEmojis = firstSessionTr.getEmojiCodeRepresentation() val targets = listOf(R.id.emoji0, R.id.emoji1, R.id.emoji2, R.id.emoji3, R.id.emoji4, R.id.emoji5, R.id.emoji6) From 99e729334cf424b4e362270585a72cdcd3dcd571 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Mon, 10 Oct 2022 21:58:49 +0530 Subject: [PATCH 3/8] Clear current session after each instrumentation test --- .../java/im/vector/app/CantVerifyTest.kt | 22 +++++++++++++++++- .../im/vector/app/ClearCurrentSessionRule.kt | 3 ++- .../im/vector/app/SecurityBootstrapTest.kt | 8 ++++++- .../im/vector/app/VerificationTestBase.kt | 23 +++++++++++++++++++ .../app/VerifySessionInteractiveTest.kt | 6 +++++ .../vector/app/VerifySessionPassphraseTest.kt | 4 ++++ 6 files changed, 63 insertions(+), 3 deletions(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt b/vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt index 6f9d6cdde97..93204e1fc0e 100644 --- a/vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt @@ -17,15 +17,21 @@ package im.vector.app import android.view.View +import androidx.datastore.preferences.core.edit import androidx.test.espresso.Espresso import androidx.test.espresso.assertion.ViewAssertions import androidx.test.espresso.matcher.ViewMatchers import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest +import androidx.test.platform.app.InstrumentationRegistry import com.adevinta.android.barista.internal.viewaction.SleepViewAction +import dagger.hilt.EntryPoints +import im.vector.app.core.di.SingletonEntryPoint import im.vector.app.features.MainActivity import im.vector.app.ui.robot.ElementRobot +import kotlinx.coroutines.runBlocking +import org.junit.After import org.junit.Rule import org.junit.Test import org.junit.rules.RuleChain @@ -39,7 +45,6 @@ class CantVerifyTest { @get:Rule val testRule = RuleChain .outerRule(ActivityScenarioRule(MainActivity::class.java)) - .around(ClearCurrentSessionRule()) private val elementRobot = ElementRobot() var userName: String = "loginTest_${UUID.randomUUID()}" @@ -76,4 +81,19 @@ class CantVerifyTest { Espresso.onView(ViewMatchers.withText(R.string.bottom_sheet_setup_secure_backup_title)) .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) } + + @After + fun tearDown() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + runBlocking { + reflectAnalyticDatastore(context).edit { it.clear() } + runCatching { + val entryPoint = EntryPoints.get(context.applicationContext, SingletonEntryPoint::class.java) + val sessionHolder = entryPoint.activeSessionHolder() + sessionHolder.getSafeActiveSession()?.signOutService()?.signOut(true) + entryPoint.vectorPreferences().clearPreferences() + sessionHolder.clearActiveSession() + } + } + } } diff --git a/vector-app/src/androidTest/java/im/vector/app/ClearCurrentSessionRule.kt b/vector-app/src/androidTest/java/im/vector/app/ClearCurrentSessionRule.kt index f09e5229322..5b46016989b 100644 --- a/vector-app/src/androidTest/java/im/vector/app/ClearCurrentSessionRule.kt +++ b/vector-app/src/androidTest/java/im/vector/app/ClearCurrentSessionRule.kt @@ -36,6 +36,7 @@ import kotlin.reflect.KClass * The VectorPreferences and AnalyticsDatastore are also cleared in an attempt to recreate a fresh base. */ class ClearCurrentSessionRule : TestWatcher() { + override fun apply(base: Statement, description: Description): Statement { val context = InstrumentationRegistry.getInstrumentation().targetContext runBlocking { @@ -59,7 +60,7 @@ private fun KClass<*>.asTopLevel() = Class.forName("${qualifiedName}Kt") * via reflection to avoid exposing property to all callers. */ @Suppress("UNCHECKED_CAST") -private fun reflectAnalyticDatastore(context: Context): DataStore { +fun reflectAnalyticDatastore(context: Context): DataStore { val klass = AnalyticsStore::class.asTopLevel() val method = klass.getMethod("access\$getDataStore", Context::class.java) return method.invoke(klass, context) as DataStore diff --git a/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt b/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt index 1243758b2f7..e0aed2527fa 100644 --- a/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt @@ -40,6 +40,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import im.vector.app.core.utils.getMatrixInstance import im.vector.app.features.MainActivity +import im.vector.app.features.analytics.ui.consent.AnalyticsOptInActivity import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.home.HomeActivity import org.hamcrest.CoreMatchers.not @@ -53,7 +54,6 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @LargeTest -@Ignore class SecurityBootstrapTest : VerificationTestBase() { var existingSession: Session? = null @@ -82,6 +82,12 @@ class SecurityBootstrapTest : VerificationTestBase() { uiTestBase.login(userId = userId, password = password, homeServerUrl = homeServerUrl) + withIdlingResource(activityIdlingResource(AnalyticsOptInActivity::class.java)) { + onView(withId(R.id.later)) + .check(matches(isDisplayed())) + .perform(click()) + } + // Thread.sleep(6000) withIdlingResource(activityIdlingResource(HomeActivity::class.java)) { onView(withId(R.id.roomListContainer)) diff --git a/vector-app/src/androidTest/java/im/vector/app/VerificationTestBase.kt b/vector-app/src/androidTest/java/im/vector/app/VerificationTestBase.kt index f8ae32b425f..0b8c1d4809c 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerificationTestBase.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerificationTestBase.kt @@ -17,7 +17,11 @@ package im.vector.app import android.net.Uri +import androidx.datastore.preferences.core.edit import androidx.lifecycle.Observer +import androidx.test.platform.app.InstrumentationRegistry +import dagger.hilt.EntryPoints +import im.vector.app.core.di.SingletonEntryPoint import im.vector.app.ui.robot.OnboardingRobot import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers @@ -25,6 +29,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout +import org.junit.After import org.junit.Assert import org.matrix.android.sdk.api.Matrix import org.matrix.android.sdk.api.MatrixCallback @@ -135,4 +140,22 @@ abstract class VerificationTestBase { lock.await(20_000, TimeUnit.MILLISECONDS) } + + /** + * Clears the session after every test. It is necessary to reset otherwise further UI tests fails. + */ + @After + fun tearDown() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + runBlocking { + reflectAnalyticDatastore(context).edit { it.clear() } + runCatching { + val entryPoint = EntryPoints.get(context.applicationContext, SingletonEntryPoint::class.java) + val sessionHolder = entryPoint.activeSessionHolder() + sessionHolder.getSafeActiveSession()?.signOutService()?.signOut(true) + entryPoint.vectorPreferences().clearPreferences() + sessionHolder.clearActiveSession() + } + } + } } diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt index 195f245b756..990a4964a37 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt @@ -17,6 +17,7 @@ package im.vector.app import android.view.View +import androidx.datastore.preferences.core.edit import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.IdlingRegistry @@ -33,12 +34,17 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest +import androidx.test.platform.app.InstrumentationRegistry import com.adevinta.android.barista.internal.viewaction.SleepViewAction +import dagger.hilt.EntryPoints +import im.vector.app.core.di.SingletonEntryPoint import im.vector.app.core.utils.getMatrixInstance import im.vector.app.features.MainActivity import im.vector.app.features.analytics.ui.consent.AnalyticsOptInActivity import im.vector.app.features.home.HomeActivity +import kotlinx.coroutines.runBlocking import org.hamcrest.CoreMatchers.not +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt index cfaeeabec78..5570b40829c 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt @@ -17,6 +17,7 @@ package im.vector.app import android.view.View +import androidx.datastore.preferences.core.edit import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -34,6 +35,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import androidx.test.platform.app.InstrumentationRegistry import com.adevinta.android.barista.internal.viewaction.SleepViewAction +import dagger.hilt.EntryPoints +import im.vector.app.core.di.SingletonEntryPoint import im.vector.app.core.resources.StringProvider import im.vector.app.core.utils.getMatrixInstance import im.vector.app.features.MainActivity @@ -44,6 +47,7 @@ import im.vector.app.features.crypto.recover.Params import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.home.HomeActivity import kotlinx.coroutines.runBlocking +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test From a5b0ba656d0b706f889adfd9f628fad087f93b0a Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Mon, 10 Oct 2022 22:52:56 +0530 Subject: [PATCH 4/8] Remove unused imports from tests --- .../androidTest/java/im/vector/app/SecurityBootstrapTest.kt | 1 - .../java/im/vector/app/VerifySessionInteractiveTest.kt | 6 ------ .../java/im/vector/app/VerifySessionPassphraseTest.kt | 4 ---- 3 files changed, 11 deletions(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt b/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt index e0aed2527fa..fea4bebd49f 100644 --- a/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt @@ -45,7 +45,6 @@ import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.home.HomeActivity import org.hamcrest.CoreMatchers.not import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt index 990a4964a37..195f245b756 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt @@ -17,7 +17,6 @@ package im.vector.app import android.view.View -import androidx.datastore.preferences.core.edit import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.IdlingRegistry @@ -34,17 +33,12 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest -import androidx.test.platform.app.InstrumentationRegistry import com.adevinta.android.barista.internal.viewaction.SleepViewAction -import dagger.hilt.EntryPoints -import im.vector.app.core.di.SingletonEntryPoint import im.vector.app.core.utils.getMatrixInstance import im.vector.app.features.MainActivity import im.vector.app.features.analytics.ui.consent.AnalyticsOptInActivity import im.vector.app.features.home.HomeActivity -import kotlinx.coroutines.runBlocking import org.hamcrest.CoreMatchers.not -import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt index 5570b40829c..cfaeeabec78 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt @@ -17,7 +17,6 @@ package im.vector.app import android.view.View -import androidx.datastore.preferences.core.edit import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -35,8 +34,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import androidx.test.platform.app.InstrumentationRegistry import com.adevinta.android.barista.internal.viewaction.SleepViewAction -import dagger.hilt.EntryPoints -import im.vector.app.core.di.SingletonEntryPoint import im.vector.app.core.resources.StringProvider import im.vector.app.core.utils.getMatrixInstance import im.vector.app.features.MainActivity @@ -47,7 +44,6 @@ import im.vector.app.features.crypto.recover.Params import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.home.HomeActivity import kotlinx.coroutines.runBlocking -import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test From 0933dd2c03485c6ef175b6da069994c51c93b1ab Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Mon, 10 Oct 2022 22:55:59 +0530 Subject: [PATCH 5/8] Clear current session on SecurityBootstrapTest --- .../androidTest/java/im/vector/app/SecurityBootstrapTest.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt b/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt index fea4bebd49f..a25c728a5db 100644 --- a/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt @@ -47,6 +47,7 @@ import org.hamcrest.CoreMatchers.not import org.junit.Before import org.junit.Rule import org.junit.Test +import org.junit.rules.RuleChain import org.junit.runner.RunWith import org.matrix.android.sdk.api.session.Session import kotlin.random.Random @@ -58,7 +59,9 @@ class SecurityBootstrapTest : VerificationTestBase() { var existingSession: Session? = null @get:Rule - val activityRule = ActivityScenarioRule(MainActivity::class.java) + val activityRule = RuleChain + .outerRule(ActivityScenarioRule(MainActivity::class.java)) + .around(ClearCurrentSessionRule()) @Before fun createSessionWithCrossSigning() { From f44f4e8d3dcb86a6e3b8e186e455cf6359ec6498 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Tue, 11 Oct 2022 13:43:05 +0530 Subject: [PATCH 6/8] Add comment about accepting verification request in existing session --- .../java/im/vector/app/VerifySessionInteractiveTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt index 195f245b756..f793e21e7cc 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt @@ -147,6 +147,8 @@ class VerifySessionInteractiveTest : VerificationTestBase() { onView(withId(R.id.bottomSheetFragmentContainer)) .check(matches(not(hasDescendant(withText(R.string.verification_cannot_access_other_session))))) + // The emulator at this point has sent requests to other sessions. + // Find the incoming request from the existing session and start the verification process. val incomingRequest = existingSession!!.cryptoService().verificationService().getExistingVerificationRequests(existingSession!!.myUserId).first { it.requestInfo?.fromDevice == uiSession.sessionParams.deviceId } From 64e84af37822c890ae5ca47e98d1318607cd7d69 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Thu, 13 Oct 2022 14:54:45 +0530 Subject: [PATCH 7/8] Avoid test flakyness --- .../java/im/vector/app/SecurityBootstrapTest.kt | 9 ++++----- .../java/im/vector/app/VerifySessionInteractiveTest.kt | 4 ++-- .../java/im/vector/app/VerifySessionPassphraseTest.kt | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt b/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt index a25c728a5db..8db126e9946 100644 --- a/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/SecurityBootstrapTest.kt @@ -45,23 +45,22 @@ import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.home.HomeActivity import org.hamcrest.CoreMatchers.not import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test -import org.junit.rules.RuleChain import org.junit.runner.RunWith import org.matrix.android.sdk.api.session.Session import kotlin.random.Random @RunWith(AndroidJUnit4::class) @LargeTest +@Ignore class SecurityBootstrapTest : VerificationTestBase() { var existingSession: Session? = null @get:Rule - val activityRule = RuleChain - .outerRule(ActivityScenarioRule(MainActivity::class.java)) - .around(ClearCurrentSessionRule()) + val activityRule = ActivityScenarioRule(MainActivity::class.java) @Before fun createSessionWithCrossSigning() { @@ -85,7 +84,7 @@ class SecurityBootstrapTest : VerificationTestBase() { uiTestBase.login(userId = userId, password = password, homeServerUrl = homeServerUrl) withIdlingResource(activityIdlingResource(AnalyticsOptInActivity::class.java)) { - onView(withId(R.id.later)) + onView(withId(R.id.submit)) .check(matches(isDisplayed())) .perform(click()) } diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt index f793e21e7cc..44637959215 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt @@ -99,7 +99,7 @@ class VerifySessionInteractiveTest : VerificationTestBase() { uiTestBase.login(userId = userId, password = password, homeServerUrl = homeServerUrl) withIdlingResource(activityIdlingResource(AnalyticsOptInActivity::class.java)) { - onView(withId(R.id.later)) + onView(withId(R.id.submit)) .check(matches(isDisplayed())) .perform(click()) } @@ -189,7 +189,7 @@ class VerifySessionInteractiveTest : VerificationTestBase() { IdlingRegistry.getInstance().register(sasReadyIdle) IdlingRegistry.getInstance().register(otherSessionSasReadyIdle) - onView(isRoot()).perform(SleepViewAction.sleep(1000)) + onView(isRoot()).perform(SleepViewAction.sleep(5000)) // will only execute when Idle is ready val expectedEmojis = firstSessionTr.getEmojiCodeRepresentation() val targets = listOf(R.id.emoji0, R.id.emoji1, R.id.emoji2, R.id.emoji3, R.id.emoji4, R.id.emoji5, R.id.emoji6) diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt index cfaeeabec78..afb43df11c0 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionPassphraseTest.kt @@ -123,7 +123,7 @@ class VerifySessionPassphraseTest : VerificationTestBase() { uiTestBase.login(userId = userId, password = password, homeServerUrl = homeServerUrl) withIdlingResource(activityIdlingResource(AnalyticsOptInActivity::class.java)) { - onView(withId(R.id.later)) + onView(withId(R.id.submit)) .check(matches(isDisplayed())) .perform(click()) } From 7c0862282f39f4add8a62290f8f6d107e79fd99c Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Fri, 14 Oct 2022 13:38:10 +0530 Subject: [PATCH 8/8] Increase view sleep time --- .../java/im/vector/app/VerifySessionInteractiveTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt index 44637959215..940d1c91ee8 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt @@ -165,7 +165,7 @@ class VerifySessionInteractiveTest : VerificationTestBase() { val sasReadyIdle = verificationStateIdleResource(transactionId, VerificationTxState.ShortCodeReady, uiSession) val otherSessionSasReadyIdle = verificationStateIdleResource(transactionId, VerificationTxState.ShortCodeReady, existingSession!!) - onView(isRoot()).perform(SleepViewAction.sleep(1000)) + onView(isRoot()).perform(SleepViewAction.sleep(5000)) // Assert QR code option is there and available onView(withId(R.id.bottomSheetVerificationRecyclerView))