diff --git a/app/src/androidTest/java/com/nextcloud/test/Flaky.kt b/app/src/androidTest/java/com/nextcloud/test/Flaky.kt new file mode 100644 index 000000000000..c4ae3ae7dadb --- /dev/null +++ b/app/src/androidTest/java/com/nextcloud/test/Flaky.kt @@ -0,0 +1,11 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +package com.nextcloud.test + +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) +annotation class Flaky(val reason: String) diff --git a/app/src/androidTest/java/com/nextcloud/ui/SetStatusMessageBottomSheetIT.kt b/app/src/androidTest/java/com/nextcloud/ui/SetStatusMessageBottomSheetIT.kt index 98fdb71dfd6e..96d679cb23fc 100644 --- a/app/src/androidTest/java/com/nextcloud/ui/SetStatusMessageBottomSheetIT.kt +++ b/app/src/androidTest/java/com/nextcloud/ui/SetStatusMessageBottomSheetIT.kt @@ -15,6 +15,7 @@ import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.rule.GrantPermissionRule +import com.nextcloud.test.Flaky import com.nextcloud.test.GrantTestPermissionRule import com.owncloud.android.AbstractIT import com.owncloud.android.R @@ -31,6 +32,7 @@ class SetStatusMessageBottomSheetIT : AbstractIT() { val permissionRule: GrantPermissionRule = GrantTestPermissionRule.grantStorageAndNotification() @Test + @Flaky(reason = "Bottom sheet is occasionally not rendered before the assertions run") fun open() { launchActivity().use { scenario -> onView(isRoot()).check(matches(isDisplayed())) diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.kt b/app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.kt index 38041c714ff4..b02e0c5ad76f 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.kt @@ -20,6 +20,7 @@ import androidx.test.rule.GrantPermissionRule import com.nextcloud.client.account.User import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.account.UserAccountManagerImpl +import com.nextcloud.test.Flaky import com.nextcloud.test.GrantTestPermissionRule import com.nextcloud.test.RetryTestRule import com.owncloud.android.AbstractIT @@ -42,6 +43,7 @@ class DrawerActivityIT : AbstractIT() { val permissionRule: GrantPermissionRule = GrantTestPermissionRule.grantStorageAndNotification() @Test + @Flaky(reason = "Account switch relaunches FileDisplayActivity, which races with the drawer assertions") fun switchAccountViaAccountList() { // Switching accounts finishes and relaunches FileDisplayActivity (see // FileDisplayActivity.handleRestartIntent). That self-relaunch is incompatible with diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivityIT.kt b/app/src/androidTest/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivityIT.kt index f4dca3d7e8bc..51e534bdb5ff 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivityIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivityIT.kt @@ -25,6 +25,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import com.facebook.testing.screenshot.internal.TestNameDetector import com.nextcloud.client.preferences.AppPreferencesImpl +import com.nextcloud.test.Flaky import com.nextcloud.test.GrantStoragePermissionRule import com.nextcloud.test.withSelectedText import com.nextcloud.utils.extensions.removeFileExtension @@ -104,6 +105,7 @@ class ReceiveExternalFilesActivityIT : AbstractIT() { } @Test + @Flaky(reason = "Rename dialog text selection is not settled when the assertions run") fun renameSingleFileUpload() { val imageFile = getDummyFile("image.jpg") val intent = createSendIntent(imageFile) diff --git a/app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt b/app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt index 2fcd9ac11f06..7176d8d9f80a 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt @@ -27,6 +27,7 @@ import com.google.android.apps.common.testing.accessibility.framework.Accessibil import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesViews import com.google.android.material.floatingactionbutton.FloatingActionButton import com.nextcloud.android.lib.resources.files.FileDownloadLimit +import com.nextcloud.test.Flaky import com.nextcloud.test.RetryTestRule import com.nextcloud.test.TestActivity import com.owncloud.android.AbstractIT @@ -636,6 +637,7 @@ class FileDetailSharingFragmentIT : AbstractIT() { // for send new email @Test @Suppress("MagicNumber") + @Flaky("not stable") fun userOptionMenuFileSendNewEmail() { launchActivity().use { scenario -> lateinit var sut: FileDetailSharingFragment @@ -662,6 +664,7 @@ class FileDetailSharingFragmentIT : AbstractIT() { // for advanced permissions @Test @Suppress("MagicNumber") + @Flaky("not stable") fun userOptionMenuFolderAdvancePermission() { launchActivity().use { scenario -> lateinit var sut: FileDetailSharingFragment @@ -757,6 +760,7 @@ class FileDetailSharingFragmentIT : AbstractIT() { // for send new email @Test @Suppress("MagicNumber") + @Flaky(reason = "Share option menu occasionally does not open before the assertions run") fun userOptionMenuFolderSendNewEmail() { launchActivity().use { scenario -> lateinit var sut: FileDetailSharingFragment diff --git a/scripts/runCombinedTest.sh b/scripts/runCombinedTest.sh index da44d3e3d488..b65aa64dd7c6 100755 --- a/scripts/runCombinedTest.sh +++ b/scripts/runCombinedTest.sh @@ -30,8 +30,12 @@ scripts/wait_for_emulator.sh || exit 1 adb logcat -c adb logcat > logcat.txt & LOGCAT_PID=$! +# Screenshot tests only run when updating/testing screenshots, tests annotated with +# com.nextcloud.test.Flaky are known to be unstable and must not block a pull request. +EXCLUDED_ANNOTATIONS="com.owncloud.android.utils.ScreenshotTest,com.nextcloud.test.Flaky" + ./gradlew createGplayDebugCoverageReport \ --Pcoverage -Pandroid.testInstrumentationRunnerArguments.notAnnotation=com.owncloud.android.utils.ScreenshotTest \ +-Pcoverage -Pandroid.testInstrumentationRunnerArguments.notAnnotation="$EXCLUDED_ANNOTATIONS" \ -Dorg.gradle.jvmargs="--add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.nio.channels=ALL-UNNAMED --add-exports java.base/sun.nio.ch=ALL-UNNAMED" stat=$?