From 76d3747748cc4c4bcbd3dff3f0ccb7547fd7c85c Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 2 Mar 2018 12:08:09 +0100 Subject: [PATCH] Add support for integration tests Signed-off-by: tobiasKaminsky --- .codecov.yml | 13 + .drone.yml | 62 ++-- build.gradle | 38 +++ scripts/uploadReport.sh | 19 ++ .../java/com/owncloud/android/AbstractIT.java | 90 ++++++ .../java/com/owncloud/android/FileIT.java | 48 ++++ .../java/com/owncloud/android/UploadIT.java | 70 +++++ .../AuthenticatorActivityTest.java | 272 +++++++++--------- .../android/datamodel/OCFileUnitTest.java | 35 ++- .../android/screenshots/ScreenshotsIT.java | 262 ++++++++--------- .../android/uiautomator/InitialTest.java | 88 +++--- .../utils/ErrorMessageAdapterUnitTest.java | 3 +- wait_for_emulator.sh | 4 +- 13 files changed, 642 insertions(+), 362 deletions(-) create mode 100644 .codecov.yml create mode 100755 scripts/uploadReport.sh create mode 100644 src/androidTest/java/com/owncloud/android/AbstractIT.java create mode 100644 src/androidTest/java/com/owncloud/android/FileIT.java create mode 100644 src/androidTest/java/com/owncloud/android/UploadIT.java diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000000..5a7046653d --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,13 @@ +codecov: + branch: master + ci: + - drone.nextcloud.com + +coverage: + precision: 2 + round: down + range: "70...100" + +comment: + layout: "header, diff, changes, uncovered, tree" + behavior: default diff --git a/.drone.yml b/.drone.yml index 0e067f8e43..2df4e1a01c 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,35 +1,34 @@ pipeline: - test: + compile: image: nextcloudci/android:android-35 commands: - # uncomment gplay for Gplay, Modified only - - sh -c "if [ '$FLAVOUR' != 'Generic' ]; then sed -i '/.*com.google.*/s/^.*\\/\\///g' build.gradle; fi" + # uncomment gplay for Gplay + - sh -c "if [ '${FLAVOR}' = 'Gplay' ]; then sed -i '/.*com.google.*/s/^.*\\/\\///g' build.gradle; fi" + # build app and assemble APK + - sh -c "if [ '${FLAVOR}' != 'Lint' ]; then ./gradlew assemble${FLAVOR}; fi" + when: + matrix: + FLAVOR: [Generic, Gplay] - # - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI -c 20M - # - emulator -avd test -no-window & - # - ./wait_for_emulator.sh - - # build app and assemble APK, in debug mode - - sh -c "if [ '$FLAVOUR' != 'Lint' ]; then ./gradlew assemble${FLAVOUR}; fi" - - # run all the instrumented tests of app module - DISABLED until we get an stable setup for Espresso in Travis - # - ./gradlew connectedDebugAndroidTest --info - - # install app, then assemble and install instrumented tests of app module - # - ./gradlew :install${FLAVOUR}Debug - # - ./gradlew :install${FLAVOUR}DebugAndroidTest - - # run sample instrumented unit test - # TODO fails because test runner is not available - #- adb shell am instrument -w -e debug false -e class com.owncloud.android.datamodel.OCFileUnitTest com.owncloud.android.test/android.support.test.runner.AndroidJUnitRunner - - environment: - - ANDROID_TARGET=android-32 - - ANDROID_ABI=armeabi-v7a - - LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:/opt/android-sdk-linux/tools/lib64/gles_mesa/ + test: + image: nextcloudci/android:android-35 + privileged: true + commands: + - emulator -avd android-27 -no-window -no-audio & + - ./wait_for_emulator.sh + - ./gradlew jacocoTestGplayDebugUnitTestReport || scripts/uploadReport.sh $LOG_USERNAME $LOG_PASSWORD $DRONE_BUILD_NUMBER "Unit" + - ./gradlew assembleGplayDebug installGplayDebugAndroidTest + - ./gradlew createGplayDebugCoverageReport || scripts/uploadReport.sh $LOG_USERNAME $LOG_PASSWORD $DRONE_BUILD_NUMBER "IT" + - ./gradlew combinedTestReport + - curl -o codecov.sh https://codecov.io/bash + - bash ./codecov.sh -t fc506ba4-33c3-43e4-a760-aada38c24fd5 + secrets: [ LOG_USERNAME, LOG_PASSWORD ] + when: + matrix: + FLAVOR: Gplay lint: - image: nextcloudci/android:android-32 + image: nextcloudci/android:android-35 commands: # needs gplay - sed -i '/.*com.google.*/s/^.*\\/\\///g' build.gradle @@ -38,7 +37,7 @@ pipeline: secrets: [ GIT_USERNAME, GIT_TOKEN, LOG_USERNAME, LOG_PASSWORD ] when: matrix: - FLAVOUR: Lint + FLAVOR: Lint notify: image: drillster/drone-email @@ -56,9 +55,16 @@ pipeline: branch: master matrix: - FLAVOUR: + FLAVOR: - Generic - Gplay - Lint +services: + server: + image: nextcloudci/server:server-1 + when: + matrix: + FLAVOR: Gplay + branches: master diff --git a/build.gradle b/build.gradle index 4b219c6422..9e5918a94b 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,10 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.1.2' classpath 'com.google.gms:google-services:3.0.0' + classpath 'org.codehaus.groovy:groovy-all:2.4.12' + classpath('com.dicedmelon.gradle:jacoco-android:0.1.2') { + exclude group: 'org.codehaus.groovy', module: 'groovy-all' + } } } @@ -23,6 +27,7 @@ apply plugin: 'com.android.application' apply plugin: 'checkstyle' apply plugin: 'pmd' apply plugin: 'findbugs' +apply plugin: 'jacoco-android' configurations.all { // check for updates every build @@ -33,6 +38,7 @@ ext { supportLibraryVersion = '27.1.1' googleLibraryVersion = '12.0.1' androidLibraryVersion = '1.0.40' + jacocoVersion = "0.7.4.201502262128" travisBuild = System.getenv("TRAVIS") == "true" @@ -99,6 +105,12 @@ android { flavorDimensions "default" + buildTypes { + debug { + testCoverageEnabled true + } + } + productFlavors { // used for f-droid generic { @@ -251,6 +263,14 @@ dependencies { implementation 'org.jetbrains:annotations:15.0' androidTestImplementation 'tools.fastlane:screengrab:1.0.0' + +// jacocoAnt "org.jacoco:org.jacoco.ant:${jacocoVersion}" +// jacocoAgent "org.jacoco:org.jacoco.agent:${jacocoVersion}" +// androidJacocoAgent "org.jacoco:org.jacoco.agent:${jacocoVersion}" +// androidJacocoAnt "org.jacoco:org.jacoco.ant:${jacocoVersion}" +// androidJacocoAnt "org.jacoco:org.jacoco.core:${jacocoVersion}" +// androidJacocoAnt "org.jacoco:org.jacoco.report:${jacocoVersion}" +// androidJacocoAnt "org.jacoco:org.jacoco.agent:${jacocoVersion}" } configurations.all { @@ -270,5 +290,23 @@ android.applicationVariants.all { variant -> } } +task combinedTestReport(type: JacocoReport) { + + reports { + xml.enabled = true + html.enabled = true + } + + def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*'] + def debugTree = fileTree(dir: "$project.buildDir/intermediates/classes/gplay/debug", excludes: fileFilter) + def mainSrc = "$project.projectDir/src/main/java" + + sourceDirectories = files([mainSrc]) + classDirectories = files([debugTree]) + executionData = fileTree(dir: project.buildDir, includes: [ + 'jacoco/testGplayDebugUnitTest.exec', 'outputs/code-coverage/connected/flavors/GPLAY/*coverage.ec' + ]) +} + // uncomment for gplay (must be at the bottom) //apply plugin: 'com.google.gms.google-services' diff --git a/scripts/uploadReport.sh b/scripts/uploadReport.sh new file mode 100755 index 0000000000..3ebe1c3f26 --- /dev/null +++ b/scripts/uploadReport.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +URL=https://nextcloud.kaminsky.me/remote.php/webdav/integrationTests +ID=$3 +USER=$1 +PASS=$2 +TYPE=$4 + +if [ $TYPE = "IT" ]; then + cd build/reports/androidTests/connected/flavors/GPLAY +else + cd build/reports/tests/testGplayDebugUnitTest +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 {} \; + +echo "Uploaded failing tests to https://nextcloud.kaminsky.me/index.php/s/XqY52jBr9ZYfDiz -> $ID" +exit 1 \ No newline at end of file diff --git a/src/androidTest/java/com/owncloud/android/AbstractIT.java b/src/androidTest/java/com/owncloud/android/AbstractIT.java new file mode 100644 index 0000000000..a9e2226602 --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/AbstractIT.java @@ -0,0 +1,90 @@ +package com.owncloud.android; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.support.test.runner.AndroidJUnit4; +import android.test.ApplicationTestCase; + +import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientFactory; +import com.owncloud.android.lib.common.accounts.AccountUtils; +import com.owncloud.android.utils.FileStorageUtils; + +import org.junit.BeforeClass; +import org.junit.runner.RunWith; + +import java.io.File; +import java.io.IOException; + +/** + * Common base for all integration tests + */ + +@RunWith(AndroidJUnit4.class) +public abstract class AbstractIT extends ApplicationTestCase { + + protected static OwnCloudClient client; + protected static Account account; + protected static Context context; + + private static final String username = "test"; + private static final String password = "test"; + private static final String baseUrl = "server"; + + public AbstractIT() { + super(MainApp.class); + } + + @BeforeClass + public static void beforeAll() { + try { + context = MainApp.getAppContext(); + + Account temp = new Account(username + "@" + baseUrl, MainApp.getAccountType()); + + if (!com.owncloud.android.authentication.AccountUtils.exists(temp, context)) { + AccountManager accountManager = AccountManager.get(context); + accountManager.addAccountExplicitly(temp, password, null); + accountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_ACCOUNT_VERSION, + Integer.toString(com.owncloud.android.authentication.AccountUtils.ACCOUNT_VERSION)); + accountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_VERSION, "14.0.0.0"); + accountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_BASE_URL, "http://" + baseUrl); + } + + account = com.owncloud.android.authentication.AccountUtils.getOwnCloudAccountByName(context, + username + "@" + baseUrl); + + if (account == null) { + throw new ActivityNotFoundException(); + } + + client = OwnCloudClientFactory.createOwnCloudClient(account, context); + + createDummyFiles(); + } catch (OperationCanceledException e) { + e.printStackTrace(); + } catch (AuthenticatorException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (AccountUtils.AccountNotFoundException e) { + e.printStackTrace(); + } + } + + protected FileDataStorageManager getStorageManager() { + return new FileDataStorageManager(account, context.getContentResolver()); + } + + private static void createDummyFiles() throws IOException { + new File(FileStorageUtils.getSavePath(account.name)).mkdirs(); + + File file = new File(FileStorageUtils.getSavePath(account.name) + "/123.txt"); + file.createNewFile(); + } +} diff --git a/src/androidTest/java/com/owncloud/android/FileIT.java b/src/androidTest/java/com/owncloud/android/FileIT.java new file mode 100644 index 0000000000..f13f091eaf --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/FileIT.java @@ -0,0 +1,48 @@ +package com.owncloud.android; + +import android.support.test.runner.AndroidJUnit4; + +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.operations.CreateFolderOperation; +import com.owncloud.android.operations.common.SyncOperation; + +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Tests related to file operations + */ + +@RunWith(AndroidJUnit4.class) +public class FileIT extends AbstractIT { + + @Test + public void testCreateFolder() { + String path = "/testFolder/"; + + // folder does not exist yet + assertNull(getStorageManager().getFileByPath(path)); + + SyncOperation syncOp = new CreateFolderOperation(path, true); + RemoteOperationResult result = syncOp.execute(client, getStorageManager()); + + assertTrue(result.isSuccess()); + + // folder exists + assertTrue(getStorageManager().getFileByPath(path).isFolder()); + } + + @Test + public void testCreateNonExistingSubFolder() { + String path = "/testFolder/1/2/3/4/5/"; + // folder does not exist yet + assertNull(getStorageManager().getFileByPath(path)); + + SyncOperation syncOp = new CreateFolderOperation(path, true); + RemoteOperationResult result = syncOp.execute(client, getStorageManager()); + assertTrue(result.isSuccess()); + + // folder exists + assertTrue(getStorageManager().getFileByPath(path).isFolder()); + } +} diff --git a/src/androidTest/java/com/owncloud/android/UploadIT.java b/src/androidTest/java/com/owncloud/android/UploadIT.java new file mode 100644 index 0000000000..7b32334b7f --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/UploadIT.java @@ -0,0 +1,70 @@ +package com.owncloud.android; + +import android.support.test.runner.AndroidJUnit4; + +import com.owncloud.android.db.OCUpload; +import com.owncloud.android.files.services.FileUploader; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.operations.UploadFileOperation; +import com.owncloud.android.utils.FileStorageUtils; + +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Tests related to file uploads + */ + +@RunWith(AndroidJUnit4.class) +public class UploadIT extends AbstractIT { + + @Test + public void testSimpleUpload() { + OCUpload ocUpload = new OCUpload(FileStorageUtils.getSavePath(account.name) + "/123.txt", + "/testUpload/1.txt", account.name); + UploadFileOperation newUpload = new UploadFileOperation( + account, + null, + ocUpload, + false, + false, + FileUploader.LOCAL_BEHAVIOUR_COPY, + context, + false, + false + ); + newUpload.addRenameUploadListener(() -> { + // dummy + }); + + newUpload.setRemoteFolderToBeCreated(); + + RemoteOperationResult result = newUpload.execute(client, getStorageManager()); + assertTrue(result.isSuccess()); + } + + @Test + public void testUploadInNonExistingFolder() { + OCUpload ocUpload = new OCUpload(FileStorageUtils.getSavePath(account.name) + "/123.txt", + "/testUpload/2/3/4/1.txt", account.name); + UploadFileOperation newUpload = new UploadFileOperation( + account, + null, + ocUpload, + false, + false, + FileUploader.LOCAL_BEHAVIOUR_COPY, + context, + false, + false + ); + newUpload.addRenameUploadListener(() -> { + // dummy + }); + + newUpload.setRemoteFolderToBeCreated(); + + RemoteOperationResult result = newUpload.execute(client, getStorageManager()); + assertTrue(result.isSuccess()); + } +} diff --git a/src/androidTest/java/com/owncloud/android/authentication/AuthenticatorActivityTest.java b/src/androidTest/java/com/owncloud/android/authentication/AuthenticatorActivityTest.java index f4141e9fcd..cebf636e86 100644 --- a/src/androidTest/java/com/owncloud/android/authentication/AuthenticatorActivityTest.java +++ b/src/androidTest/java/com/owncloud/android/authentication/AuthenticatorActivityTest.java @@ -1,136 +1,136 @@ -/** - * ownCloud Android client application - * - * Copyright (C) 2015 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.owncloud.android.authentication; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.RemoteException; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.UiDevice; -import android.test.suitebuilder.annotation.LargeTest; - -import com.owncloud.android.R; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.lang.reflect.Field; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isEnabled; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertTrue; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class AuthenticatorActivityTest { - - public static final String EXTRA_ACTION = "ACTION"; - public static final String EXTRA_ACCOUNT = "ACCOUNT"; - - private static final int WAIT_LOGIN = 5000; - - private static final String ERROR_MESSAGE = "Activity not finished"; - private static final String RESULT_CODE = "mResultCode"; - - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule( - AuthenticatorActivity.class){ - @Override - protected Intent getActivityIntent() { - - Context targetContext = InstrumentationRegistry.getInstrumentation() - .getTargetContext(); - Intent result = new Intent(targetContext, AuthenticatorActivity.class); - result.putExtra(EXTRA_ACTION, AuthenticatorActivity.ACTION_CREATE); - result.putExtra(EXTRA_ACCOUNT, ""); - return result; - } - }; - - @Before - public void init(){ - UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); - /*Point[] coordinates = new Point[4]; - coordinates[0] = new Point(248, 1020); - coordinates[1] = new Point(248, 429); - coordinates[2] = new Point(796, 1020); - coordinates[3] = new Point(796, 429);*/ - try { - if (!uiDevice.isScreenOn()) { - uiDevice.wakeUp(); - //uiDevice.swipe(coordinates, 10); - } - } catch (RemoteException e) { - e.printStackTrace(); - } - } - - @Test - public void checkLogin() - throws InterruptedException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { - Bundle arguments = InstrumentationRegistry.getArguments(); - - // Get values passed - String testUser = arguments.getString("TEST_USER"); - String testPassword = arguments.getString("TEST_PASSWORD"); - String testServerURL = arguments.getString("TEST_SERVER_URL"); - - // Check that login button is disabled - onView(withId(R.id.buttonOK)) - .check(matches(not(isEnabled()))); - - // Type server url - onView(withId(R.id.hostUrlInput)) - .perform(typeText(testServerURL), closeSoftKeyboard()); - onView(withId(R.id.account_username)).perform(click()); - - // Type user - onView(withId(R.id.account_username)) - .perform(typeText(testUser), closeSoftKeyboard()); - - // Type user pass - onView(withId(R.id.account_password)) - .perform(typeText(testPassword), closeSoftKeyboard()); - onView(withId(R.id.buttonOK)).perform(click()); - - // Check that the Activity ends after clicking - - Thread.sleep(WAIT_LOGIN); - Field f = Activity.class.getDeclaredField(RESULT_CODE); - f.setAccessible(true); - int mResultCode = f.getInt(mActivityRule.getActivity()); - - assertTrue(ERROR_MESSAGE, mResultCode == Activity.RESULT_OK); - - } -} \ No newline at end of file +//** +// * ownCloud Android client application +// * +// * Copyright (C) 2015 ownCloud Inc. +// * +// * This program is free software: you can redistribute it and/or modify +// * it under the terms of the GNU General Public License version 2, +// * as published by the Free Software Foundation. +// * +// * 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 General Public License for more details. +// * +// * You should have received a copy of the GNU General Public License +// * along with this program. If not, see . +// * +// */ +// +//package com.owncloud.android.authentication; +// +//import android.app.Activity; +//import android.content.Context; +//import android.content.Intent; +//import android.os.Bundle; +//import android.os.RemoteException; +//import android.support.test.InstrumentationRegistry; +//import android.support.test.rule.ActivityTestRule; +//import android.support.test.runner.AndroidJUnit4; +//import android.support.test.uiautomator.UiDevice; +//import android.test.suitebuilder.annotation.LargeTest; +// +//import com.owncloud.android.R; +// +//import org.junit.Before; +//import org.junit.Rule; +//import org.junit.Test; +//import org.junit.runner.RunWith; +// +//import java.lang.reflect.Field; +// +//import static android.support.test.espresso.Espresso.onView; +//import static android.support.test.espresso.action.ViewActions.click; +//import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard; +//import static android.support.test.espresso.action.ViewActions.typeText; +//import static android.support.test.espresso.assertion.ViewAssertions.matches; +//import static android.support.test.espresso.matcher.ViewMatchers.isEnabled; +//import static android.support.test.espresso.matcher.ViewMatchers.withId; +//import static org.hamcrest.Matchers.not; +//import static org.junit.Assert.assertTrue; +// +//@RunWith(AndroidJUnit4.class) +//@LargeTest +//public class AuthenticatorActivityTest { +// +// public static final String EXTRA_ACTION = "ACTION"; +// public static final String EXTRA_ACCOUNT = "ACCOUNT"; +// +// private static final int WAIT_LOGIN = 5000; +// +// private static final String ERROR_MESSAGE = "Activity not finished"; +// private static final String RESULT_CODE = "mResultCode"; +// +// +// @Rule +// public ActivityTestRule mActivityRule = new ActivityTestRule( +// AuthenticatorActivity.class){ +// @Override +// protected Intent getActivityIntent() { +// +// Context targetContext = InstrumentationRegistry.getInstrumentation() +// .getTargetContext(); +// Intent result = new Intent(targetContext, AuthenticatorActivity.class); +// result.putExtra(EXTRA_ACTION, AuthenticatorActivity.ACTION_CREATE); +// result.putExtra(EXTRA_ACCOUNT, ""); +// return result; +// } +// }; +// +// @Before +// public void init(){ +// UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); +// /*Point[] coordinates = new Point[4]; +// coordinates[0] = new Point(248, 1020); +// coordinates[1] = new Point(248, 429); +// coordinates[2] = new Point(796, 1020); +// coordinates[3] = new Point(796, 429);*/ +// try { +// if (!uiDevice.isScreenOn()) { +// uiDevice.wakeUp(); +// //uiDevice.swipe(coordinates, 10); +// } +// } catch (RemoteException e) { +// e.printStackTrace(); +// } +// } +// +// @Test +// public void checkLogin() +// throws InterruptedException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { +// Bundle arguments = InstrumentationRegistry.getArguments(); +// +// // Get values passed +// String testUser = arguments.getString("TEST_USER"); +// String testPassword = arguments.getString("TEST_PASSWORD"); +// String testServerURL = arguments.getString("TEST_SERVER_URL"); +// +// // Check that login button is disabled +// onView(withId(R.id.buttonOK)) +// .check(matches(not(isEnabled()))); +// +// // Type server url +// onView(withId(R.id.hostUrlInput)) +// .perform(typeText(testServerURL), closeSoftKeyboard()); +// onView(withId(R.id.account_username)).perform(click()); +// +// // Type user +// onView(withId(R.id.account_username)) +// .perform(typeText(testUser), closeSoftKeyboard()); +// +// // Type user pass +// onView(withId(R.id.account_password)) +// .perform(typeText(testPassword), closeSoftKeyboard()); +// onView(withId(R.id.buttonOK)).perform(click()); +// +// // Check that the Activity ends after clicking +// +// Thread.sleep(WAIT_LOGIN); +// Field f = Activity.class.getDeclaredField(RESULT_CODE); +// f.setAccessible(true); +// int mResultCode = f.getInt(mActivityRule.getActivity()); +// +// assertTrue(ERROR_MESSAGE, mResultCode == Activity.RESULT_OK); +// +// } +//} \ No newline at end of file diff --git a/src/androidTest/java/com/owncloud/android/datamodel/OCFileUnitTest.java b/src/androidTest/java/com/owncloud/android/datamodel/OCFileUnitTest.java index c2277144b7..f79c509d30 100644 --- a/src/androidTest/java/com/owncloud/android/datamodel/OCFileUnitTest.java +++ b/src/androidTest/java/com/owncloud/android/datamodel/OCFileUnitTest.java @@ -1,21 +1,20 @@ /** - * ownCloud Android client application - * - * @author David A. Velasco - * Copyright (C) 2016 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * ownCloud Android client application * + * @author David A. Velasco + * Copyright (C) 2016 ownCloud Inc. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + *

+ * 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 General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ @@ -115,8 +114,8 @@ public class OCFileUnitTest { assertThat(fileReadFromParcel.getCreationTimestamp(), is(CREATION_TIMESTAMP)); assertThat(fileReadFromParcel.getModificationTimestamp(), is(MODIFICATION_TIMESTAMP)); assertThat( - fileReadFromParcel.getModificationTimestampAtLastSyncForData(), - is(MODIFICATION_TIMESTAMP_AT_LAST_SYNC_FOR_DATA) + fileReadFromParcel.getModificationTimestampAtLastSyncForData(), + is(MODIFICATION_TIMESTAMP_AT_LAST_SYNC_FOR_DATA) ); assertThat(fileReadFromParcel.getLastSyncDateForProperties(), is(LAST_SYNC_DATE_FOR_PROPERTIES)); assertThat(fileReadFromParcel.getLastSyncDateForData(), is(LAST_SYNC_DATE_FOR_DATA)); diff --git a/src/androidTest/java/com/owncloud/android/screenshots/ScreenshotsIT.java b/src/androidTest/java/com/owncloud/android/screenshots/ScreenshotsIT.java index 91db11bea2..3a8d322c7d 100644 --- a/src/androidTest/java/com/owncloud/android/screenshots/ScreenshotsIT.java +++ b/src/androidTest/java/com/owncloud/android/screenshots/ScreenshotsIT.java @@ -1,131 +1,131 @@ -package com.owncloud.android.screenshots; - -import android.content.Intent; -import android.support.test.espresso.Espresso; -import android.support.test.espresso.action.ViewActions; -import android.support.test.espresso.contrib.DrawerActions; -import android.support.test.espresso.matcher.PreferenceMatchers; -import android.support.test.rule.ActivityTestRule; - -import com.owncloud.android.R; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.ui.activity.Preferences; - -import junit.framework.Assert; - -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import tools.fastlane.screengrab.Screengrab; -import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy; -import tools.fastlane.screengrab.locale.LocaleTestRule; - -import static android.support.test.espresso.Espresso.onData; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.anything; -import static org.hamcrest.core.AnyOf.anyOf; - -@RunWith(JUnit4.class) -public class ScreenshotsIT { - @ClassRule - public static final LocaleTestRule localeTestRule = new LocaleTestRule(); - - @Rule - public ActivityTestRule fileDisplayRule = new ActivityTestRule<>(FileDisplayActivity.class); - - @Rule - public ActivityTestRule preferencesRule = new ActivityTestRule<>(Preferences.class, true, false); - - @BeforeClass - public static void beforeAll() { - Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy()); - } - - @Test - public void gridViewScreenshot() throws InterruptedException { - fileDisplayRule.launchActivity(new Intent()); - - Espresso.openContextualActionModeOverflowMenu(); - onView(anyOf(withText(R.string.action_switch_grid_view), withId(R.id.action_switch_view))).perform(click()); - - Thread.sleep(1000); - - Screengrab.screenshot("01_gridView"); - - Espresso.openContextualActionModeOverflowMenu(); - onView(anyOf(withText(R.string.action_switch_list_view), withId(R.id.action_switch_view))).perform(click()); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void listViewScreenshot() throws InterruptedException { - fileDisplayRule.launchActivity(new Intent()); - - // go into work folder - onData(anything()).inAdapterView(withId(R.id.list_root)).atPosition(0).perform(click()); - - Screengrab.screenshot("02_listView"); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void drawerScreenshot() throws InterruptedException { - fileDisplayRule.launchActivity(new Intent()); - - onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); - - Screengrab.screenshot("03_drawer"); - - onView(withId(R.id.drawer_layout)).perform(DrawerActions.close()); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void multipleAccountsScreenshot() throws InterruptedException { - fileDisplayRule.launchActivity(new Intent()); - - onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); - onView(withId(R.id.drawer_active_user)).perform(click()); - - Screengrab.screenshot("04_accounts"); - - onView(withId(R.id.drawer_layout)).perform(DrawerActions.close()); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void autoUploadScreenshot() throws InterruptedException { - fileDisplayRule.launchActivity(new Intent()); - - onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); - onView(anyOf(withText(R.string.drawer_synced_folders), withId(R.id.nav_synced_folders))).perform(click()); - - Screengrab.screenshot("05_autoUpload"); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void davdroidScreenshot() throws InterruptedException { - preferencesRule.launchActivity(new Intent()); - - onData(PreferenceMatchers.withTitle(R.string.prefs_category_more)).perform(ViewActions.scrollTo()); - - Thread.sleep(1000); - - Screengrab.screenshot("06_davdroid"); - - Assert.assertTrue(true); // if we reach this, everything is ok - } -} +//package com.owncloud.android.screenshots; +// +//import android.content.Intent; +//import android.support.test.espresso.Espresso; +//import android.support.test.espresso.action.ViewActions; +//import android.support.test.espresso.contrib.DrawerActions; +//import android.support.test.espresso.matcher.PreferenceMatchers; +//import android.support.test.rule.ActivityTestRule; +// +//import com.owncloud.android.R; +//import com.owncloud.android.ui.activity.FileDisplayActivity; +//import com.owncloud.android.ui.activity.Preferences; +// +//import junit.framework.Assert; +// +//import org.junit.BeforeClass; +//import org.junit.ClassRule; +//import org.junit.Rule; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.junit.runners.JUnit4; +// +//import tools.fastlane.screengrab.Screengrab; +//import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy; +//import tools.fastlane.screengrab.locale.LocaleTestRule; +// +//import static android.support.test.espresso.Espresso.onData; +//import static android.support.test.espresso.Espresso.onView; +//import static android.support.test.espresso.action.ViewActions.click; +//import static android.support.test.espresso.matcher.ViewMatchers.withId; +//import static android.support.test.espresso.matcher.ViewMatchers.withText; +//import static org.hamcrest.Matchers.anything; +//import static org.hamcrest.core.AnyOf.anyOf; +// +//@RunWith(JUnit4.class) +//public class ScreenshotsIT { +// @ClassRule +// public static final LocaleTestRule localeTestRule = new LocaleTestRule(); +// +// @Rule +// public ActivityTestRule fileDisplayRule = new ActivityTestRule<>(FileDisplayActivity.class); +// +// @Rule +// public ActivityTestRule preferencesRule = new ActivityTestRule<>(Preferences.class, true, false); +// +// @BeforeClass +// public static void beforeAll() { +// Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy()); +// } +// +// @Test +// public void gridViewScreenshot() throws InterruptedException { +// fileDisplayRule.launchActivity(new Intent()); +// +// Espresso.openContextualActionModeOverflowMenu(); +// onView(anyOf(withText(R.string.action_switch_grid_view), withId(R.id.action_switch_view))).perform(click()); +// +// Thread.sleep(1000); +// +// Screengrab.screenshot("01_gridView"); +// +// Espresso.openContextualActionModeOverflowMenu(); +// onView(anyOf(withText(R.string.action_switch_list_view), withId(R.id.action_switch_view))).perform(click()); +// +// Assert.assertTrue(true); // if we reach this, everything is ok +// } +// +// @Test +// public void listViewScreenshot() throws InterruptedException { +// fileDisplayRule.launchActivity(new Intent()); +// +// // go into work folder +// onData(anything()).inAdapterView(withId(R.id.list_root)).atPosition(0).perform(click()); +// +// Screengrab.screenshot("02_listView"); +// +// Assert.assertTrue(true); // if we reach this, everything is ok +// } +// +// @Test +// public void drawerScreenshot() throws InterruptedException { +// fileDisplayRule.launchActivity(new Intent()); +// +// onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); +// +// Screengrab.screenshot("03_drawer"); +// +// onView(withId(R.id.drawer_layout)).perform(DrawerActions.close()); +// +// Assert.assertTrue(true); // if we reach this, everything is ok +// } +// +// @Test +// public void multipleAccountsScreenshot() throws InterruptedException { +// fileDisplayRule.launchActivity(new Intent()); +// +// onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); +// onView(withId(R.id.drawer_active_user)).perform(click()); +// +// Screengrab.screenshot("04_accounts"); +// +// onView(withId(R.id.drawer_layout)).perform(DrawerActions.close()); +// +// Assert.assertTrue(true); // if we reach this, everything is ok +// } +// +// @Test +// public void autoUploadScreenshot() throws InterruptedException { +// fileDisplayRule.launchActivity(new Intent()); +// +// onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); +// onView(anyOf(withText(R.string.drawer_synced_folders), withId(R.id.nav_synced_folders))).perform(click()); +// +// Screengrab.screenshot("05_autoUpload"); +// +// Assert.assertTrue(true); // if we reach this, everything is ok +// } +// +// @Test +// public void davdroidScreenshot() throws InterruptedException { +// preferencesRule.launchActivity(new Intent()); +// +// onData(PreferenceMatchers.withTitle(R.string.prefs_category_more)).perform(ViewActions.scrollTo()); +// +// Thread.sleep(1000); +// +// Screengrab.screenshot("06_davdroid"); +// +// Assert.assertTrue(true); // if we reach this, everything is ok +// } +//} diff --git a/src/androidTest/java/com/owncloud/android/uiautomator/InitialTest.java b/src/androidTest/java/com/owncloud/android/uiautomator/InitialTest.java index 6b70cbafed..ea67e256ec 100644 --- a/src/androidTest/java/com/owncloud/android/uiautomator/InitialTest.java +++ b/src/androidTest/java/com/owncloud/android/uiautomator/InitialTest.java @@ -18,24 +18,20 @@ package com.owncloud.android.uiautomator; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SdkSuppress; import android.support.test.runner.AndroidJUnit4; -import android.support.test.uiautomator.By; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiObjectNotFoundException; import android.support.test.uiautomator.UiSelector; -import android.support.test.uiautomator.Until; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; @@ -69,51 +65,51 @@ public class InitialTest { /** * Start owncloud app */ - @Test - public void startAppFromHomeScreen() { - // Perform a short press on the HOME button - mDevice.pressHome(); - - // Wait for launcher - final String launcherPackage = getLauncherPackageName(); - assertThat(launcherPackage, notNullValue()); - mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); - - // Launch the app - Context context = InstrumentationRegistry.getContext(); - final Intent intent = context.getPackageManager() - .getLaunchIntentForPackage(OWNCLOUD_APP_PACKAGE); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - context.startActivity(intent); - - // Wait for the app to appear - mDevice.wait(Until.hasObject(By.pkg(OWNCLOUD_APP_PACKAGE).depth(0)), LAUNCH_TIMEOUT); - } +// @Test +// public void startAppFromHomeScreen() { +// // Perform a short press on the HOME button +// mDevice.pressHome(); +// +// // Wait for launcher +// final String launcherPackage = getLauncherPackageName(); +// assertThat(launcherPackage, notNullValue()); +// mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); +// +// // Launch the app +// Context context = InstrumentationRegistry.getContext(); +// final Intent intent = context.getPackageManager() +// .getLaunchIntentForPackage(OWNCLOUD_APP_PACKAGE); +// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); +// context.startActivity(intent); +// +// // Wait for the app to appear +// mDevice.wait(Until.hasObject(By.pkg(OWNCLOUD_APP_PACKAGE).depth(0)), LAUNCH_TIMEOUT); +// } /** * Start Settings app * * @throws UiObjectNotFoundException */ - @Test - public void startSettingsFromHomeScreen() throws UiObjectNotFoundException { - - mDevice.pressHome(); - - // Wait for launcher - final String launcherPackage = getLauncherPackageName(); - assertThat(launcherPackage, notNullValue()); - mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); - - // Launch the app - Context context = InstrumentationRegistry.getContext(); - final Intent intent = context.getPackageManager() - .getLaunchIntentForPackage(ANDROID_SETTINGS_PACKAGE); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - context.startActivity(intent); - - clickByText(SETTINGS_DATA_USAGE_OPTION); - } +// @Test +// public void startSettingsFromHomeScreen() throws UiObjectNotFoundException { +// +// mDevice.pressHome(); +// +// // Wait for launcher +// final String launcherPackage = getLauncherPackageName(); +// assertThat(launcherPackage, notNullValue()); +// mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); +// +// // Launch the app +// Context context = InstrumentationRegistry.getContext(); +// final Intent intent = context.getPackageManager() +// .getLaunchIntentForPackage(ANDROID_SETTINGS_PACKAGE); +// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); +// context.startActivity(intent); +// +// clickByText(SETTINGS_DATA_USAGE_OPTION); +// } /** * Uses package manager to find the package name of the device launcher. Usually this package diff --git a/src/test/java/com/owncloud/android/utils/ErrorMessageAdapterUnitTest.java b/src/test/java/com/owncloud/android/utils/ErrorMessageAdapterUnitTest.java index b00489dab5..42b8779496 100644 --- a/src/test/java/com/owncloud/android/utils/ErrorMessageAdapterUnitTest.java +++ b/src/test/java/com/owncloud/android/utils/ErrorMessageAdapterUnitTest.java @@ -55,6 +55,7 @@ public class ErrorMessageAdapterUnitTest { private final static String MOCK_TO_DELETE = "to delete this file"; private final static String PATH_TO_DELETE = "/path/to/a.file"; private final static String EXPECTED_ERROR_MESSAGE = "You do not have permission to delete this file"; + private final static String ACCOUNT_TYPE = "nextcloud"; @Mock Resources mMockResources; @@ -67,7 +68,7 @@ public class ErrorMessageAdapterUnitTest { when(mMockResources.getString(R.string.forbidden_permissions_delete)) .thenReturn(MOCK_TO_DELETE); - Account account = new Account("name", MainApp.getAccountType()); + Account account = new Account("name", ACCOUNT_TYPE); // ... when method under test is called ... String errorMessage = ErrorMessageAdapter.getErrorCauseMessage( diff --git a/wait_for_emulator.sh b/wait_for_emulator.sh index 37fa325459..71df3829ba 100755 --- a/wait_for_emulator.sh +++ b/wait_for_emulator.sh @@ -17,8 +17,8 @@ until [[ "$bootanim" =~ "stopped" ]]; do fi fi let "checkcounter += 1" - sleep 10 + sleep 5 done echo "($checkcounter) Done" adb -e shell input keyevent 82 -echo "($checkcounter) Unlocked emulator screen" \ No newline at end of file +echo "($checkcounter) Unlocked emulator screen"