diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 8c80dfc7..392060c2 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -275,7 +275,7 @@ jobs: name: Test Android modules with FTL results path: ~/artifacts - test_android_modules_wtf: + test_android_modules_wtf_coverage: if: needs.check_emulator_wtf_secrets.outputs.has-secrets == 'true' needs: [ prime_cache, check_emulator_wtf_secrets ] runs-on: ubuntu-latest @@ -290,13 +290,14 @@ jobs: timeout-minutes: 5 uses: ./.github/actions/setup - name: Build and test - timeout-minutes: 25 + timeout-minutes: 30 env: # Force blank suffix for screenshot tests ORG_GRADLE_PROJECT_ZCASH_DEBUG_APP_NAME_SUFFIX: "" ORG_GRADLE_PROJECT_ZCASH_EMULATOR_WTF_API_KEY: ${{ secrets.EMULATOR_WTF_API_KEY }} + ORG_GRADLE_PROJECT_IS_ANDROID_INSTRUMENTATION_TEST_COVERAGE_ENABLED: true run: | - ./gradlew testDebugWithEmulatorWtf :app:testZcashmainnetDebugWithEmulatorWtf :ui-integration-test:testZcashmainnetDebugWithEmulatorWtf :ui-screenshot-test:testZcashmainnetDebugWithEmulatorWtf + ./gradlew testDebugWithEmulatorWtf :ui-integration-test:testZcashmainnetDebugWithEmulatorWtf - name: Collect Artifacts if: ${{ always() }} timeout-minutes: 1 @@ -312,9 +313,48 @@ jobs: uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce timeout-minutes: 1 with: - name: Test Android modules with WTF results + name: Test Android libs with WTF results path: ~/artifacts + test_android_modules_wtf_no_coverage: + if: needs.check_emulator_wtf_secrets.outputs.has-secrets == 'true' + needs: [ prime_cache, check_emulator_wtf_secrets ] + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout + timeout-minutes: 1 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c + - name: Setup + id: setup + timeout-minutes: 5 + uses: ./.github/actions/setup + - name: Build and test + timeout-minutes: 30 + env: + # Force blank suffix for screenshot tests + ORG_GRADLE_PROJECT_ZCASH_DEBUG_APP_NAME_SUFFIX: "" + ORG_GRADLE_PROJECT_ZCASH_EMULATOR_WTF_API_KEY: ${{ secrets.EMULATOR_WTF_API_KEY }} + run: | + ./gradlew :app:testZcashmainnetDebugWithEmulatorWtf :ui-screenshot-test:testZcashmainnetDebugWithEmulatorWtf + - name: Collect Artifacts + if: ${{ always() }} + timeout-minutes: 1 + env: + ARTIFACTS_DIR_PATH: ${{ format('{0}/artifacts', env.home) }} + TEST_RESULTS_ZIP_PATH: ${{ format('{0}/artifacts/test_results.zip', env.home) }} + run: | + mkdir ${ARTIFACTS_DIR_PATH} + + zip -r ${TEST_RESULTS_ZIP_PATH} . -i \*/build/test-results/\* + - name: Upload Artifacts + if: ${{ always() }} + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb + timeout-minutes: 1 + with: + name: Test Android app with WTF results + path: ~/artifacts # Performs a button mash test on the debug build of the app with strict mode enabled test_robo_debug: diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 14772b3c..94264182 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,9 +23,19 @@ android { versionCode = project.property("ZCASH_VERSION_CODE").toString().toInt() versionName = project.property("ZCASH_VERSION_NAME").toString() + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { + testInstrumentationRunnerArguments["clearPackageData"] = "true" + } + testInstrumentationRunner = "co.electriccoin.zcash.test.ZcashUiTestRunner" } + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { + testOptions { + execution = "ANDROIDX_TEST_ORCHESTRATOR" + } + } + compileOptions { isCoreLibraryDesugaringEnabled = true } @@ -160,6 +170,10 @@ android { enabled.set(false) } } + + testCoverage { + jacocoVersion = project.property("JACOCO_VERSION").toString() + } } dependencies { @@ -180,6 +194,12 @@ dependencies { androidTestImplementation(projects.testLib) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { @@ -234,7 +254,6 @@ if (googlePlayServiceKeyFilePath.isNotEmpty()) { } } - fladle { // Firebase Test Lab has min and max values that might differ from our project's // These are determined by `gcloud firebase test android models list` diff --git a/app/src/androidTest/AndroidManifest.xml b/app/src/androidTest/AndroidManifest.xml index e1000761..2adb9f36 100644 --- a/app/src/androidTest/AndroidManifest.xml +++ b/app/src/androidTest/AndroidManifest.xml @@ -1,4 +1,13 @@ - + + + + + + diff --git a/build-conventions-secant/src/main/kotlin/secant.android-build-conventions.gradle.kts b/build-conventions-secant/src/main/kotlin/secant.android-build-conventions.gradle.kts index 94417383..8726267b 100644 --- a/build-conventions-secant/src/main/kotlin/secant.android-build-conventions.gradle.kts +++ b/build-conventions-secant/src/main/kotlin/secant.android-build-conventions.gradle.kts @@ -18,6 +18,7 @@ pluginManager.withPlugin("com.android.application") { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments["useTestStorageService"] = "true" if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { testInstrumentationRunnerArguments["clearPackageData"] = "true" } @@ -42,6 +43,7 @@ pluginManager.withPlugin("com.android.library") { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("proguard-consumer.txt") + testInstrumentationRunnerArguments["useTestStorageService"] = "true" if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { testInstrumentationRunnerArguments["clearPackageData"] = "true" } @@ -67,6 +69,11 @@ pluginManager.withPlugin("com.android.test") { resourceConfigurations.addAll(listOf("en", "en-rUS", "en-rGB", "en-rAU", "en_XA", "ar_XB")) testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + testInstrumentationRunnerArguments["useTestStorageService"] = "true" + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { + testInstrumentationRunnerArguments["clearPackageData"] = "true" + } } testCoverage { jacocoVersion = project.property("JACOCO_VERSION").toString() @@ -87,8 +94,11 @@ fun com.android.build.gradle.BaseExtension.configureBaseExtension(isLibrary: Boo buildTypes { getByName("debug").apply { - isTestCoverageEnabled = + val coverageEnabled = project.property("IS_ANDROID_INSTRUMENTATION_TEST_COVERAGE_ENABLED").toString().toBoolean() + isTestCoverageEnabled = coverageEnabled + enableAndroidTestCoverage = coverageEnabled + enableUnitTestCoverage = coverageEnabled } } diff --git a/build-conventions-secant/src/main/kotlin/secant.emulator-wtf-conventions.gradle.kts b/build-conventions-secant/src/main/kotlin/secant.emulator-wtf-conventions.gradle.kts index 6c255a53..29e9a889 100644 --- a/build-conventions-secant/src/main/kotlin/secant.emulator-wtf-conventions.gradle.kts +++ b/build-conventions-secant/src/main/kotlin/secant.emulator-wtf-conventions.gradle.kts @@ -1,3 +1,6 @@ +import com.android.build.gradle.internal.cxx.configure.buildTypeOf +import com.android.build.gradle.internal.dsl.decorator.androidPluginDslDecorator + // Emulator WTF has min and max values that might differ from our project's // These are determined by `ew-cli --models` @@ -16,6 +19,11 @@ pluginManager.withPlugin("wtf.emulator.gradle") { token.set(tokenString) } + if (project.properties["IS_ANDROID_INSTRUMENTATION_TEST_COVERAGE_ENABLED"].toString().toBoolean()) { + withCoverage.set(true) + environmentVariables.set(mapOf("useTestStorageService" to "false")) + } + val buildMinSdk = if (pluginManager.hasPlugin("com.android.application")) { project.properties["ANDROID_APP_MIN_SDK_VERSION"].toString().toInt() } else if (pluginManager.hasPlugin("com.android.test")) { diff --git a/build.gradle.kts b/build.gradle.kts index 56a9bf26..823b8d3a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import kotlinx.kover.api.KoverMergedConfig + buildscript { dependencyLocking { // This property is treated specially, as it is not defined by default in the root gradle.properties @@ -124,21 +126,30 @@ fladle { } kover { - isDisabled = !project.property("IS_KOTLIN_TEST_COVERAGE_ENABLED").toString().toBoolean() + isDisabled.set(!project.property("IS_KOTLIN_TEST_COVERAGE_ENABLED").toString().toBoolean()) + engine.set(kotlinx.kover.api.JacocoEngine(project.property("JACOCO_VERSION").toString())) // Don't run on the Android projects, as they have coverage generated in a different way // through Android's instrumented tests - disabledProjects = setOf( - "app", - "crash-android-lib", - "preference-impl-android-lib", - "sdk-ext-lib", - "sdk-ext-ui-lib", - "spackle-android-lib", - "test-lib", - "ui-design-lib", - "ui-integration-test", - "ui-lib", - "ui-screenshot-test", - ) + extensions.configure { + enable() + filters { + projects { + excludes.addAll(setOf( + "app", + "crash-android-lib", + "preference-impl-android-lib", + "sdk-ext-lib", + "sdk-ext-ui-lib", + "spackle-android-lib", + "test-lib", + "ui-benchmark-test", + "ui-design-lib", + "ui-integration-test", + "ui-lib", + "ui-screenshot-test" + )) + } + } + } } diff --git a/buildscript-gradle.lockfile b/buildscript-gradle.lockfile index 9742e8e4..c6bf2684 100644 --- a/buildscript-gradle.lockfile +++ b/buildscript-gradle.lockfile @@ -147,13 +147,13 @@ org.jetbrains.kotlin:kotlin-stdlib:1.7.10=classpath org.jetbrains.kotlin:kotlin-tooling-core:1.7.21=classpath org.jetbrains.kotlin:kotlin-util-io:1.7.21=classpath org.jetbrains.kotlin:kotlin-util-klib:1.7.21=classpath -org.jetbrains.kotlinx.kover:org.jetbrains.kotlinx.kover.gradle.plugin:0.5.1=classpath +org.jetbrains.kotlinx.kover:org.jetbrains.kotlinx.kover.gradle.plugin:0.6.1=classpath org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=classpath org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.1.0=classpath org.jetbrains.kotlinx:kotlinx-serialization-core:1.1.0=classpath org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.1.0=classpath org.jetbrains.kotlinx:kotlinx-serialization-json:1.1.0=classpath -org.jetbrains.kotlinx:kover:0.5.1=classpath +org.jetbrains.kotlinx:kover:0.6.1=classpath org.jetbrains:annotations:13.0=classpath org.json:json:20180813=classpath org.jvnet.staxex:stax-ex:1.8.1=classpath diff --git a/crash-android-lib/build.gradle.kts b/crash-android-lib/build.gradle.kts index eaff161b..8c7e8df5 100644 --- a/crash-android-lib/build.gradle.kts +++ b/crash-android-lib/build.gradle.kts @@ -38,6 +38,12 @@ dependencies { androidTestImplementation(libs.bundles.androidx.test) androidTestImplementation(libs.kotlinx.coroutines.test) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + androidTestUtil(libs.androidx.test.orchestrator) { artifact { type = "apk" diff --git a/crash-android-lib/src/androidTest/AndroidManifest.xml b/crash-android-lib/src/androidTest/AndroidManifest.xml index b03c811c..45cb53e0 100644 --- a/crash-android-lib/src/androidTest/AndroidManifest.xml +++ b/crash-android-lib/src/androidTest/AndroidManifest.xml @@ -1,6 +1,12 @@ - + + + + + diff --git a/docs/testing/Testing.md b/docs/testing/Testing.md index 571b673c..a738d8bc 100644 --- a/docs/testing/Testing.md +++ b/docs/testing/Testing.md @@ -7,6 +7,9 @@ This documentation outlines our approach to testing. By running tests against ou + + + ## Manual testing We aim to automate as much as we possibly can. Still manual testing is really important for Quality Assurance. diff --git a/gradle.properties b/gradle.properties index d7f7b375..d83c27eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,6 +20,9 @@ IS_KOTLIN_TEST_COVERAGE_ENABLED=true # Optionally configure Android instumentation test coverage. # The app module will crash at launch when coverage is enabled, so coverage is only enabled explicitly for tests. +# generation of instrumentation coverage is flaky, particularly when running ui-lib:connectedCheck +# TODO: [#705] Instrumentation coverage generation fails when run locally +# TODO: [#705] https://github.com/zcash/secant-android-wallet/issues/705 IS_ANDROID_INSTRUMENTATION_TEST_COVERAGE_ENABLED=false # Optionally configure test orchestrator. @@ -131,6 +134,7 @@ ANDROIDX_TEST_CORE_VERSION=1.5.0 ANDROIDX_TEST_MACROBENCHMARK_VERSION=1.2.0-alpha08 ANDROIDX_TEST_RUNNER_VERSION=1.5.1 ANDROIDX_STARTUP_VERSION=1.1.1 +ANDROIDX_TEST_SERVICE_VERSION=1.4.2 ANDROIDX_UI_AUTOMATOR_VERSION=2.2.0-alpha1 ANDROIDX_WORK_MANAGER_VERSION=2.7.1 CORE_LIBRARY_DESUGARING_VERSION=1.1.6 @@ -138,7 +142,7 @@ JACOCO_VERSION=0.8.8 KOTLIN_VERSION=1.7.21 KOTLINX_COROUTINES_VERSION=1.6.4 KOTLINX_DATETIME_VERSION=0.4.0 -KOVER_VERSION=0.5.1 +KOVER_VERSION=0.6.1 PLAY_APP_UPDATE_VERSION=2.0.1 PLAY_APP_UPDATE_KTX_VERSION=2.0.1 ZCASH_ANDROID_WALLET_PLUGINS_VERSION=1.0.0 diff --git a/preference-impl-android-lib/build.gradle.kts b/preference-impl-android-lib/build.gradle.kts index 528eeb4e..a4b78729 100644 --- a/preference-impl-android-lib/build.gradle.kts +++ b/preference-impl-android-lib/build.gradle.kts @@ -34,6 +34,12 @@ dependencies { androidTestImplementation(libs.bundles.androidx.test) androidTestImplementation(libs.kotlinx.coroutines.test) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (isOrchestratorEnabled) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { diff --git a/preference-impl-android-lib/src/androidTest/AndroidManifest.xml b/preference-impl-android-lib/src/androidTest/AndroidManifest.xml index 171f4494..f2be2b39 100644 --- a/preference-impl-android-lib/src/androidTest/AndroidManifest.xml +++ b/preference-impl-android-lib/src/androidTest/AndroidManifest.xml @@ -1,6 +1,14 @@ - + + + + + diff --git a/sdk-ext-lib/build.gradle.kts b/sdk-ext-lib/build.gradle.kts index 7136807c..ff0c0f05 100644 --- a/sdk-ext-lib/build.gradle.kts +++ b/sdk-ext-lib/build.gradle.kts @@ -22,6 +22,12 @@ dependencies { androidTestImplementation(libs.kotlinx.coroutines.test) androidTestImplementation(libs.kotlin.test) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { diff --git a/sdk-ext-lib/src/androidTest/AndroidManifest.xml b/sdk-ext-lib/src/androidTest/AndroidManifest.xml index 39329493..c4b6dc1b 100644 --- a/sdk-ext-lib/src/androidTest/AndroidManifest.xml +++ b/sdk-ext-lib/src/androidTest/AndroidManifest.xml @@ -1,7 +1,13 @@ + + + + + android:label="sdk-ext-test" + android:requestLegacyExternalStorage="true" /> diff --git a/sdk-ext-ui-lib/build.gradle.kts b/sdk-ext-ui-lib/build.gradle.kts index c96c7b94..86f9e746 100644 --- a/sdk-ext-ui-lib/build.gradle.kts +++ b/sdk-ext-ui-lib/build.gradle.kts @@ -26,6 +26,12 @@ dependencies { androidTestImplementation(libs.bundles.androidx.test) androidTestImplementation(libs.kotlin.test) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { diff --git a/sdk-ext-ui-lib/src/androidTest/AndroidManifest.xml b/sdk-ext-ui-lib/src/androidTest/AndroidManifest.xml index 9e98bd6f..49bef3a5 100644 --- a/sdk-ext-ui-lib/src/androidTest/AndroidManifest.xml +++ b/sdk-ext-ui-lib/src/androidTest/AndroidManifest.xml @@ -1,7 +1,15 @@ - + + + + + + android:label="sdk-ext-ui-test" + android:requestLegacyExternalStorage="true" /> diff --git a/settings.gradle.kts b/settings.gradle.kts index 5b718d93..0bf859ff 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -163,6 +163,7 @@ dependencyResolutionManagement { val androidxTestJunitVersion = extra["ANDROIDX_TEST_JUNIT_VERSION"].toString() val androidxTestMacrobenchmarkVersion = extra["ANDROIDX_TEST_MACROBENCHMARK_VERSION"].toString() val androidxTestOrchestratorVersion = extra["ANDROIDX_TEST_ORCHESTRATOR_VERSION"].toString() + val androidxTestServices = extra["ANDROIDX_TEST_SERVICE_VERSION"].toString() val androidxTestRunnerVersion = extra["ANDROIDX_TEST_RUNNER_VERSION"].toString() val androidxUiAutomatorVersion = extra["ANDROIDX_UI_AUTOMATOR_VERSION"].toString() val androidxWorkManagerVersion = extra["ANDROIDX_WORK_MANAGER_VERSION"].toString() @@ -239,9 +240,9 @@ dependencyResolutionManagement { library("androidx-test-macrobenchmark", "androidx.benchmark:benchmark-macro-junit4:$androidxTestMacrobenchmarkVersion") library("androidx-test-orchestrator", "androidx.test:orchestrator:$androidxTestOrchestratorVersion") library("androidx-test-runner", "androidx.test:runner:$androidxTestRunnerVersion") + library("androidx-test-services","androidx.test.services:test-services:$androidxTestServices") library("androidx-uiAutomator", "androidx.test.uiautomator:uiautomator-v18:$androidxUiAutomatorVersion") library("kotlinx-coroutines-test", "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinxCoroutinesVersion") - // Bundles bundle( "androidx-camera", diff --git a/spackle-android-lib/build.gradle.kts b/spackle-android-lib/build.gradle.kts index c4b0a75e..d1077fe6 100644 --- a/spackle-android-lib/build.gradle.kts +++ b/spackle-android-lib/build.gradle.kts @@ -29,6 +29,12 @@ dependencies { androidTestImplementation(libs.bundles.androidx.test) androidTestImplementation(libs.kotlinx.coroutines.test) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + androidTestUtil(libs.androidx.test.orchestrator) { artifact { type = "apk" diff --git a/spackle-android-lib/src/androidTest/AndroidManifest.xml b/spackle-android-lib/src/androidTest/AndroidManifest.xml index 171f4494..f2be2b39 100644 --- a/spackle-android-lib/src/androidTest/AndroidManifest.xml +++ b/spackle-android-lib/src/androidTest/AndroidManifest.xml @@ -1,6 +1,14 @@ - + + + + + diff --git a/ui-benchmark-test/build.gradle.kts b/ui-benchmark-test/build.gradle.kts index 857ef643..25e960d0 100644 --- a/ui-benchmark-test/build.gradle.kts +++ b/ui-benchmark-test/build.gradle.kts @@ -38,6 +38,12 @@ dependencies { implementation(libs.bundles.androidx.test) implementation(libs.androidx.test.macrobenchmark) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { diff --git a/ui-design-lib/build.gradle.kts b/ui-design-lib/build.gradle.kts index 99066d53..d0f5a9e9 100644 --- a/ui-design-lib/build.gradle.kts +++ b/ui-design-lib/build.gradle.kts @@ -42,6 +42,12 @@ dependencies { androidTestImplementation(libs.kotlin.reflect) androidTestImplementation(libs.kotlin.test) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { diff --git a/ui-integration-test/build.gradle.kts b/ui-integration-test/build.gradle.kts index 1210ef4f..5a997630 100644 --- a/ui-integration-test/build.gradle.kts +++ b/ui-integration-test/build.gradle.kts @@ -69,6 +69,12 @@ dependencies { implementation(libs.androidx.navigation.compose) implementation(libs.androidx.uiAutomator) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (isOrchestratorEnabled) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { diff --git a/ui-integration-test/src/main/AndroidManifest.xml b/ui-integration-test/src/main/AndroidManifest.xml index 3fb1ae21..7fbb014b 100644 --- a/ui-integration-test/src/main/AndroidManifest.xml +++ b/ui-integration-test/src/main/AndroidManifest.xml @@ -1,10 +1,16 @@ + + + + android:roundIcon="@mipmap/ic_launcher_round" + android:requestLegacyExternalStorage="true"> diff --git a/ui-lib/build.gradle.kts b/ui-lib/build.gradle.kts index f85de9a3..71259043 100644 --- a/ui-lib/build.gradle.kts +++ b/ui-lib/build.gradle.kts @@ -92,6 +92,12 @@ dependencies { androidTestImplementation(libs.kotlin.reflect) androidTestImplementation(libs.kotlin.test) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (project.property("IS_USE_TEST_ORCHESTRATOR").toString().toBoolean()) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { diff --git a/ui-lib/src/androidTest/AndroidManifest.xml b/ui-lib/src/androidTest/AndroidManifest.xml index 4e1cd806..ab0a13cf 100644 --- a/ui-lib/src/androidTest/AndroidManifest.xml +++ b/ui-lib/src/androidTest/AndroidManifest.xml @@ -2,8 +2,14 @@ + + + + + android:label="zcash-ui-test" + android:requestLegacyExternalStorage="true" > diff --git a/ui-screenshot-test/build.gradle.kts b/ui-screenshot-test/build.gradle.kts index ff31e490..aad0e2cf 100644 --- a/ui-screenshot-test/build.gradle.kts +++ b/ui-screenshot-test/build.gradle.kts @@ -70,6 +70,12 @@ dependencies { implementation(libs.androidx.startup) implementation(libs.androidx.uiAutomator) + androidTestUtil(libs.androidx.test.services) { + artifact { + type = "apk" + } + } + if (isOrchestratorEnabled) { androidTestUtil(libs.androidx.test.orchestrator) { artifact { diff --git a/ui-screenshot-test/src/main/AndroidManifest.xml b/ui-screenshot-test/src/main/AndroidManifest.xml index 16dc84a2..1c361547 100644 --- a/ui-screenshot-test/src/main/AndroidManifest.xml +++ b/ui-screenshot-test/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ -