From 76bbc110a942116dc7a9d4ba72a970afd93cf7a5 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Tue, 10 Dec 2019 15:26:31 +0100 Subject: [PATCH] test ui diff Signed-off-by: tobiasKaminsky --- .drone.yml | 3 +- build.gradle | 14 +++- .../com.nextcloud.client.TestIT_test.png | Bin 0 -> 24493 bytes scripts/uploadReport.sh | 13 ++-- src/androidTest/AndroidManifest.xml | 4 +- .../client/ScreenshotTestRunner.java | 44 ++++++++++++ .../java/com/nextcloud/client/TestIT.java | 68 ++++++++++++++++++ .../account/UserAccountManagerImplTest.java | 2 +- .../owncloud/android/util/TestSorting.java | 1 - 9 files changed, 137 insertions(+), 12 deletions(-) create mode 100644 screenshots/com.nextcloud.client.TestIT_test.png create mode 100644 src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java create mode 100644 src/androidTest/java/com/nextcloud/client/TestIT.java 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 0000000000000000000000000000000000000000..ea9be47b2e5eed9ec82e2ddd6115faa00e933e1c GIT binary patch literal 24493 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¨Gp=MATP=ImHHSlW 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 literal 0 HcmV?d00001 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; } }