Pārlūkot izejas kodu

Merge pull request #4992 from nextcloud/uiComparison

Ui comparison
Tobias Kaminsky 5 gadi atpakaļ
vecāks
revīzija
9fbedb4d8c

+ 3 - 2
.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
+      - scripts/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

+ 11 - 3
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}"
@@ -371,6 +378,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}"

BIN
screenshots/com.nextcloud.client.FileDisplayActivityIT_drawer.png


BIN
screenshots/com.nextcloud.client.FileDisplayActivityIT_open.png


BIN
screenshots/com.nextcloud.client.FileDisplayActivityIT_overflowMenu.png


BIN
screenshots/com.nextcloud.client.FileDisplayActivityIT_showAccounts.png


BIN
screenshots/com.nextcloud.client.FirstRunActivityIT_open.png


BIN
screenshots/com.nextcloud.client.SettingsActivityIT_open.png


+ 32 - 0
scripts/updateScreenshots.sh

@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+
+## emulator
+if ( [[ $(emulator -list-avds | grep uiComparison -c) -eq 0 ]] ); then
+    (sleep 5; echo "no") | avdmanager create avd -n uiComparison -c 100M -k "system-images;android-27;google_apis;x86" --abi "google_apis/x86"
+fi
+
+emulator -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-window -no-audio -skin 500x833 1>/dev/null &
+PID=$(echo $!)
+
+## server
+docker run --name=uiComparison nextcloudci/server:server-3 1>/dev/null &
+sleep 5
+IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' uiComparison)
+
+if [[ $IP = "" ]]; then
+    echo "no server"
+    exit 1
+fi
+
+## run on server
+cp gradle.properties gradle.properties_
+sed -i s"/server/$IP/" gradle.properties
+scripts/wait_for_emulator.sh
+scripts/wait_for_server.sh ${IP}
+./gradlew executeScreenshotTests -Precord
+mv gradle.properties_ gradle.properties
+
+# tidy up
+kill $PID
+docker stop uiComparison
+docker rm uiComparison

+ 8 - 5
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/shot/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

+ 0 - 0
wait_for_emulator.sh → scripts/wait_for_emulator.sh


+ 18 - 0
scripts/wait_for_server.sh

@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+counter=0
+status=""
+
+until [[ $status = "false" ]]; do
+    status=$(curl 2>/dev/null "http://$1/status.php" | jq .maintenance)
+
+    if [[ "$status" =~ "false" || "$status" = "" ]]; then
+        let "counter += 1"
+         if [[ $counter -gt 2 ]]; then
+            echo "Failed to wait for server"
+            exit 1
+        fi
+    fi
+
+    sleep 10
+done

+ 3 - 1
src/androidTest/AndroidManifest.xml

@@ -26,7 +26,9 @@
 -->
 
 <manifest xmlns:tools="http://schemas.android.com/tools"
-    package="${applicationId}.test">
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="${applicationId}.test"
+    android:sharedUserId="${applicationId}.uid">
 
     <uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator" />
 </manifest>

+ 81 - 0
src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java

@@ -0,0 +1,81 @@
+/*
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.client;
+
+import android.Manifest;
+import android.app.Activity;
+
+import com.facebook.testing.screenshot.Screenshot;
+import com.owncloud.android.AbstractIT;
+import com.owncloud.android.R;
+import com.owncloud.android.ui.activity.FileDisplayActivity;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import androidx.test.espresso.contrib.DrawerActions;
+import androidx.test.espresso.intent.rule.IntentsTestRule;
+import androidx.test.rule.GrantPermissionRule;
+
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+
+
+public class FileDisplayActivityIT extends AbstractIT {
+    @Rule public IntentsTestRule<FileDisplayActivity> activityRule = new IntentsTestRule<>(FileDisplayActivity.class,
+                                                                                           true,
+                                                                                           false);
+
+    @Rule
+    public final GrantPermissionRule permissionRule = GrantPermissionRule.grant(
+        Manifest.permission.WRITE_EXTERNAL_STORAGE);
+
+    @Test
+    public void open() throws InterruptedException {
+        Activity sut = activityRule.launchActivity(null);
+
+        Thread.sleep(3000);
+
+        Screenshot.snapActivity(sut).record();
+    }
+
+    @Test
+    public void drawer() {
+        Activity sut = activityRule.launchActivity(null);
+
+        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
+
+        Screenshot.snapActivity(sut).record();
+    }
+
+    @Test
+    public void showAccounts() {
+        Activity sut = activityRule.launchActivity(null);
+
+        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
+        onView(withId(R.id.drawer_active_user)).perform(click());
+
+        Screenshot.snapActivity(sut).record();
+    }
+}

+ 55 - 0
src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java

@@ -0,0 +1,55 @@
+/*
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+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 org.junit.Rule;
+import org.junit.Test;
+
+import androidx.test.espresso.intent.rule.IntentsTestRule;
+import androidx.test.rule.GrantPermissionRule;
+
+
+public class FirstRunActivityIT extends AbstractIT {
+    @Rule public IntentsTestRule<FirstRunActivity> activityRule = new IntentsTestRule<>(FirstRunActivity.class,
+                                                                                        true,
+                                                                                        false);
+
+    @Rule
+    public final GrantPermissionRule permissionRule = GrantPermissionRule.grant(
+        Manifest.permission.WRITE_EXTERNAL_STORAGE);
+
+    @Test
+    public void open() {
+        Activity sut = activityRule.launchActivity(null);
+
+        Screenshot.snapActivity(sut).record();
+    }
+
+}

+ 44 - 0
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 <https://www.gnu.org/licenses/>.
+ */
+
+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);
+    }
+}

+ 54 - 0
src/androidTest/java/com/nextcloud/client/SettingsActivityIT.java

@@ -0,0 +1,54 @@
+/*
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.client;
+
+import android.Manifest;
+import android.app.Activity;
+
+import com.facebook.testing.screenshot.Screenshot;
+import com.owncloud.android.AbstractIT;
+import com.owncloud.android.ui.activity.SettingsActivity;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import androidx.test.espresso.intent.rule.IntentsTestRule;
+import androidx.test.rule.GrantPermissionRule;
+
+
+public class SettingsActivityIT extends AbstractIT {
+    @Rule public IntentsTestRule<SettingsActivity> activityRule = new IntentsTestRule<>(SettingsActivity.class,
+                                                                                        true,
+                                                                                        false);
+
+    @Rule
+    public final GrantPermissionRule permissionRule = GrantPermissionRule.grant(
+        Manifest.permission.WRITE_EXTERNAL_STORAGE);
+
+    @Test
+    public void open() {
+        Activity test = activityRule.launchActivity(null);
+
+        Screenshot.snapActivity(test).record();
+    }
+}

+ 1 - 1
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");
 

+ 0 - 1
src/androidTest/java/com/owncloud/android/util/TestSorting.java

@@ -469,7 +469,6 @@ public class TestSorting {
                 }
 
 
-
                 return false;
             }
         }