diff --git a/.travis.yml b/.travis.yml index ab511cecc5..4b955050ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,10 @@ language: android -addons: - apt: - packages: - - w3m env: global: - ANDROID_TARGET=android-22 - ANDROID_ABI=armeabi-v7a - - ADB_INSTALL_TIMEOUT=12 + - ADB_INSTALL_TIMEOUT=20 - secure: okdkna5DaH/2Fay9vI6Enrx7u9UwRm4/IJXvcaWJcvjF3JTsLQr0r+dlMT2X5E1GsNk4WcoGcfZJcVonULkaW4S96B43g3EyevWbLFWjii0cMUO00OshToKyboSvNUf+d5B6rghrbnxTIBNel2ZBFj8MXHdtz6Az20q8VywqPeBZupo7olyKKS1nYdvoo7ypNScVjDGEjEPonWplztYlSDT1w81Vww4kF9oiOPEzDOPw1lOiD8FTyKLXhK0WYlnc3cnyFjZwVMlKcomnFYPfe/J2zO6OP/XInxYSXRkZ6wiOC5gMPYAYanUAuzm91vsTBQMk6jMCglSM9Nl6dPusGgEqOyTwLVALlgvS3km9HNVsHuVJhU+bmJ6scFBWrAOhbsV2ioSEsQ8NgU0Zv1SC0wN9ZruF4ae03Re+k+eHgwA3taZXrT2pvkkSmfRex6oFZReypcPGFQYiHo31NsO39WPRYYxr4edYisVXw75x/BJyOcUULhG1YmwHYYeXOzbNp0Sf9ADtUDi0oip/BO2tkLxbE+z1GJSmC83fX2YpoK+IwDHNm+4w8OJAJBvdxA3Q4HrJBAbd8jnQYP+sBBaki8t5WuwJmfOucx0vgKJ7pzqRY/MOUVe/dACnjLgFDLuS7MMqr6xU/oMM6/rrt4209tL+GQbn/R98UKtmMRRq1hY= -jdk: -- oraclejdk8 android: components: - tools @@ -20,10 +14,14 @@ android: - extra-android-m2repository - android-22 - android-28 - licenses: - - android-sdk-license-.+ + - sys-img-${ANDROID_ABI}-${ANDROID_TARGET} +before_script: + - echo no | android create avd -f -n test -t $ANDROID_TARGET --abi $ANDROID_ABI + - emulator @test -memory 2048 -no-boot-anim -noaudio -no-window & + - android-wait-for-emulator + - adb shell input keyevent 82 & script: -- "./gradlew -Pcoverage clean check jacocoTestReport" +- "./gradlew -Pcoverage connectedCheck jacocoTestReport" - if [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "master" ]; then mkdir -p app/src/prodRelease/play/release-notes/en-US; fi @@ -35,14 +33,9 @@ script: fi after_success: - bash <(curl -s https://codecov.io/bash) -after_failure: -- echo '*** Debug Unit Test Results ***' -- w3m -dump ${TRAVIS_BUILD_DIR}/app/build/reports/tests/*/classes/*Test.html -- echo '*** Connected Test Results ***' -- w3m -dump ${TRAVIS_BUILD_DIR}/app/build/reports/androidTests/connected/flavors/*/*Test.html before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock -- rm -fr $HOME/.gradle/caches/*/plugin-resolution/ +- rm -rf $HOME/.gradle/caches/*/plugin-resolution/ cache: directories: - "$HOME/.gradle/caches/" diff --git a/app/build.gradle b/app/build.gradle index c2e618c177..6427928968 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -118,7 +118,6 @@ android { minSdkVersion 19 targetSdkVersion 28 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArguments clearPackageData: 'true' testOptions { execution 'ANDROIDX_TEST_ORCHESTRATOR' diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.kt b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.kt index 6d1b5f7480..68a0abbb23 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.kt +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.kt @@ -15,7 +15,7 @@ import fr.free.nrw.commons.kvstore.JsonKvStore import fr.free.nrw.commons.settings.Prefs import fr.free.nrw.commons.settings.SettingsActivity import org.hamcrest.Matchers.allOf -import org.hamcrest.core.IsNot.not +import org.hamcrest.Matchers.not import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UITestHelper.kt b/app/src/androidTest/java/fr/free/nrw/commons/UITestHelper.kt index df03157c2a..2962bc3053 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/UITestHelper.kt +++ b/app/src/androidTest/java/fr/free/nrw/commons/UITestHelper.kt @@ -2,13 +2,17 @@ package fr.free.nrw.commons import android.app.Activity import android.content.pm.ActivityInfo +import android.text.TextUtils import androidx.test.espresso.Espresso.closeSoftKeyboard import androidx.test.espresso.Espresso.onView import androidx.test.espresso.NoMatchingViewException +import androidx.test.espresso.PerformException import androidx.test.espresso.action.ViewActions import androidx.test.espresso.matcher.ViewMatchers import androidx.test.rule.ActivityTestRule -import org.apache.commons.lang3.StringUtils +import fr.free.nrw.commons.utils.ConfigUtils +import org.hamcrest.CoreMatchers.allOf +import org.junit.Assume import timber.log.Timber class UITestHelper { @@ -19,24 +23,33 @@ class UITestHelper { onView(ViewMatchers.withId(R.id.finishTutorialButton)) .perform(ViewActions.click()) } catch (ignored: NoMatchingViewException) { + } catch (ignored: PerformException) { + onView(ViewMatchers.withId(R.id.welcomePager)) + .perform(ViewActions.swipeLeft()) + .perform(ViewActions.swipeLeft()) + .perform(ViewActions.swipeLeft()) + .perform(ViewActions.swipeLeft()) + onView(allOf( + ViewMatchers.withId(R.id.finishTutorialButton), + ViewMatchers.withText("YES!"))) + .perform(ViewActions.click()) } } fun loginUser() { + checkShouldLogin() + try { - //Perform Login onView(ViewMatchers.withId(R.id.login_username)) - .perform(ViewActions.clearText(), ViewActions.typeText(getTestUsername())) + .perform(ViewActions.clearText(), ViewActions.typeText(BuildConfig.TEST_USERNAME)) closeSoftKeyboard() onView(ViewMatchers.withId(R.id.login_password)) - .perform(ViewActions.clearText(), ViewActions.typeText(getTestUserPassword())) + .perform(ViewActions.clearText(), ViewActions.typeText(BuildConfig.TEST_PASSWORD)) closeSoftKeyboard() onView(ViewMatchers.withId(R.id.login_button)) .perform(ViewActions.click()) sleep(5000) - } catch (ignored: NoMatchingViewException) { - } - + } catch (ignored: NoMatchingViewException) {} } fun sleep(timeInMillis: Long) { @@ -48,19 +61,28 @@ class UITestHelper { } } - private fun getTestUsername(): String { - val username = BuildConfig.TEST_USERNAME - if (StringUtils.isEmpty(username) || username == "null") { - throw NotImplementedError("Configure your beta account's username") - } else return username + private fun credentialIsSet(credential: String): Boolean { + return !(TextUtils.isEmpty(credential) || credential == "null") } - private fun getTestUserPassword(): String { - val password = BuildConfig.TEST_PASSWORD - if (StringUtils.isEmpty(password) || password == "null") { - throw NotImplementedError("Configure your beta account's password") - } else return password + private fun checkShouldLogin() { + Assume.assumeTrue( + "Tests requiring login should only be performed on Beta Commons", + ConfigUtils.isBetaFlavour()) + + Assume.assumeTrue( + "Beta account username not set\n" + + "This can be done in the build config of app/build.gradle or by exporting the environment variable test_user_name\n" + + "This message is expected on PR builds on Travis", + credentialIsSet(BuildConfig.TEST_USERNAME)) + + Assume.assumeTrue( + "Beta account password not set\n" + + "This can be done in the build config of app/build.gradle or by exporting the environment variable test_user_password\n" + + "This message is expected on PR builds on Travis", + credentialIsSet(BuildConfig.TEST_PASSWORD)) } + fun changeOrientation(activityRule: ActivityTestRule){ activityRule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT assert(activityRule.activity.requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.kt b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.kt index 4c57a3bb97..5b4bff7e51 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.kt +++ b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.kt @@ -26,10 +26,7 @@ import androidx.test.runner.AndroidJUnit4 import fr.free.nrw.commons.auth.LoginActivity import fr.free.nrw.commons.utils.ConfigUtils import org.hamcrest.core.AllOf.allOf -import org.junit.After -import org.junit.Before -import org.junit.Rule -import org.junit.Test +import org.junit.* import org.junit.runner.RunWith import timber.log.Timber import java.io.File @@ -102,9 +99,9 @@ class UploadTest { @Test fun uploadTest() { - if (!ConfigUtils.isBetaFlavour()) { - throw Error("This test should only be run in Beta!") - } + Assume.assumeTrue( + "The automated upload test should only be run in Beta!", + ConfigUtils.isBetaFlavour()) // Uri to return by our mock gallery selector // Requires file 'image.jpg' to be placed at root of file structure