diff --git a/.drone.yml b/.drone.yml index 4409d1fc79..16e27dec66 100644 --- a/.drone.yml +++ b/.drone.yml @@ -66,13 +66,14 @@ steps: ORG_GRADLE_PROJECT_coverage: '' commands: - scripts/checkIfRunDrone.sh $GIT_USERNAME $GIT_TOKEN $DRONE_PULL_REQUEST || exit 0 - - emulator-headless -avd android-27 -no-snapshot -gpu swiftshader_indirect -no-window -no-audio & + - emulator-headless -avd android-27 -no-snapshot -gpu swiftshader_indirect -no-window -no-audio -skin 500x833 & - ./gradlew assembleGplay - ./gradlew assembleGplayDebug - ./wait_for_emulator.sh - ./gradlew jacocoTestGplayDebugUnitTestReport || scripts/uploadReport.sh $LOG_USERNAME $LOG_PASSWORD $DRONE_BUILD_NUMBER "Unit" $DRONE_PULL_REQUEST $GIT_USERNAME $GIT_TOKEN - ./gradlew installGplayDebugAndroidTest - ./gradlew createGplayDebugCoverageReport || scripts/uploadReport.sh $LOG_USERNAME $LOG_PASSWORD $DRONE_BUILD_NUMBER "IT" $DRONE_PULL_REQUEST $GIT_USERNAME $GIT_TOKEN + - ./gradlew executeScreenshotTests || scripts/uploadReport.sh $LOG_USERNAME $LOG_PASSWORD $DRONE_BUILD_NUMBER "Screenshot" $DRONE_PULL_REQUEST $GIT_USERNAME $GIT_TOKEN - ./gradlew combinedTestReport - curl -o codecov.sh https://codecov.io/bash - bash ./codecov.sh -t fc506ba4-33c3-43e4-a760-aada38c24fd5 diff --git a/build.gradle b/build.gradle index b6f7bc4f74..1c3919b0c8 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.2.2" classpath "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2 + classpath 'com.karumi:shot:3.1.0' } } @@ -39,8 +40,9 @@ apply plugin: 'kotlin-kapt' apply plugin: 'checkstyle' apply plugin: 'pmd' apply plugin: 'jacoco-android' -apply plugin: "com.github.spotbugs" -apply plugin: "io.gitlab.arturbosch.detekt" +apply plugin: 'com.github.spotbugs' +apply plugin: 'io.gitlab.arturbosch.detekt' +apply plugin: 'shot' configurations { ktlint @@ -101,6 +103,11 @@ spotbugs { toolVersion = '3.1.12' } +shot { + appId = 'com.nextcloud.client' + instrumentationTestTask = 'connectedGenericDebugAndroidTest' +} + android { lintOptions { abortOnError false @@ -126,7 +133,7 @@ android { targetSdkVersion 29 // arguments to be passed to functional tests - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "com.nextcloud.client.ScreenshotTestRunner" testInstrumentationRunnerArgument "TEST_SERVER_URL", "${NC_TEST_SERVER_BASEURL}" testInstrumentationRunnerArgument "TEST_SERVER_USERNAME", "${NC_TEST_SERVER_USERNAME}" testInstrumentationRunnerArgument "TEST_SERVER_PASSWORD", "${NC_TEST_SERVER_PASSWORD}" @@ -369,6 +376,7 @@ dependencies { //androidTestImplementation "com.android.support:support-annotations:${supportLibraryVersion}" androidTestImplementation 'tools.fastlane:screengrab:1.2.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + androidTestCompile('com.android.support.test.espresso:espresso-intents:2.2.1') // jacocoAnt "org.jacoco:org.jacoco.ant:${jacocoVersion}" // jacocoAgent "org.jacoco:org.jacoco.agent:${jacocoVersion}" diff --git a/screenshots/com.nextcloud.client.TestIT_test.png b/screenshots/com.nextcloud.client.TestIT_test.png new file mode 100644 index 0000000000..ea9be47b2e Binary files /dev/null and b/screenshots/com.nextcloud.client.TestIT_test.png differ diff --git a/scripts/uploadReport.sh b/scripts/uploadReport.sh index fb1fdb0355..b5d732be30 100755 --- a/scripts/uploadReport.sh +++ b/scripts/uploadReport.sh @@ -13,20 +13,23 @@ ID=$3 USER=$1 PASS=$2 TYPE=$4 +FOLDER=$ID-$TYPE set -e if [ $TYPE = "IT" ]; then cd build/reports/androidTests/connected/flavors/GPLAY -else +elif [ $TYPE = "Unit" ]; then cd build/reports/tests/testGplayDebugUnitTest +else + cd build/reports/short/verification/ fi -find . -type d -exec curl -u $USER:$PASS -X MKCOL $URL/$ID/$(echo {} | sed s#\./##) \; -find . -type f -exec curl -u $USER:$PASS -X PUT $URL/$ID/$(echo {} | sed s#\./##) --upload-file {} \; +find . -type d -exec curl -u $USER:$PASS -X MKCOL $URL/$FOLDER/$(echo {} | sed s#\./##) \; +find . -type f -exec curl -u $USER:$PASS -X PUT $URL/$FOLDER/$(echo {} | sed s#\./##) --upload-file {} \; -echo "Uploaded failing tests to https://www.kaminsky.me/nc-dev/android-integrationTests/$ID" +echo "Uploaded failing tests to https://www.kaminsky.me/nc-dev/android-integrationTests/$FOLDER" -curl -u $6:$7 -X POST https://api.github.com/repos/nextcloud/android/issues/$5/comments -d "{ \"body\" : \"$TYPE test failed: https://www.kaminsky.me/nc-dev/android-integrationTests/$ID \" }" +curl -u $6:$7 -X POST https://api.github.com/repos/nextcloud/android/issues/$5/comments -d "{ \"body\" : \"$TYPE test failed: https://www.kaminsky.me/nc-dev/android-integrationTests/$FOLDER \" }" exit 1 diff --git a/src/androidTest/AndroidManifest.xml b/src/androidTest/AndroidManifest.xml index 2c4b207ad8..d64cd4665e 100644 --- a/src/androidTest/AndroidManifest.xml +++ b/src/androidTest/AndroidManifest.xml @@ -26,7 +26,9 @@ --> + xmlns:android="http://schemas.android.com/apk/res/android" + package="${applicationId}.test" + android:sharedUserId="${applicationId}.uid"> diff --git a/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java b/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java new file mode 100644 index 0000000000..1b88f899e1 --- /dev/null +++ b/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java @@ -0,0 +1,44 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2019 Tobias Kaminsky + * Copyright (C) 2019 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client; + +import android.os.Bundle; + +import com.facebook.testing.screenshot.ScreenshotRunner; + +import androidx.test.runner.AndroidJUnitRunner; + +public class ScreenshotTestRunner extends AndroidJUnitRunner { + + @Override + public void onCreate(Bundle args) { + super.onCreate(args); + ScreenshotRunner.onCreate(this, args); + } + + @Override + public void finish(int resultCode, Bundle results) { + ScreenshotRunner.onDestroy(); + super.finish(resultCode, results); + } +} diff --git a/src/androidTest/java/com/nextcloud/client/TestIT.java b/src/androidTest/java/com/nextcloud/client/TestIT.java new file mode 100644 index 0000000000..d34ffc0d00 --- /dev/null +++ b/src/androidTest/java/com/nextcloud/client/TestIT.java @@ -0,0 +1,68 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2019 Tobias Kaminsky + * Copyright (C) 2019 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client; + +import android.Manifest; +import android.app.Activity; + +import com.facebook.testing.screenshot.Screenshot; +import com.nextcloud.client.onboarding.FirstRunActivity; +import com.owncloud.android.AbstractIT; +import com.owncloud.android.ui.activity.FileDisplayActivity; + +import org.junit.Rule; +import org.junit.Test; + +import androidx.test.core.app.ActivityScenario; +import androidx.test.espresso.Espresso; +import androidx.test.espresso.NoActivityResumedException; +import androidx.test.espresso.intent.rule.IntentsTestRule; +import androidx.test.rule.GrantPermissionRule; + + +public class TestIT extends AbstractIT { + @Rule public IntentsTestRule activityRule = + new IntentsTestRule<>(FirstRunActivity.class, true, false); + + @Rule + public final GrantPermissionRule permissionRule = GrantPermissionRule.grant( + Manifest.permission.WRITE_EXTERNAL_STORAGE); + + @Test + public void test() throws InterruptedException { + Activity test = activityRule.launchActivity(null); + + Screenshot.snapActivity(test).record(); + } + + private void openOverflowMenu() throws InterruptedException { + try { + Espresso.openContextualActionModeOverflowMenu(); + } catch (NoActivityResumedException e) { + ActivityScenario.launch(FileDisplayActivity.class); + Thread.sleep(1000); + Espresso.openContextualActionModeOverflowMenu(); + } + } + +} diff --git a/src/androidTest/java/com/nextcloud/client/account/UserAccountManagerImplTest.java b/src/androidTest/java/com/nextcloud/client/account/UserAccountManagerImplTest.java index bc2a32f189..bf599b8ddc 100644 --- a/src/androidTest/java/com/nextcloud/client/account/UserAccountManagerImplTest.java +++ b/src/androidTest/java/com/nextcloud/client/account/UserAccountManagerImplTest.java @@ -41,7 +41,7 @@ public class UserAccountManagerImplTest extends AbstractIT { boolean success = sut.migrateUserId(); assertTrue(success); - + Bundle arguments = androidx.test.platform.app.InstrumentationRegistry.getArguments(); String userId = arguments.getString("TEST_SERVER_USERNAME"); diff --git a/src/androidTest/java/com/owncloud/android/util/TestSorting.java b/src/androidTest/java/com/owncloud/android/util/TestSorting.java index acee99b892..15abaef20a 100644 --- a/src/androidTest/java/com/owncloud/android/util/TestSorting.java +++ b/src/androidTest/java/com/owncloud/android/util/TestSorting.java @@ -469,7 +469,6 @@ public class TestSorting { } - return false; } }