diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3ba487ba7..76ecc8a15 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,30 +1,52 @@ image: briar/ci-image-android:latest stages: -- test -- optional_tests -- check_reproducibility + - test + - optional_tests + - check_reproducibility -test: - stage: test +.base-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 + 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 + - 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 + when: manual + except: + - tags + tags: + - kvm test_reproducible: stage: check_reproducibility @@ -40,6 +62,7 @@ test_reproducible: - export GRADLE_USER_HOME=$PWD/.gradle cache: + key: "$CI_COMMIT_REF_SLUG" paths: - .gradle/wrapper - .gradle/caches 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/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/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 { 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(