diff --git a/.cirrus.yml b/.cirrus.yml index d150203a9..8ae8a2686 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,13 +1,61 @@ -task: - name: Build with AOSP - only_if: $CIRRUS_PR_LABELS =~ ".*aosp-build.*" - timeout_in: 70m - container: - image: ubuntu:23.04 - cpu: 8 - memory: 32G - build_script: - - ./.github/scripts/build_aosp.sh aosp_arm64 ap1a userdebug android-14.0.0_r29 +container: + image: ghcr.io/cirruslabs/android-sdk:34 + kvm: true + cpu: 8 + memory: 16G + +instrumentation_tests_task: + name: "Cirrus CI Instrumentation Tests" + start_avd_background_script: + sdkmanager --install "system-images;android-34;default;x86_64" "emulator"; + echo no | avdmanager create avd -n seedvault -k "system-images;android-34;default;x86_64"; + $ANDROID_HOME/emulator/emulator + -avd seedvault + -no-audio + -no-boot-anim + -gpu swiftshader_indirect + -no-snapshot + -no-window + -writable-system; + provision_avd_background_script: + wget https://github.com/seedvault-app/seedvault-test-data/releases/download/3/backup.tar.gz; + + adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'; + adb root; + sleep 5; + adb remount; + adb reboot; + adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'; + adb root; + sleep 5; + adb remount; + sleep 5; + assemble_script: + ./gradlew :app:assembleRelease :app:assembleAndroidTest + install_app_script: + timeout 180s bash -c 'while [[ -z $(adb shell mount | grep "/system " | grep "(rw,") ]]; do sleep 1; done;'; + adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'; + + adb shell mkdir -p /sdcard/seedvault_baseline; + adb push backup.tar.gz /sdcard/seedvault_baseline/backup.tar.gz; + adb shell tar xzf /sdcard/seedvault_baseline/backup.tar.gz --directory=/sdcard/seedvault_baseline; + + adb shell mkdir -p /system/priv-app/Seedvault; + adb push app/build/outputs/apk/release/app-release.apk /system/priv-app/Seedvault/Seedvault.apk; + adb push permissions_com.stevesoltys.seedvault.xml /system/etc/permissions/privapp-permissions-seedvault.xml; + adb push allowlist_com.stevesoltys.seedvault.xml /system/etc/sysconfig/allowlist-seedvault.xml; + adb shell bmgr enable true; + adb reboot; + adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'; + adb shell bmgr transport com.stevesoltys.seedvault.transport.ConfigurableBackupTransport; + adb reboot; + adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'; + run_large_tests_script: ./gradlew -Pinstrumented_test_size=large :app:connectedAndroidTest + run_medium_tests_script: ./gradlew -Pinstrumented_test_size=medium :app:connectedAndroidTest always: - seedvault_artifacts: - path: Seedvault.apk + pull_screenshots_script: + adb pull /sdcard/seedvault_test_results + screenshots_artifacts: + path: "seedvault_test_results/**/*.mp4" + logcat_artifacts: + path: "seedvault_test_results/**/*.log" diff --git a/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/LargeTestBase.kt b/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/LargeTestBase.kt index 467b5a283..822d2e9e3 100644 --- a/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/LargeTestBase.kt +++ b/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/LargeTestBase.kt @@ -49,14 +49,14 @@ internal interface LargeTestBase : KoinComponent { companion object { private const val TEST_STORAGE_FOLDER = "seedvault_test" - private const val TEST_VIDEO_FOLDER = "seedvault_test_results" + private const val TEST_RESULT_FOLDER = "seedvault_test_results" } val externalStorageDir: String get() = Environment.getExternalStorageDirectory().absolutePath val testStoragePath get() = "$externalStorageDir/$TEST_STORAGE_FOLDER" - val testVideoPath get() = "$externalStorageDir/$TEST_VIDEO_FOLDER" + val testResultPath get() = "$externalStorageDir/$TEST_RESULT_FOLDER" val targetContext: Context get() = InstrumentationRegistry.getInstrumentation().targetContext @@ -123,7 +123,7 @@ internal interface LargeTestBase : KoinComponent { keepRecordingScreen: AtomicBoolean, testName: String, ) { - val folder = testVideoPath + val folder = testResultPath runCommand("mkdir -p $folder") val fileName = testResultFilename(testName) @@ -149,7 +149,7 @@ internal interface LargeTestBase : KoinComponent { // write logcat to file val fileName = testResultFilename(testName) - runCommand("logcat -d -f $testVideoPath/$fileName.log") + runCommand("logcat -d -f $testResultPath/$fileName.log") } fun uninstallPackages(packages: Collection) { @@ -162,7 +162,7 @@ internal interface LargeTestBase : KoinComponent { fun clearTestBackups() { File(testStoragePath).deleteRecursively() - File(testVideoPath).deleteRecursively() + File(testResultPath).deleteRecursively() } fun changeBackupLocation( @@ -225,6 +225,7 @@ internal interface LargeTestBase : KoinComponent { fun confirmCode() { RecoveryCodeScreen { + startNewBackupButton.click() confirmCodeButton.click() verifyCodeButton.scrollTo().click() diff --git a/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/SeedvaultLargeTest.kt b/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/SeedvaultLargeTest.kt index 0c83cfa1a..8e5c79f75 100644 --- a/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/SeedvaultLargeTest.kt +++ b/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/SeedvaultLargeTest.kt @@ -45,9 +45,8 @@ internal abstract class SeedvaultLargeTest : clearTestBackups() runCommand("bmgr enable true") - sleep(60_000) runCommand("bmgr transport com.stevesoltys.seedvault.transport.ConfigurableBackupTransport") - sleep(60_000) + sleep(5000) startRecordingTest(keepRecordingScreen, name.methodName) restoreBaselineBackup() diff --git a/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/screen/impl/BackupScreen.kt b/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/screen/impl/BackupScreen.kt index 17cdfc640..65e9683ba 100644 --- a/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/screen/impl/BackupScreen.kt +++ b/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/screen/impl/BackupScreen.kt @@ -24,7 +24,7 @@ object BackupScreen : UiDeviceScreen() { val internalStorageButton = findObject { textContains(Build.MODEL) } - val useAnywayButton = findObject { text("USE ANYWAY") } + val useAnywayButton = findObject { text("Use anyway") } val initializingText: BySelector = By.textContains("Initializing backup location") } diff --git a/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/screen/impl/RecoveryCodeScreen.kt b/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/screen/impl/RecoveryCodeScreen.kt index 244ca24e2..391283c1a 100644 --- a/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/screen/impl/RecoveryCodeScreen.kt +++ b/app/src/androidTest/java/com/stevesoltys/seedvault/e2e/screen/impl/RecoveryCodeScreen.kt @@ -9,6 +9,8 @@ import com.stevesoltys.seedvault.e2e.screen.UiDeviceScreen object RecoveryCodeScreen : UiDeviceScreen() { + val startNewBackupButton = findObject { text("Start new") } + val confirmCodeButton = findObject { text("Confirm code") } val verifyCodeButton = findObject { text("Verify") }