瀏覽代碼

Merge pull request #2312 from nextcloud/integrationTests

Add support for integration tests
Andy Scherzinger 7 年之前
父節點
當前提交
8c754f5987

+ 13 - 0
.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

+ 34 - 28
.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"
-
-      # - 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
+      # 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]
 
-    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

+ 42 - 4
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 {
@@ -237,13 +249,13 @@ dependencies {
     testImplementation 'org.mockito:mockito-core:1.10.19'
     // dependencies for instrumented tests
     // JUnit4 Rules
-    androidTestImplementation 'com.android.support.test:rules:1.0.1'
+    androidTestImplementation 'com.android.support.test:rules:1.0.2'
     // Android JUnit Runner
-    androidTestImplementation 'com.android.support.test:runner:1.0.1'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
 
     // Espresso core
-    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
-    androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.1'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.2'
     // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests
     androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
     // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details
@@ -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'

+ 1 - 1
scripts/lint/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 110 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 106 warnings</span>

+ 19 - 0
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

+ 3 - 3
src/androidTest/java/com/owncloud/android/screenshots/ScreenshotsIT.java → src/androidTest/disabledTests/screenshots/ScreenshotsIT.java

@@ -51,7 +51,7 @@ public class ScreenshotsIT {
     @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());
 
@@ -68,7 +68,7 @@ public class ScreenshotsIT {
     @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());
 
@@ -123,7 +123,7 @@ public class ScreenshotsIT {
         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

+ 10 - 14
src/androidTest/java/com/owncloud/android/uiautomator/InitialTest.java → src/androidTest/disabledTests/uiautomator/InitialTest.java

@@ -1,41 +1,37 @@
-/**
- * ownCloud Android client application
- * <p/>
+/*
+ * Nextcloud Android client application
+ *
  * Copyright (C) 2015 ownCloud Inc.
- * <p/>
+ *
  * 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.
- * <p/>
+ *
  * 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.
- * <p/>
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 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;
@@ -67,7 +63,7 @@ public class InitialTest {
     }
 
     /**
-     * Start owncloud app
+     * Start Nextcloud app
      */
     @Test
     public void startAppFromHomeScreen() {

+ 90 - 0
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<MainApp> {
+
+    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();
+    }
+}

+ 48 - 0
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());
+    }
+}

+ 70 - 0
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());
+    }
+}

+ 136 - 136
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 <http://www.gnu.org/licenses/>.
- *
- */
-
-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<AuthenticatorActivity> mActivityRule = new ActivityTestRule<AuthenticatorActivity>(
-            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);
-
-    }
-}
+//**
+// *   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 <http://www.gnu.org/licenses/>.
+// *
+// */
+//
+//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<AuthenticatorActivity> mActivityRule = new ActivityTestRule<AuthenticatorActivity>(
+//            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);
+//
+//    }
+//}

+ 17 - 18
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 <http://www.gnu.org/licenses/>.
+ * ownCloud Android client application
  *
+ * @author David A. Velasco
+ * Copyright (C) 2016 ownCloud Inc.
+ * <p>
+ * 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.
+ * <p>
+ * 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.
+ * <p>
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 
@@ -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));

+ 2 - 1
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(

+ 2 - 2
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"
+echo "($checkcounter) Unlocked emulator screen"