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(