diff --git a/briar-android/build.gradle b/briar-android/build.gradle index ebe50797c8f6ad7f9a46478d74b8ffc2b608ce16..ba6c06b31cb9d4e8fb05b342c4bdf230e6de1efb 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -140,7 +140,7 @@ dependencies { androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.0.2" androidTestCompileOnly 'javax.annotation:jsr250-api:1.0' androidTestImplementation 'junit:junit:4.12' - androidTestScreenshotImplementation "tools.fastlane:screengrab:1.1.0" + androidTestScreenshotImplementation "tools.fastlane:screengrab:1.2.0" androidTestScreenshotImplementation "com.android.support.test.uiautomator:uiautomator-v18:2.1.3" } diff --git a/briar-android/fastlane/Screengrabfile b/briar-android/fastlane/Screengrabfile index 8a6f1353423a97833100760f96863fac0cc9f0fe..53f4226deb8ae3d433a071e72d118c6b9b53c66a 100644 --- a/briar-android/fastlane/Screengrabfile +++ b/briar-android/fastlane/Screengrabfile @@ -2,4 +2,6 @@ app_package_name "org.briarproject.briar.android.screenshot.debug" locales ['en-US'] app_apk_path "build/outputs/apk/screenshot/debug/briar-android-screenshot-debug.apk" tests_apk_path "build/outputs/apk/androidTest/screenshot/debug/briar-android-screenshot-debug-androidTest.apk" -test_instrumentation_runner "org.briarproject.briar.android.BriarTestRunner" \ No newline at end of file +test_instrumentation_runner "org.briarproject.briar.android.BriarTestRunner" +reinstall_app = true +exit_on_test_failure = true \ 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 a767da8ee0bce97a1494fbeafd05899e34f27216..7d9249cfbe048d68e2ee74bb89afcb606f535121 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 @@ -7,6 +7,7 @@ import android.support.test.espresso.intent.rule.IntentsTestRule; import org.briarproject.bramble.api.account.AccountManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.briar.R; import javax.annotation.Nullable; import javax.inject.Inject; @@ -16,7 +17,8 @@ import static android.support.test.InstrumentationRegistry.getTargetContext; @SuppressWarnings("WeakerAccess") public abstract class UiTest { - protected static final String USERNAME = "Alice"; + protected final String USERNAME = + getTargetContext().getString(R.string.screenshot_alice); protected static final String PASSWORD = "123456"; @Inject diff --git a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/BriarUiTestComponent.java b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/BriarUiTestComponent.java index afbe0eaa3d6973364c7ab54b46deab7919eb560e..8601660993523647b8d0b3500ba89037f7ed71b9 100644 --- a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/BriarUiTestComponent.java +++ b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/BriarUiTestComponent.java @@ -5,7 +5,6 @@ import org.briarproject.bramble.BrambleCoreModule; import org.briarproject.bramble.account.BriarAccountModule; import org.briarproject.briar.BriarCoreModule; import org.briarproject.briar.android.contact.ConversationActivityScreenshotTest; -import org.briarproject.briar.android.login.SetupActivityScreenshotTest; import org.briarproject.briar.android.settings.SettingsActivityScreenshotTest; import javax.inject.Singleton; @@ -22,8 +21,9 @@ import dagger.Component; }) public interface BriarUiTestComponent extends AndroidComponent { + void inject(SetupDataTest test); + void inject(ConversationActivityScreenshotTest test); - void inject(SetupActivityScreenshotTest test); void inject(SettingsActivityScreenshotTest test); } diff --git a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/ScreenshotTest.java b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/ScreenshotTest.java index bc544b0f9c131e4d7871a992d6a288e785bb2336..2fcaf9c2e1926e4b76b82e7f06f3df1c076e6ed0 100644 --- a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/ScreenshotTest.java +++ b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/ScreenshotTest.java @@ -1,5 +1,6 @@ package org.briarproject.briar.android; +import android.app.Activity; import android.util.Log; import org.briarproject.bramble.api.plugin.ConnectionRegistry; @@ -9,12 +10,10 @@ import org.junit.ClassRule; import javax.inject.Inject; +import tools.fastlane.screengrab.FalconScreenshotStrategy; import tools.fastlane.screengrab.Screengrab; -import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy; import tools.fastlane.screengrab.locale.LocaleTestRule; -import static tools.fastlane.screengrab.Screengrab.setDefaultScreenshotStrategy; - public abstract class ScreenshotTest extends UiTest { @ClassRule @@ -27,14 +26,9 @@ public abstract class ScreenshotTest extends UiTest { @Inject protected Clock clock; - public ScreenshotTest() { - super(); - setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy()); - } - - protected void screenshot(String name) { + protected void screenshot(String name, Activity activity) { try { - Screengrab.screenshot(name); + Screengrab.screenshot(name, new FalconScreenshotStrategy(activity)); } catch (RuntimeException e) { if (!e.getMessage().equals("Unable to capture screenshot.")) throw e; diff --git a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/login/SetupActivityScreenshotTest.java b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/SetupDataTest.java similarity index 65% rename from briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/login/SetupActivityScreenshotTest.java rename to briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/SetupDataTest.java index 8b3981e0dd1c51dbbf8e7dab2a3df1e56e357b34..53b5d308fe92744816a513b9b21338d33e91d23e 100644 --- a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/login/SetupActivityScreenshotTest.java +++ b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/SetupDataTest.java @@ -1,4 +1,4 @@ -package org.briarproject.briar.android.login; +package org.briarproject.briar.android; import android.support.test.espresso.intent.rule.IntentsTestRule; import android.support.test.runner.AndroidJUnit4; @@ -6,9 +6,12 @@ import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiSelector; +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.db.DbException; import org.briarproject.briar.R; -import org.briarproject.briar.android.BriarUiTestComponent; -import org.briarproject.briar.android.ScreenshotTest; +import org.briarproject.briar.android.login.OpenDatabaseActivity; +import org.briarproject.briar.android.login.SetupActivity; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -26,14 +29,14 @@ import static android.support.test.espresso.matcher.ViewMatchers.isRoot; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; import static android.support.test.runner.lifecycle.Stage.PAUSED; -import static junit.framework.Assert.assertTrue; +import static org.briarproject.bramble.api.plugin.LanTcpConstants.ID; import static org.briarproject.briar.android.ViewActions.waitForActivity; import static org.briarproject.briar.android.ViewActions.waitUntilMatches; import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting; - +import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) -public class SetupActivityScreenshotTest extends ScreenshotTest { +public class SetupDataTest extends ScreenshotTest { @Rule public IntentsTestRule<SetupActivity> testRule = @@ -61,7 +64,7 @@ public class SetupActivityScreenshotTest extends ScreenshotTest { onView(withId(R.id.nickname_entry)) .perform(waitUntilMatches(withText(USERNAME))); - screenshot("manual_create_account"); + screenshot("manual_create_account", testRule.getActivity()); onView(withId(R.id.next)) .check(matches(isDisplayed())) @@ -94,13 +97,54 @@ public class SetupActivityScreenshotTest extends ScreenshotTest { } // wait for OpenDatabaseActivity to show up - onView(withId(R.id.progress)) - .check(matches(isDisplayed())); onView(isRoot()) .perform(waitForActivity(testRule.getActivity(), PAUSED)); intended(hasComponent(OpenDatabaseActivity.class.getName())); assertTrue(accountManager.hasDatabaseKey()); + + lifecycleManager.waitForStartup(); + createTestData(); + + // close expiry warning + onView(withId(R.id.expiryWarning)) + .perform(waitUntilMatches(isDisplayed())); + onView(withId(R.id.expiryWarningClose)) + .check(matches(isDisplayed())); + onView(withId(R.id.expiryWarningClose)) + .perform(click()); + } + + private void createTestData() { + try { + createTestDataExceptions(); + } catch (DbException | FormatException e) { + throw new AssertionError(e); + } + } + + private void createTestDataExceptions() + throws DbException, FormatException { + String bobName = + getTargetContext().getString(R.string.screenshot_bob); + Contact bob = testDataCreator.addContact(bobName); + + String bobHi = getTargetContext() + .getString(R.string.screenshot_message_1); + long bobTime = getMinutesAgo(2); + testDataCreator.addPrivateMessage(bob, bobHi, bobTime, true); + + String aliceHi = getTargetContext() + .getString(R.string.screenshot_message_2); + long aliceTime = getMinutesAgo(1); + testDataCreator.addPrivateMessage(bob, aliceHi, aliceTime, false); + + String bobHi2 = getTargetContext() + .getString(R.string.screenshot_message_3); + long bobTime2 = getMinutesAgo(0); + testDataCreator.addPrivateMessage(bob, bobHi2, bobTime2, true); + + connectionRegistry.registerConnection(bob.getId(), ID, true); } } diff --git a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/contact/ConversationActivityScreenshotTest.java b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/contact/ConversationActivityScreenshotTest.java index e61e5ea1f28400d47c7bc51cb8b2a5cae173ceb3..e25951c3398a2acfd4989cba35335a4e239e4be4 100644 --- a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/contact/ConversationActivityScreenshotTest.java +++ b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/contact/ConversationActivityScreenshotTest.java @@ -2,11 +2,9 @@ package org.briarproject.briar.android.contact; import android.content.Context; import android.content.Intent; +import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; -import org.briarproject.bramble.api.FormatException; -import org.briarproject.bramble.api.contact.Contact; -import org.briarproject.bramble.api.db.DbException; import org.briarproject.briar.R; import org.briarproject.briar.android.BriarUiTestComponent; import org.briarproject.briar.android.ScreenshotTest; @@ -15,23 +13,20 @@ import org.junit.Test; import org.junit.runner.RunWith; import static android.support.test.InstrumentationRegistry.getInstrumentation; -import static android.support.test.InstrumentationRegistry.getTargetContext; import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.briarproject.bramble.api.plugin.LanTcpConstants.ID; -import static org.briarproject.briar.android.contact.ConversationActivity.CONTACT_ID; import static org.briarproject.briar.android.ViewActions.waitUntilMatches; +import static org.briarproject.briar.android.contact.ConversationActivity.CONTACT_ID; import static org.hamcrest.Matchers.allOf; @RunWith(AndroidJUnit4.class) public class ConversationActivityScreenshotTest extends ScreenshotTest { @Rule - public CleanAccountTestRule<ConversationActivity> testRule = - new CleanAccountTestRule<>(ConversationActivity.class, - this::createTestData); + public ActivityTestRule<ConversationActivity> testRule = + new ActivityTestRule<>(ConversationActivity.class, false, false); @Override protected void inject(BriarUiTestComponent component) { @@ -39,48 +34,19 @@ public class ConversationActivityScreenshotTest extends ScreenshotTest { } @Test - public void messaging() { + public void messaging() throws Exception { Context targetContext = getInstrumentation().getTargetContext(); Intent intent = new Intent(targetContext, ConversationActivity.class); intent.putExtra(CONTACT_ID, 1); testRule.launchActivity(intent); - onView(withId(R.id.conversationView)).perform(waitUntilMatches( - allOf(withText(R.string.screenshot_message_3), isDisplayed()))); - - screenshot("manual_messaging"); - } - - private void createTestData() { - try { - createTestDataExceptions(); - } catch (DbException | FormatException e) { - throw new AssertionError(e); - } - } - - private void createTestDataExceptions() - throws DbException, FormatException { - String bobName = - getTargetContext().getString(R.string.screenshot_bob); - Contact bob = testDataCreator.addContact(bobName); - - String bobHi = getTargetContext() - .getString(R.string.screenshot_message_1); - long bobTime = getMinutesAgo(2); - testDataCreator.addPrivateMessage(bob, bobHi, bobTime, true); - - String aliceHi = getTargetContext() - .getString(R.string.screenshot_message_2); - long aliceTime = getMinutesAgo(1); - testDataCreator.addPrivateMessage(bob, aliceHi, aliceTime, false); - - String bobHi2 = getTargetContext() - .getString(R.string.screenshot_message_3); - long bobTime2 = getMinutesAgo(0); - testDataCreator.addPrivateMessage(bob, bobHi2, bobTime2, true); + onView(withId(R.id.conversationView)) + .perform(waitUntilMatches(allOf( + withText(R.string.screenshot_message_3), + isCompletelyDisplayed()) + )); - connectionRegistry.registerConnection(bob.getId(), ID, true); + screenshot("manual_messaging", testRule.getActivity()); } } 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 831da5ca1179afaa146e144650c15fd365978d8d..ceb1817f68a85c3113f80eef1c24c1fa4995776c 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 @@ -2,14 +2,15 @@ package org.briarproject.briar.android.settings; import android.content.Intent; import android.support.test.espresso.contrib.DrawerActions; +import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import android.support.v7.widget.RecyclerView; import android.view.Gravity; import org.briarproject.briar.R; import org.briarproject.briar.android.BriarUiTestComponent; -import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import org.briarproject.briar.android.ScreenshotTest; +import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -33,8 +34,8 @@ import static org.hamcrest.CoreMatchers.is; public class SettingsActivityScreenshotTest extends ScreenshotTest { @Rule - public CleanAccountTestRule<SettingsActivity> testRule = - new CleanAccountTestRule<>(SettingsActivity.class); + public ActivityTestRule<SettingsActivity> testRule = + new ActivityTestRule<>(SettingsActivity.class); @Override protected void inject(BriarUiTestComponent component) { @@ -46,7 +47,7 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest { onView(withText(R.string.settings_button)) .check(matches(isDisplayed())); - screenshot("manual_dark_theme_settings"); + screenshot("manual_dark_theme_settings", testRule.getActivity()); // switch to dark theme onView(withText(R.string.pref_theme_title)) @@ -56,10 +57,20 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest { .check(matches(isDisplayed())) .perform(click()); - // open nav drawer and remove expiry warning - openNavDrawer(true); + openNavDrawer(); + + screenshot("manual_dark_theme_nav_drawer", testRule.getActivity()); - screenshot("manual_dark_theme_nav_drawer"); + // switch to back to light theme + onView(withText(R.string.settings_button)) + .check(matches(isDisplayed())) + .perform(click()); + onView(withText(R.string.pref_theme_title)) + .check(matches(isDisplayed())) + .perform(click()); + onView(withText(R.string.pref_theme_light)) + .check(matches(isDisplayed())) + .perform(click()); } @Test @@ -83,12 +94,11 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest { .check(matches(isDisplayed())) .check(matches(isEnabled())); - screenshot("manual_app_lock"); + screenshot("manual_app_lock", testRule.getActivity()); - // no more expiry warning to remove, because sharedprefs cached? - openNavDrawer(false); + openNavDrawer(); - screenshot("manual_app_lock_nav_drawer"); + screenshot("manual_app_lock_nav_drawer", testRule.getActivity()); } @Test @@ -104,23 +114,15 @@ public class SettingsActivityScreenshotTest extends ScreenshotTest { .check(matches(isDisplayed())) .perform(waitUntilMatches(isEnabled())); - screenshot("manual_tor_settings"); + screenshot("manual_tor_settings", testRule.getActivity()); } - private void openNavDrawer(boolean expiry) { + private void openNavDrawer() { // start main activity Intent i = new Intent(testRule.getActivity(), NavDrawerActivity.class); testRule.getActivity().startActivity(i); - // close expiry warning - if (expiry) { - onView(withId(R.id.expiryWarningClose)) - .check(matches(isDisplayed())); - onView(withId(R.id.expiryWarningClose)) - .perform(click()); - } - // open navigation drawer onView(withId(R.id.drawer_layout)) .check(matches(isClosed(Gravity.START))) diff --git a/briar-android/witness.gradle b/briar-android/witness.gradle index 2a5727a1665cdd62984303e3dc7099f5434478a3..0fa29a1f9e7d532a57b3ee909a50d39e0ef2833b 100644 --- a/briar-android/witness.gradle +++ b/briar-android/witness.gradle @@ -82,6 +82,7 @@ dependencyVerification { 'com.google.zxing:core:3.3.0:core-3.3.0.jar:bba7724e02a997cec38213af77133ee8e24b0d5cf5fa7ecbc16a4fa93f11ee0d', 'com.googlecode.json-simple:json-simple:1.1:json-simple-1.1.jar:2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439', 'com.ibm.icu:icu4j:53.1:icu4j-53.1.jar:e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab', + 'com.jraska:falcon:1.0.4:falcon-1.0.4.aar:6114a48d8b3814f75fc69b5e84dc087c1254883874eae8a36bd778979800630a', 'com.squareup:javawriter:2.1.1:javawriter-2.1.1.jar:f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e', 'com.squareup:javawriter:2.5.0:javawriter-2.5.0.jar:fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0', 'com.sun.activation:javax.activation:1.2.0:javax.activation-1.2.0.jar:993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce', @@ -171,7 +172,7 @@ dependencyVerification { 'org.robolectric:shadows-framework:3.8:shadows-framework-3.8.jar:83548db7249edf1af87e1a1f4d8f4eec3e85d6220161da601e6f6398476911b2', 'org.robolectric:shadows-support-v4:3.3.2:shadows-support-v4-3.3.2.jar:6f689264738266e70fe08db7c04b7b5a75155994f4e3f7f311960d90486bf005', 'org.robolectric:utils:3.8:utils-3.8.jar:e945d04d40e37554e02d4be1bc3abf9bede45375c843aa36d10ccb6b63edbf34', - 'tools.fastlane:screengrab:1.1.0:screengrab-1.1.0.aar:03ce3868ee8a0082d14e7a1de0999f91531c0cc794392688beb08ee9bc4495fd', + 'tools.fastlane:screengrab:1.2.0:screengrab-1.2.0.aar:af4ee23bb06f94404d3ab18e2ea69db8265539fc8da29f9ee45b7e472684ba83', 'uk.co.samuelwall:material-tap-target-prompt:2.8.0:material-tap-target-prompt-2.8.0.aar:ac70770c05bbc4675a1d5712c0e53d46ee4fa961b74947589fce50d8003065ec', 'xmlpull:xmlpull:1.1.3.1:xmlpull-1.1.3.1.jar:34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63', 'xpp3:xpp3_min:1.1.4c:xpp3_min-1.1.4c.jar:bfc90e9e32d0eab1f397fb974b5f150a815188382ac41f372a7149d5bc178008',