From a2ed1c564eb2583e61e3ac90b5739f2a270ecbf1 Mon Sep 17 00:00:00 2001 From: IgorGanapolsky Date: Mon, 16 Mar 2015 10:10:24 -0400 Subject: [PATCH 001/317] Gradle updates --- README.md | 2 +- build.gradle | 7 +++++++ espresso/BasicSample/app/build.gradle | 6 +++--- espresso/CustomMatcherSample/app/build.gradle | 6 +++--- espresso/DataAdapterSample/app/build.gradle | 6 +++--- espresso/MultiWindowSample/app/build.gradle | 6 +++--- testrunner/AndroidJunitRunnerSample/app/build.gradle | 6 +++--- 7 files changed, 23 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 33eccb8aa..cbe9ecd84 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Prerequisites -------------- - Android SDK v21 -- Android Build Tools v21.1.2 +- Android Build Tools v22.0.0 - Android Support Repository Getting Started diff --git a/build.gradle b/build.gradle index e7e03415f..389ff9563 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,13 @@ buildscript { } } +// To avoid manually setting the same values in all Android modules, set the value on the root +// project and then reference this from the modules +ext { + compileSdkVersion = 22 + buildToolsVersion = "22" +} + allprojects { repositories { jcenter() diff --git a/espresso/BasicSample/app/build.gradle b/espresso/BasicSample/app/build.gradle index 815e2f945..a365cdca3 100644 --- a/espresso/BasicSample/app/build.gradle +++ b/espresso/BasicSample/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.example.android.testing.espresso.BasicSample" minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" diff --git a/espresso/CustomMatcherSample/app/build.gradle b/espresso/CustomMatcherSample/app/build.gradle index a9778f1b5..5634efd30 100644 --- a/espresso/CustomMatcherSample/app/build.gradle +++ b/espresso/CustomMatcherSample/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.example.android.testing.espresso.CustomMatcherSample" minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" diff --git a/espresso/DataAdapterSample/app/build.gradle b/espresso/DataAdapterSample/app/build.gradle index 19f9c904e..0dd4a0820 100644 --- a/espresso/DataAdapterSample/app/build.gradle +++ b/espresso/DataAdapterSample/app/build.gradle @@ -2,13 +2,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.example.android.testing.espresso.DataAdapterSample" minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/espresso/MultiWindowSample/app/build.gradle b/espresso/MultiWindowSample/app/build.gradle index 7e3d73bd8..9d7d9dd47 100644 --- a/espresso/MultiWindowSample/app/build.gradle +++ b/espresso/MultiWindowSample/app/build.gradle @@ -2,13 +2,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.example.android.testing.espresso.MultiWindowSample" minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/testrunner/AndroidJunitRunnerSample/app/build.gradle b/testrunner/AndroidJunitRunnerSample/app/build.gradle index 8581ce885..c0dc5d1e1 100644 --- a/testrunner/AndroidJunitRunnerSample/app/build.gradle +++ b/testrunner/AndroidJunitRunnerSample/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.example.android.testing.androidjunitrunnersample" minSdkVersion 8 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" From 1f13b12b6e86397f88fa4d044fc3aaa85b88d21c Mon Sep 17 00:00:00 2001 From: IgorGanapolsky Date: Mon, 16 Mar 2015 10:14:51 -0400 Subject: [PATCH 002/317] Gradle updates --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 389ff9563..7b10f24ea 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:1.1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From a1a50aee749bea69db576fc9e21b9210ca95969f Mon Sep 17 00:00:00 2001 From: JoseAlcerreca Date: Thu, 19 Mar 2015 10:54:37 +0000 Subject: [PATCH 003/317] Revert "Gradle updates" --- README.md | 2 +- build.gradle | 9 +-------- espresso/BasicSample/app/build.gradle | 6 +++--- espresso/CustomMatcherSample/app/build.gradle | 6 +++--- espresso/DataAdapterSample/app/build.gradle | 6 +++--- espresso/MultiWindowSample/app/build.gradle | 6 +++--- testrunner/AndroidJunitRunnerSample/app/build.gradle | 6 +++--- 7 files changed, 17 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index cbe9ecd84..33eccb8aa 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Prerequisites -------------- - Android SDK v21 -- Android Build Tools v22.0.0 +- Android Build Tools v21.1.2 - Android Support Repository Getting Started diff --git a/build.gradle b/build.gradle index 7b10f24ea..e7e03415f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,20 +5,13 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.3' + classpath 'com.android.tools.build:gradle:1.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } -// To avoid manually setting the same values in all Android modules, set the value on the root -// project and then reference this from the modules -ext { - compileSdkVersion = 22 - buildToolsVersion = "22" -} - allprojects { repositories { jcenter() diff --git a/espresso/BasicSample/app/build.gradle b/espresso/BasicSample/app/build.gradle index a365cdca3..815e2f945 100644 --- a/espresso/BasicSample/app/build.gradle +++ b/espresso/BasicSample/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion + compileSdkVersion 21 + buildToolsVersion '21.1.2' defaultConfig { applicationId "com.example.android.testing.espresso.BasicSample" minSdkVersion 10 - targetSdkVersion 22 + targetSdkVersion 21 versionCode 1 versionName "1.0" diff --git a/espresso/CustomMatcherSample/app/build.gradle b/espresso/CustomMatcherSample/app/build.gradle index 5634efd30..a9778f1b5 100644 --- a/espresso/CustomMatcherSample/app/build.gradle +++ b/espresso/CustomMatcherSample/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion + compileSdkVersion 21 + buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.android.testing.espresso.CustomMatcherSample" minSdkVersion 10 - targetSdkVersion 22 + targetSdkVersion 21 versionCode 1 versionName "1.0" diff --git a/espresso/DataAdapterSample/app/build.gradle b/espresso/DataAdapterSample/app/build.gradle index 0dd4a0820..19f9c904e 100644 --- a/espresso/DataAdapterSample/app/build.gradle +++ b/espresso/DataAdapterSample/app/build.gradle @@ -2,13 +2,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion + compileSdkVersion 21 + buildToolsVersion '21.1.2' defaultConfig { applicationId "com.example.android.testing.espresso.DataAdapterSample" minSdkVersion 10 - targetSdkVersion 22 + targetSdkVersion 21 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/espresso/MultiWindowSample/app/build.gradle b/espresso/MultiWindowSample/app/build.gradle index 9d7d9dd47..7e3d73bd8 100644 --- a/espresso/MultiWindowSample/app/build.gradle +++ b/espresso/MultiWindowSample/app/build.gradle @@ -2,13 +2,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion + compileSdkVersion 21 + buildToolsVersion '21.1.2' defaultConfig { applicationId "com.example.android.testing.espresso.MultiWindowSample" minSdkVersion 10 - targetSdkVersion 22 + targetSdkVersion 21 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/testrunner/AndroidJunitRunnerSample/app/build.gradle b/testrunner/AndroidJunitRunnerSample/app/build.gradle index c0dc5d1e1..8581ce885 100644 --- a/testrunner/AndroidJunitRunnerSample/app/build.gradle +++ b/testrunner/AndroidJunitRunnerSample/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion + compileSdkVersion 21 + buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.android.testing.androidjunitrunnersample" minSdkVersion 8 - targetSdkVersion 22 + targetSdkVersion 21 versionCode 1 versionName "1.0" From 0964b458c5f8a1caec61fd83a1c2b6783b36bb7d Mon Sep 17 00:00:00 2001 From: Jose Alcerreca Date: Thu, 19 Mar 2015 13:41:31 +0000 Subject: [PATCH 004/317] Adds basic samples for UI Automator and unit testing support and updates versions Change-Id: I6f12364528995788e272a8af59320100154134b8 --- build.gradle | 2 +- espresso/BasicSample/app/build.gradle | 10 +- espresso/CustomMatcherSample/app/build.gradle | 13 +- espresso/DataAdapterSample/app/build.gradle | 11 +- espresso/MultiWindowSample/app/build.gradle | 13 +- settings.gradle | 2 + .../AndroidJunitRunnerSample/app/build.gradle | 12 +- uiautomator/BasicSample/.gitignore | 6 + uiautomator/BasicSample/README.md | 22 +++ uiautomator/BasicSample/app/build.gradle | 35 ++++ .../BasicSample/ChangeTextBehaviorTest.java | 130 ++++++++++++++ .../app/src/main/AndroidManifest.xml | 36 ++++ .../uiautomator/BasicSample/MainActivity.java | 69 ++++++++ .../BasicSample/ShowTextActivity.java | 60 +++++++ .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 2088 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 1330 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 2800 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 4432 bytes .../main/res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 6155 bytes .../app/src/main/res/layout/activity_main.xml | 60 +++++++ .../main/res/layout/activity_show_text.xml | 30 ++++ .../app/src/main/res/values-v13/styles.xml | 19 ++ .../app/src/main/res/values-v21/styles.xml | 19 ++ .../app/src/main/res/values-w820dp/dimens.xml | 22 +++ .../app/src/main/res/values/dimens.xml | 22 +++ .../app/src/main/res/values/strings.xml | 23 +++ .../app/src/main/res/values/styles.xml | 20 +++ uiautomator/BasicSample/build.gradle | 16 ++ uiautomator/BasicSample/gradle.properties | 18 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + uiautomator/BasicSample/gradlew | 164 ++++++++++++++++++ uiautomator/BasicSample/gradlew.bat | 90 ++++++++++ uiautomator/BasicSample/settings.gradle | 1 + unittesting/BasicSample/README.md | 47 +++++ unittesting/BasicSample/app/build.gradle | 37 ++++ .../app/src/main/AndroidManifest.xml | 35 ++++ .../BasicSample/EmailValidator.java | 56 ++++++ .../unittesting/BasicSample/MainActivity.java | 131 ++++++++++++++ .../BasicSample/SharedPreferenceEntry.java | 52 ++++++ .../BasicSample/SharedPreferencesHelper.java | 83 +++++++++ .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 3918 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2282 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 5092 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 8086 bytes .../main/res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 11307 bytes .../app/src/main/res/layout/activity_main.xml | 118 +++++++++++++ .../app/src/main/res/values-v21/dimens.xml | 21 +++ .../app/src/main/res/values-v21/styles.xml | 20 +++ .../app/src/main/res/values-w820dp/dimens.xml | 22 +++ .../app/src/main/res/values/dimens.xml | 23 +++ .../app/src/main/res/values/strings.xml | 27 +++ .../app/src/main/res/values/styles.xml | 20 +++ .../BasicSample/EmailValidatorTest.java | 82 +++++++++ .../SharedPreferencesHelperTest.java | 150 ++++++++++++++++ unittesting/BasicSample/build.gradle | 34 ++++ unittesting/BasicSample/gradle.properties | 18 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + unittesting/BasicSample/gradlew | 164 ++++++++++++++++++ unittesting/BasicSample/gradlew.bat | 90 ++++++++++ unittesting/BasicSample/settings.gradle | 1 + 62 files changed, 2133 insertions(+), 35 deletions(-) create mode 100644 uiautomator/BasicSample/.gitignore create mode 100644 uiautomator/BasicSample/README.md create mode 100644 uiautomator/BasicSample/app/build.gradle create mode 100644 uiautomator/BasicSample/app/src/androidTest/java/com/example/android/testing/uiautomator/BasicSample/ChangeTextBehaviorTest.java create mode 100644 uiautomator/BasicSample/app/src/main/AndroidManifest.xml create mode 100644 uiautomator/BasicSample/app/src/main/java/com/example/android/testing/uiautomator/BasicSample/MainActivity.java create mode 100644 uiautomator/BasicSample/app/src/main/java/com/example/android/testing/uiautomator/BasicSample/ShowTextActivity.java create mode 100644 uiautomator/BasicSample/app/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 uiautomator/BasicSample/app/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 uiautomator/BasicSample/app/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 uiautomator/BasicSample/app/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 uiautomator/BasicSample/app/src/main/res/drawable-xxxhdpi/ic_launcher.png create mode 100644 uiautomator/BasicSample/app/src/main/res/layout/activity_main.xml create mode 100644 uiautomator/BasicSample/app/src/main/res/layout/activity_show_text.xml create mode 100644 uiautomator/BasicSample/app/src/main/res/values-v13/styles.xml create mode 100644 uiautomator/BasicSample/app/src/main/res/values-v21/styles.xml create mode 100644 uiautomator/BasicSample/app/src/main/res/values-w820dp/dimens.xml create mode 100644 uiautomator/BasicSample/app/src/main/res/values/dimens.xml create mode 100644 uiautomator/BasicSample/app/src/main/res/values/strings.xml create mode 100644 uiautomator/BasicSample/app/src/main/res/values/styles.xml create mode 100644 uiautomator/BasicSample/build.gradle create mode 100644 uiautomator/BasicSample/gradle.properties create mode 100644 uiautomator/BasicSample/gradle/wrapper/gradle-wrapper.jar create mode 100644 uiautomator/BasicSample/gradle/wrapper/gradle-wrapper.properties create mode 100755 uiautomator/BasicSample/gradlew create mode 100644 uiautomator/BasicSample/gradlew.bat create mode 100644 uiautomator/BasicSample/settings.gradle create mode 100644 unittesting/BasicSample/README.md create mode 100644 unittesting/BasicSample/app/build.gradle create mode 100644 unittesting/BasicSample/app/src/main/AndroidManifest.xml create mode 100644 unittesting/BasicSample/app/src/main/java/com/example/android/testing/unittesting/BasicSample/EmailValidator.java create mode 100644 unittesting/BasicSample/app/src/main/java/com/example/android/testing/unittesting/BasicSample/MainActivity.java create mode 100644 unittesting/BasicSample/app/src/main/java/com/example/android/testing/unittesting/BasicSample/SharedPreferenceEntry.java create mode 100644 unittesting/BasicSample/app/src/main/java/com/example/android/testing/unittesting/BasicSample/SharedPreferencesHelper.java create mode 100755 unittesting/BasicSample/app/src/main/res/drawable-hdpi/ic_launcher.png create mode 100755 unittesting/BasicSample/app/src/main/res/drawable-mdpi/ic_launcher.png create mode 100755 unittesting/BasicSample/app/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100755 unittesting/BasicSample/app/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100755 unittesting/BasicSample/app/src/main/res/drawable-xxxhdpi/ic_launcher.png create mode 100644 unittesting/BasicSample/app/src/main/res/layout/activity_main.xml create mode 100644 unittesting/BasicSample/app/src/main/res/values-v21/dimens.xml create mode 100644 unittesting/BasicSample/app/src/main/res/values-v21/styles.xml create mode 100644 unittesting/BasicSample/app/src/main/res/values-w820dp/dimens.xml create mode 100644 unittesting/BasicSample/app/src/main/res/values/dimens.xml create mode 100644 unittesting/BasicSample/app/src/main/res/values/strings.xml create mode 100644 unittesting/BasicSample/app/src/main/res/values/styles.xml create mode 100644 unittesting/BasicSample/app/src/test/java/com/example/android/testing/unittesting/BasicSample/EmailValidatorTest.java create mode 100644 unittesting/BasicSample/app/src/test/java/com/example/android/testing/unittesting/BasicSample/SharedPreferencesHelperTest.java create mode 100644 unittesting/BasicSample/build.gradle create mode 100644 unittesting/BasicSample/gradle.properties create mode 100644 unittesting/BasicSample/gradle/wrapper/gradle-wrapper.jar create mode 100644 unittesting/BasicSample/gradle/wrapper/gradle-wrapper.properties create mode 100755 unittesting/BasicSample/gradlew create mode 100644 unittesting/BasicSample/gradlew.bat create mode 100644 unittesting/BasicSample/settings.gradle diff --git a/build.gradle b/build.gradle index e7e03415f..a2caaf4af 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:1.1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/espresso/BasicSample/app/build.gradle b/espresso/BasicSample/app/build.gradle index 815e2f945..959703d32 100644 --- a/espresso/BasicSample/app/build.gradle +++ b/espresso/BasicSample/app/build.gradle @@ -1,13 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' - + compileSdkVersion 22 + buildToolsVersion '22' defaultConfig { applicationId "com.example.android.testing.espresso.BasicSample" minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" @@ -19,13 +18,14 @@ android { lintOptions { abortOnError false } + productFlavors { + } } dependencies { // App dependencies compile 'com.android.support:support-annotations:21.0.3' compile 'com.google.guava:guava:18.0' - // Testing-only dependencies androidTestCompile 'com.android.support.test:testing-support-lib:0.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' diff --git a/espresso/CustomMatcherSample/app/build.gradle b/espresso/CustomMatcherSample/app/build.gradle index a9778f1b5..f5a2d1bc1 100644 --- a/espresso/CustomMatcherSample/app/build.gradle +++ b/espresso/CustomMatcherSample/app/build.gradle @@ -1,40 +1,37 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" - + compileSdkVersion 22 + buildToolsVersion '22' defaultConfig { applicationId "com.example.android.testing.espresso.CustomMatcherSample" minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } - buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - packagingOptions { exclude 'LICENSE.txt' } - lintOptions { abortOnError false } + productFlavors { + } } dependencies { // App dependencies compile 'com.android.support:support-annotations:21.0.3' compile 'com.google.guava:guava:18.0' - // Testing-only dependencies androidTestCompile 'com.android.support.test:testing-support-lib:0.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' diff --git a/espresso/DataAdapterSample/app/build.gradle b/espresso/DataAdapterSample/app/build.gradle index 19f9c904e..00bab7dae 100644 --- a/espresso/DataAdapterSample/app/build.gradle +++ b/espresso/DataAdapterSample/app/build.gradle @@ -2,13 +2,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' - + compileSdkVersion 22 + buildToolsVersion '22' defaultConfig { applicationId "com.example.android.testing.espresso.DataAdapterSample" minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -17,15 +16,15 @@ android { packagingOptions { exclude 'LICENSE.txt' } + productFlavors { + } } dependencies { // App dependencies compile 'com.android.support:support-annotations:21.0.3' compile 'com.google.guava:guava:18.0' - // Testing-only dependencies androidTestCompile 'com.android.support.test:testing-support-lib:0.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' - } diff --git a/espresso/MultiWindowSample/app/build.gradle b/espresso/MultiWindowSample/app/build.gradle index 7e3d73bd8..41e2f80cd 100644 --- a/espresso/MultiWindowSample/app/build.gradle +++ b/espresso/MultiWindowSample/app/build.gradle @@ -2,40 +2,37 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' - + compileSdkVersion 22 + buildToolsVersion '22' defaultConfig { applicationId "com.example.android.testing.espresso.MultiWindowSample" minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } - buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - packagingOptions { exclude 'LICENSE.txt' } - lintOptions { abortOnError false } + productFlavors { + } } dependencies { // App dependencies compile 'com.android.support:support-annotations:21.0.3' compile 'com.google.guava:guava:18.0' - // Testing-only dependencies androidTestCompile 'com.android.support.test:testing-support-lib:0.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' diff --git a/settings.gradle b/settings.gradle index c3e72fd84..e08a1aa1a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,4 +2,6 @@ include ':espresso:BasicSample:app' include ':espresso:CustomMatcherSample:app' include ':espresso:MultiWindowSample:app' include ':espresso:DataAdapterSample:app' +include ':uiautomator:BasicSample:app' include ':testrunner:AndroidJunitRunnerSample:app' +include ':unittesting:BasicSample:app' diff --git a/testrunner/AndroidJunitRunnerSample/app/build.gradle b/testrunner/AndroidJunitRunnerSample/app/build.gradle index 8581ce885..886ebb2bb 100644 --- a/testrunner/AndroidJunitRunnerSample/app/build.gradle +++ b/testrunner/AndroidJunitRunnerSample/app/build.gradle @@ -1,36 +1,34 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" - + compileSdkVersion 22 + buildToolsVersion '22' defaultConfig { applicationId "com.example.android.testing.androidjunitrunnersample" minSdkVersion 8 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } - packagingOptions { exclude 'LICENSE.txt' } - buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + productFlavors { + } } dependencies { // App's dependencies, including test compile 'com.android.support:support-annotations:21.0.3' compile 'com.google.guava:guava:18.0' - // Testing-only dependencies androidTestCompile 'com.android.support.test:testing-support-lib:0.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' diff --git a/uiautomator/BasicSample/.gitignore b/uiautomator/BasicSample/.gitignore new file mode 100644 index 000000000..1406630a7 --- /dev/null +++ b/uiautomator/BasicSample/.gitignore @@ -0,0 +1,6 @@ +.gradle +local.properties +.idea +.DS_Store +build +*.iml diff --git a/uiautomator/BasicSample/README.md b/uiautomator/BasicSample/README.md new file mode 100644 index 000000000..0ccfa8909 --- /dev/null +++ b/uiautomator/BasicSample/README.md @@ -0,0 +1,22 @@ +# Basic sample for UiAutomator + +*If you are new to UiAutomator, try this sample first.* + +This project uses the Gradle build system. You don't need an IDE to build and execute it but Android Studio is recommended. + +1. Download the project code, preferably using `git clone`. +1. Open the Android SDK Manager (*Tools* Menu | *Android*) and make sure you have installed the *Android testing support library Repository* under *Extras*. +1. In Android Studio, select *File* | *Open...* and point to the `./build.gradle` file. +1. Check out the relevant code: + * The application under test is located in `src/main/java` + * Tests are in `src/androidTest/java` +1. Create the test configuration with a custom runner: `android.support.test.runner.AndroidJUnitRunner` + * Open *Run* menu | *Edit Configurations* + * Add a new *Android Tests* configuration + * Choose a module + * Add a *Specific instrumentation runner*: `android.support.test.runner.AndroidJUnitRunner` +1. Run the newly created configuration + +The application will be started on the device/emulator and a series of actions will be performed automatically. + +If you are using Android Studio, the *Run* window will show the test results. diff --git a/uiautomator/BasicSample/app/build.gradle b/uiautomator/BasicSample/app/build.gradle new file mode 100644 index 000000000..44773537f --- /dev/null +++ b/uiautomator/BasicSample/app/build.gradle @@ -0,0 +1,35 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 22 + buildToolsVersion '22' + defaultConfig { + applicationId "com.example.android.testing.uiautomator.BasicSample" + minSdkVersion 18 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + packagingOptions { + exclude 'LICENSE.txt' + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + productFlavors { + } +} + +dependencies { + compile 'com.google.guava:guava:18.0' + // Testing-only dependencies + androidTestCompile 'com.android.support.test:testing-support-lib:0.1' + // UiAutomator Testing + androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.0.0' + androidTestCompile 'org.hamcrest:hamcrest-integration:1.1' +} diff --git a/uiautomator/BasicSample/app/src/androidTest/java/com/example/android/testing/uiautomator/BasicSample/ChangeTextBehaviorTest.java b/uiautomator/BasicSample/app/src/androidTest/java/com/example/android/testing/uiautomator/BasicSample/ChangeTextBehaviorTest.java new file mode 100644 index 000000000..3f913f38e --- /dev/null +++ b/uiautomator/BasicSample/app/src/androidTest/java/com/example/android/testing/uiautomator/BasicSample/ChangeTextBehaviorTest.java @@ -0,0 +1,130 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.testing.uiautomator.BasicSample; + +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.UiObject2; +import android.support.test.uiautomator.Until; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +/** + * Basic sample for unbundled UiAutomator. + */ +@RunWith(AndroidJUnit4.class) +@SdkSuppress(minSdkVersion = 18) +public class ChangeTextBehaviorTest { + + private static final String BASIC_SAMPLE_PACKAGE + = "com.example.android.testing.uiautomator.BasicSample"; + + private static final int LAUNCH_TIMEOUT = 5000; + + private static final String STRING_TO_BE_TYPED = "UiAutomator"; + + private UiDevice mDevice; + + @Before + public void startMainActivityFromHomeScreen() { + // Initialize UiDevice instance + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); + + // Start from the home screen + 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 blueprint app + Context context = InstrumentationRegistry.getContext(); + final Intent intent = context.getPackageManager() + .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // Clear out any previous instances + context.startActivity(intent); + + // Wait for the app to appear + mDevice.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT); + } + + @Test + public void checkPreconditions() { + assertThat(mDevice, notNullValue()); + } + + @Test + public void testChangeText_sameActivity() { + // Type text and then press the button. + mDevice.findObject(By.res(BASIC_SAMPLE_PACKAGE, "editTextUserInput")) + .setText(STRING_TO_BE_TYPED); + mDevice.findObject(By.res(BASIC_SAMPLE_PACKAGE, "changeTextBt")) + .click(); + + // Verify the test is displayed in the Ui + UiObject2 changedText = mDevice + .wait(Until.findObject(By.res(BASIC_SAMPLE_PACKAGE, "textToBeChanged")), + 500 /* wait 500ms */); + assertThat(changedText.getText(), is(equalTo(STRING_TO_BE_TYPED))); + } + + @Test + public void testChangeText_newActivity() { + // Type text and then press the button. + mDevice.findObject(By.res(BASIC_SAMPLE_PACKAGE, "editTextUserInput")) + .setText(STRING_TO_BE_TYPED); + mDevice.findObject(By.res(BASIC_SAMPLE_PACKAGE, "activityChangeTextBtn")) + .click(); + + // Verify the test is displayed in the Ui + UiObject2 changedText = mDevice + .wait(Until.findObject(By.res(BASIC_SAMPLE_PACKAGE, "show_text_view")), + 500 /* wait 500ms */); + assertThat(changedText.getText(), is(equalTo(STRING_TO_BE_TYPED))); + } + + /** + * Uses package manager to find the package name of the device launcher. Usually this package + * is "com.android.launcher" but can be different at times. This is a generic solution which + * works on all platforms.` + */ + private String getLauncherPackageName() { + // Create launcher Intent + final Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + + // Use PackageManager to get the launcher package name + PackageManager pm = InstrumentationRegistry.getContext().getPackageManager(); + ResolveInfo resolveInfo = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + return resolveInfo.activityInfo.packageName; + } +} diff --git a/uiautomator/BasicSample/app/src/main/AndroidManifest.xml b/uiautomator/BasicSample/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..ad9335b8f --- /dev/null +++ b/uiautomator/BasicSample/app/src/main/AndroidManifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + diff --git a/uiautomator/BasicSample/app/src/main/java/com/example/android/testing/uiautomator/BasicSample/MainActivity.java b/uiautomator/BasicSample/app/src/main/java/com/example/android/testing/uiautomator/BasicSample/MainActivity.java new file mode 100644 index 000000000..b8bc77297 --- /dev/null +++ b/uiautomator/BasicSample/app/src/main/java/com/example/android/testing/uiautomator/BasicSample/MainActivity.java @@ -0,0 +1,69 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.testing.uiautomator.BasicSample; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +/** + * An {@link Activity} that gets a text string from the user and displays it back when the user + * clicks on one of the two buttons. The first one shows it in the same activity and the second + * one opens another activity and displays the message. + */ +public class MainActivity extends Activity implements View.OnClickListener { + + // The TextView used to display the message inside the Activity. + private TextView mTextView; + + // The EditText where the user types the message. + private EditText mEditText; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + // Set the listeners for the buttons. + findViewById(R.id.changeTextBt).setOnClickListener(this); + findViewById(R.id.activityChangeTextBtn).setOnClickListener(this); + + mTextView = (TextView) findViewById(R.id.textToBeChanged); + mEditText = (EditText) findViewById(R.id.editTextUserInput); + } + + @Override + public void onClick(View view) { + // Get the text from the EditText view. + final String text = mEditText.getText().toString(); + + switch (view.getId()) { + case R.id.changeTextBt: + // First button's interaction: set a text in a text view. + mTextView.setText(text); + break; + case R.id.activityChangeTextBtn: + // Second button's interaction: start an activity and send a message to it. + Intent intent = ShowTextActivity.newStartIntent(this, text); + startActivity(intent); + break; + } + } +} diff --git a/uiautomator/BasicSample/app/src/main/java/com/example/android/testing/uiautomator/BasicSample/ShowTextActivity.java b/uiautomator/BasicSample/app/src/main/java/com/example/android/testing/uiautomator/BasicSample/ShowTextActivity.java new file mode 100644 index 000000000..972bbb774 --- /dev/null +++ b/uiautomator/BasicSample/app/src/main/java/com/example/android/testing/uiautomator/BasicSample/ShowTextActivity.java @@ -0,0 +1,60 @@ +/* + * Copyright 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.testing.uiautomator.BasicSample; + +import com.google.common.base.Strings; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.widget.TextView; + +/** + * A simple {@link Activity} that shows a message. + */ +public class ShowTextActivity extends Activity { + + // The name of the extra data sent through an {@link Intent}. + public final static String KEY_EXTRA_MESSAGE = + "com.example.android.testing.uiautomator.basicsample.MESSAGE"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_show_text); + + // Get the message from the Intent. + Intent intent = getIntent(); + String message = Strings.nullToEmpty(intent.getStringExtra(KEY_EXTRA_MESSAGE)); + + // Show message. + ((TextView)findViewById(R.id.show_text_view)).setText(message); + } + + /** + * Creates an {@link Intent} for {@link ShowTextActivity} with the message to be displayed. + * @param context the {@link Context} where the {@link Intent} will be used + * @param message a {@link String} with text to be displayed + * @return an {@link Intent} used to start {@link ShowTextActivity} + */ + static protected Intent newStartIntent(Context context, String message) { + Intent newIntent = new Intent(context, ShowTextActivity.class); + newIntent.putExtra(KEY_EXTRA_MESSAGE, message); + return newIntent; + } +} diff --git a/uiautomator/BasicSample/app/src/main/res/drawable-hdpi/ic_launcher.png b/uiautomator/BasicSample/app/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6b0f252c49420b54313d16a30b3cf26836adcda4 GIT binary patch literal 2088 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 literal 0 HcmV?d00001 diff --git a/uiautomator/BasicSample/app/src/main/res/drawable-xhdpi/ic_launcher.png b/uiautomator/BasicSample/app/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0edc166fef7b2ed5cd4a435de3f582a1c8f551d4 GIT binary patch literal 2800 zcmb7`c{~&T1I9m_jkyZVIU*`Uu1!{pxe2+NkiO0ckvVfNOZXyZ2_?&&BP@5$Oo#{( zg)&4cS5|KA*YDrof4@JT=lSRP_jz9L1WR)xUM?{%006J?dHsuj)A_$bu>bYB?2t16 za5Wn1>sW_6uKdI8gX|Thww;^DdR!HcfAnj%oVUS!I?kp(Kdn50JE5S|I$gksz!81r zbQ(iA-Q=BG<(#uXeKE8nFV+yb@$!R^G3s7H0T;^BWGqJB4(@a3t{690L)eF}y}4`8 z4{m*3wIdB}ueR0(ns^kwpKQUhe&p1oYu+P}E!&?RnBNb;oA=17rKRFxT_~+NlR}A#{i0uA~M^dHBzL{Hie7k<{qzwk^q3OSU{% z%+I&nlls&)Kwp)szJYfs>P#v*fdn@!cwu9%BG2?)`U@>6L?FnAa149`cPQGUY2GDG8Gg9P$TISg-jDq(aS|2~m z&?LIPw0z^nsmDjN^L6d~nBi?lq+q5UGf$DN`{U_RLupyZ24AqP zS9nCFE&81!#ML<^OZ}t;Pv4vv?TBbgJ=NIu&X};<;_qET%UuXIv#{E0?!QO6{BYMQ zUdX`k>XT+^c_T&csdih3L8w0yQ+g}}h*do9h+F$4V&!;A)9Eu!OW~JqgnJ)pBtn)) z#KH<$T=2}-Nv8fl&#R2=mf|52W&bUzV`iv|m*+y$ae2E^&C8?Hf39mpCi!#;QhI9c zDPt=pId88JIe7#35ijyIc?G*?Xy|^Iu^h?j=)B(+cP+@T7jptXdWW>Z@I&5SUMJnc zBl|F!k1mnd8J?~CNuIrepee&%Bv#0NR8UyHXbz)$RBNfp|Lm^|y}i93lf5VCsp)cx z6<)qms=0m|GpKw&{hbB^F$434)DoX1sv#KvU{l*kvhaNXEwZ(&cqQlgJCzy&4v49r zk?gs4p1z{X`>ClD?SYhsba(g#GF6MZyOFnmHNNrAcDU+wv%z4Wpo|xB^oQQ|XrB*b zla8_`=Dt8`cZYApq8;5`GFS10gEm83D_(5qHR$VuQ=BhY)z8TL z2P}R2)~8>W&iBo+&BaS#97@?@1B}ffByezWV5UEOjQo*sQH2YHL$piKJ55QH(We$e zCMG5YUm~nMA_lCf8`^r44^%Lvfbrv6f8Ihj9JmgD`lLyj(y&T2>&_B#ReGE~oZ-Ju z7OC>WQMQj5R+Z(bO@o*E(~#nr-_OcG-bx=ozDgkf<+d!5NSs($T%@X1%=@tc8HQBG zcKhW-{WlyO4Ru%U-+%OR0wAQ1}si6qAkN02E2Rgc+udl+Es!Td#Rzxx)9VmX1BSZ9EvYg zHIxD3>D2{(Q?jp2UTrOQ#`Srm$X%6dW5tN`wK9ul=H}E7&vP^*HV;vL#+b)#E-x?Z zQUm2?^2cn3i?*R!kf!To7o8DpY&^2!sRXOQt2` zfoJTjL+WO9{a)wNZ-uN=mp7_1mGOhhKUsl~JT(3ExI_DTP$1H^Xt=B?20gZS$3x$k z%D>GTQnau0d{+Q+ubp)(Nk_@cOFva3YZfBsxBw?-$7C$EXXPBllUL`@laq|$zB6?Z z+^b*t$$PaPL)T=EpTHrN5GOIhr|gDNiq&@C{W*YMGduJ^LnuFVESUyXVh4laj`5#Y z<2o(8o)oU+hJ}S?g}v^UpkO`Tx_$If$5YX2s<^~?bda>P9Xlftlcjh?h){_NhX~h+ zDJ`8&er}}7In;^8`+J1W9sb{AJVsi39BI-)5f5(TG@m{Z4

`1-9%1?O z!${y9372X;Of?OY3s7ioUh)u*WHlpthGHKZsa%vLd`D!uP=bX|G6;?VIZ(iv+E>Zf zFFsrR+BztBCyMKAAVm92!R?XCrJV}r?aI)QoRqi9!+SVp#z!@9o)bNph$3^6>_<+_ zc;*C={x0LNO>3reXsf`GG`TGhIx<9#zeUI54(FS}8T&g-CtYctj+w5-4NF4{EPZuC zU(k*4P>ESa3TN+edaLkj41*N}u1WDroID{!^>ab(TF-C`2XZVegB`44kC@Nv;Y|50 zS3Jv9t&uC=GB8OC1a-S%ChN|g`m2NF zbj;(D%h*GPoN(>)f4GH}1`J5Il2Y!1q=@y%6dT<4pMF?!>1c{#51ZXeJJHTAlsPqe zhUZwhu`VWkMD=6(yW&Ll#NR38yS literal 0 HcmV?d00001 diff --git a/uiautomator/BasicSample/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/uiautomator/BasicSample/app/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..252724020dad616277a3633b66bb2304b1b0a1a7 GIT binary patch literal 4432 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 literal 0 HcmV?d00001 diff --git a/uiautomator/BasicSample/app/src/main/res/drawable-xxxhdpi/ic_launcher.png b/uiautomator/BasicSample/app/src/main/res/drawable-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0e23e29d80952150c260f66e4cd5fefb617fa136 GIT binary patch literal 6155 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 + + + + + + + + + +