From c851dd228b85d2a20aeb52e68891d4bfc4f392ed Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 18 Mar 2021 12:09:34 -0300 Subject: [PATCH 1/5] Add a different (faster) way to exclude large/slow tests --- .../Instrumentation_Tests__destroys_DB_.xml | 51 +++++++++++++++++++ .../media/PngSuiteImageCompressorTest.java | 3 ++ .../PngSuiteImageSizeCalculatorTest.java | 3 ++ 3 files changed, 57 insertions(+) create mode 100644 .idea/runConfigurations/Instrumentation_Tests__destroys_DB_.xml diff --git a/.idea/runConfigurations/Instrumentation_Tests__destroys_DB_.xml b/.idea/runConfigurations/Instrumentation_Tests__destroys_DB_.xml new file mode 100644 index 000000000..5df688523 --- /dev/null +++ b/.idea/runConfigurations/Instrumentation_Tests__destroys_DB_.xml @@ -0,0 +1,51 @@ + + + + + \ No newline at end of file diff --git a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/media/PngSuiteImageCompressorTest.java b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/media/PngSuiteImageCompressorTest.java index b783745ed..67f6b902d 100644 --- a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/media/PngSuiteImageCompressorTest.java +++ b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/media/PngSuiteImageCompressorTest.java @@ -10,12 +10,15 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; +import androidx.test.filters.LargeTest; + import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; import static org.briarproject.bramble.test.TestUtils.isOptionalTestEnabled; import static org.junit.Assert.fail; import static org.junit.Assume.assumeTrue; +@LargeTest @RunWith(Parameterized.class) public class PngSuiteImageCompressorTest extends AbstractImageCompressorTest { diff --git a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/media/PngSuiteImageSizeCalculatorTest.java b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/media/PngSuiteImageSizeCalculatorTest.java index e31dfa9c6..9d2054aa1 100644 --- a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/media/PngSuiteImageSizeCalculatorTest.java +++ b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/media/PngSuiteImageSizeCalculatorTest.java @@ -12,11 +12,14 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; +import androidx.test.filters.LargeTest; + import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; import static org.briarproject.bramble.test.TestUtils.isOptionalTestEnabled; import static org.junit.Assume.assumeTrue; +@LargeTest @RunWith(Parameterized.class) public class PngSuiteImageSizeCalculatorTest extends AbstractImageSizeCalculatorTest { From f603254153c816fa255f06b3ff331369a3239ff3 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 18 Mar 2021 12:10:14 -0300 Subject: [PATCH 2/5] Fix instrumentation tests --- .../briarproject/briar/android/UiTest.java | 43 ++++++++----------- .../ConversationActivityNotSignedInTest.java | 39 ----------------- .../SettingsActivityScreenshotTest.java | 5 +++ 3 files changed, 23 insertions(+), 64 deletions(-) delete mode 100644 briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/conversation/ConversationActivityNotSignedInTest.java diff --git a/briar-android/src/androidTest/java/org/briarproject/briar/android/UiTest.java b/briar-android/src/androidTest/java/org/briarproject/briar/android/UiTest.java index ce6899901..af75f3bbf 100644 --- a/briar-android/src/androidTest/java/org/briarproject/briar/android/UiTest.java +++ b/briar-android/src/androidTest/java/org/briarproject/briar/android/UiTest.java @@ -4,16 +4,20 @@ import android.app.Activity; import android.content.Intent; import org.briarproject.bramble.api.account.AccountManager; +import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.settings.Settings; +import org.briarproject.bramble.api.settings.SettingsManager; import org.briarproject.briar.R; -import javax.annotation.Nullable; import javax.inject.Inject; import androidx.test.espresso.intent.rule.IntentsTestRule; import static androidx.test.core.app.ApplicationProvider.getApplicationContext; +import static org.briarproject.briar.android.controller.BriarControllerImpl.DOZE_ASK_AGAIN; +import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE; @SuppressWarnings("WeakerAccess") @@ -27,6 +31,8 @@ public abstract class UiTest { protected AccountManager accountManager; @Inject protected LifecycleManager lifecycleManager; + @Inject + protected SettingsManager settingsManager; public UiTest() { BriarTestComponentApplication app = getApplicationContext(); @@ -39,22 +45,8 @@ public abstract class UiTest { protected class CleanAccountTestRule extends IntentsTestRule { - @Nullable - private final Runnable runnable; - public CleanAccountTestRule(Class activityClass) { super(activityClass); - this.runnable = null; - } - - /** - * Use this if you need to run code before launching the activity. - * Note: You need to use {@link #launchActivity(Intent)} yourself - * to start the activity. - */ - public CleanAccountTestRule(Class activityClass, Runnable runnable) { - super(activityClass, false, false); - this.runnable = runnable; } @Override @@ -62,16 +54,17 @@ public abstract class UiTest { super.beforeActivityLaunched(); accountManager.deleteAccount(); accountManager.createAccount(USERNAME, PASSWORD); - if (runnable != null) { - Intent serviceIntent = - new Intent(getApplicationContext(), BriarService.class); - getApplicationContext().startService(serviceIntent); - try { - lifecycleManager.waitForStartup(); - } catch (InterruptedException e) { - throw new AssertionError(e); - } - runnable.run(); + Intent serviceIntent = + new Intent(getApplicationContext(), BriarService.class); + getApplicationContext().startService(serviceIntent); + try { + lifecycleManager.waitForStartup(); + // do not show doze white-listing dialog + Settings settings = new Settings(); + settings.putBoolean(DOZE_ASK_AGAIN, false); + settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); + } catch (InterruptedException | DbException e) { + throw new AssertionError(e); } } } diff --git a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/conversation/ConversationActivityNotSignedInTest.java b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/conversation/ConversationActivityNotSignedInTest.java deleted file mode 100644 index be1ce09c4..000000000 --- a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/conversation/ConversationActivityNotSignedInTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.briarproject.briar.android.conversation; - -import android.content.Context; -import android.content.Intent; - -import org.briarproject.briar.R; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.rule.ActivityTestRule; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; -import static org.briarproject.briar.android.ViewActions.waitUntilMatches; -import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID; - -@RunWith(AndroidJUnit4.class) -public class ConversationActivityNotSignedInTest { - - @Rule - public ActivityTestRule testRule = - new ActivityTestRule<>(ConversationActivity.class, false, false); - - @Test - public void openWithoutSignedIn() { - Context targetContext = getInstrumentation().getTargetContext(); - Intent intent = new Intent(targetContext, ConversationActivity.class); - intent.putExtra(CONTACT_ID, 1); - testRule.launchActivity(intent); - - onView(withText(R.string.sign_in_button)) - .perform(waitUntilMatches(isDisplayed())); - } - -} diff --git a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/settings/SettingsActivityScreenshotTest.java b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/settings/SettingsActivityScreenshotTest.java index 2d11280ce..c99250ad8 100644 --- a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/settings/SettingsActivityScreenshotTest.java +++ b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/settings/SettingsActivityScreenshotTest.java @@ -16,6 +16,7 @@ import androidx.test.espresso.contrib.DrawerActions; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.rule.ActivityTestRule; +import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.matches; @@ -29,7 +30,9 @@ import static androidx.test.espresso.matcher.ViewMatchers.withClassName; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; import static org.briarproject.briar.android.ViewActions.waitUntilMatches; +import static org.briarproject.briar.android.util.UiUtils.hasScreenLock; import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assume.assumeTrue; @RunWith(AndroidJUnit4.class) public class SettingsActivityScreenshotTest extends ScreenshotTest { @@ -76,6 +79,8 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest { @Test public void appLock() { + assumeTrue("device has no screen lock", + hasScreenLock(getApplicationContext())); // scroll down onView(withClassName(is(RecyclerView.class.getName()))) .perform(scrollTo(hasDescendant( From b608b421749f353abbd536d887e3455dbbe7daa2 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 18 Mar 2021 12:11:22 -0300 Subject: [PATCH 3/5] Run instrumentation tests in CI when briar-android changes --- .gitlab-ci.yml | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3ba487ba7..136c0958c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,30 +1,46 @@ image: briar/ci-image-android:latest stages: -- test -- optional_tests -- check_reproducibility + - test + - optional_tests + - check_reproducibility -test: +.base-test: stage: test before_script: - set -e - export GRADLE_USER_HOME=$PWD/.gradle - cache: + key: "$CI_COMMIT_REF_SLUG" paths: - .gradle/wrapper - .gradle/caches - - script: - - ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom animalSnifferMain animalSnifferTest - - ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom check compileOfficialDebugAndroidTestSources compileScreenshotDebugAndroidTestSources - after_script: - # these file change every time but should not be cached + # these file change every time and should not be cached - rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock - rm -fr $GRADLE_USER_HOME/caches/*/plugin-resolution/ +test: + extends: .base-test + script: + - ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom animalSnifferMain animalSnifferTest + - ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom check + +android test: + extends: .base-test + image: briar/ci-image-android-emulator:latest + script: + # start emulator first, so it can fail early + - start-emulator.sh + # run normal and screenshot tests together (exclude Large tests) + - ./gradlew -Djava.security.egd=file:/dev/urandom connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.notAnnotation=androidx.test.filters.LargeTest + only: + refs: + - merge_requests + changes: + - briar-android/**/* + tags: + - kvm test_reproducible: stage: check_reproducibility @@ -40,6 +56,7 @@ test_reproducible: - export GRADLE_USER_HOME=$PWD/.gradle cache: + key: "$CI_COMMIT_REF_SLUG" paths: - .gradle/wrapper - .gradle/caches From b2e6dd4138623081e3833a403e5deca394c0d25c Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 19 Mar 2021 11:18:36 -0300 Subject: [PATCH 4/5] publish log files as artifacts when emulator job fails --- .gitlab-ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 136c0958c..017bd130f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -34,9 +34,17 @@ android test: - start-emulator.sh # run normal and screenshot tests together (exclude Large tests) - ./gradlew -Djava.security.egd=file:/dev/urandom connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.notAnnotation=androidx.test.filters.LargeTest + artifacts: + name: "${CI_PROJECT_PATH}_${CI_JOB_STAGE}_${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHA}" + paths: + - kernel.log + - logcat.txt + expire_in: 3 days + when: on_failure only: refs: - merge_requests + - branches changes: - briar-android/**/* tags: From 76f201bb2f63112402fa1a098669d8117be2c3b6 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 24 Mar 2021 16:06:48 -0300 Subject: [PATCH 5/5] Run Espresso tests manually as they are still too flaky --- .gitlab-ci.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 017bd130f..76ecc8a15 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,7 +6,6 @@ stages: - check_reproducibility .base-test: - stage: test before_script: - set -e - export GRADLE_USER_HOME=$PWD/.gradle @@ -22,12 +21,14 @@ stages: test: extends: .base-test + stage: test script: - ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom animalSnifferMain animalSnifferTest - ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom check android test: extends: .base-test + stage: optional_tests image: briar/ci-image-android-emulator:latest script: # start emulator first, so it can fail early @@ -41,12 +42,9 @@ android test: - logcat.txt expire_in: 3 days when: on_failure - only: - refs: - - merge_requests - - branches - changes: - - briar-android/**/* + when: manual + except: + - tags tags: - kvm