Automate testing build output on devices.
Xavier Ducrohet [Thu, 7 Feb 2013 22:00:13 +0000 (14:00 -0800)]
This is to test the plugin itself, not a feature of the plugin.

'gradlew deviceTest' is similar to 'gradlew buildTest' in that
it requires an SDK through ANDROID_HOME, and then builds a set
of projects.

It differs in that it then pushed the project (and its test project)
to a connected device and runs the test there.

Note: This is even longer running that buildTest, and since it
requires a device, it is not a dependence on check. This must
be run separately.

Change-Id: I9d211ef22a680a4fba62314e943de3fdd54e4eee

gradle/build.gradle
gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java
gradle/src/build-test/groovy/com/android/build/gradle/BuildTest.java
gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.groovy [deleted file]
gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.java [new file with mode: 0644]

index 9a47299..a6ffd17 100644 (file)
@@ -31,13 +31,14 @@ dependencies {
     testCompile 'junit:junit:3.8.1'
 
     buildTestCompile sourceSets.main.output
-    buildTestCompile configurations.testCompile
     buildTestCompile sourceSets.test.output
+    buildTestCompile configurations.testCompile
     buildTestCompile configurations.testRuntime
 
     deviceTestCompile sourceSets.main.output
-    deviceTestCompile configurations.testCompile
     deviceTestCompile sourceSets.test.output
+    deviceTestCompile sourceSets.buildTest.output
+    deviceTestCompile configurations.testCompile
     deviceTestCompile configurations.testRuntime
 }
 
@@ -76,19 +77,15 @@ task buildTest(type: Test, dependsOn: publishLocal) {
     systemProperties['jar.path'] = jar.archivePath
 }
 
-task deviceTest(dependsOn: publishLocal) {
+task deviceTest(type: Test, dependsOn: publishLocal) {
     testClassesDir = sourceSets.deviceTest.output.classesDir
     classpath = sourceSets.deviceTest.runtimeClasspath
     description = "Runs the device tests. This requires a device."
     group = "verification"
-    //systemProperties['jar.path'] = jar.archivePath
+    systemProperties['jar.path'] = jar.archivePath
 }
 
-deviceTest.dependsOn buildTest
 check.dependsOn buildTest
-// uncomment when device tests are ready.
-//check.dependsOn deviceTest
-
 
 project.ext.sonatypeUsername = project.hasProperty('sonatypeUsername') ? sonatypeUsername : ""
 project.ext.sonatypePassword = project.hasProperty('sonatypePassword') ? sonatypePassword : ""
index 14bbdff..3e3a055 100644 (file)
@@ -45,7 +45,7 @@ public class AutomatedBuildTest extends BuildTest {
 
     public static Test suite() {
         TestSuite suite = new TestSuite();
-        suite.setName("ManifestMergerTestSuite");
+        suite.setName("AutomatedBuildTest");
 
         for (String gradleVersion : BasePlugin.GRADLE_SUPPORTED_VERSIONS) {
             // first the project we build on all available versions of Gradle
index af00b4d..8afb7ba 100644 (file)
@@ -38,6 +38,10 @@ abstract class BuildTest extends BaseTest {
     }
 
     protected File buildProject(String name, String gradleVersion) {
+        return runTasksOnProject(name, gradleVersion, "clean", "assembleDebug");
+    }
+
+    protected File runTasksOnProject(String name, String gradleVersion, String... tasks) {
         File project = new File(testDir, name);
 
         File buildGradle = new File(project, "build.gradle");
@@ -46,7 +50,7 @@ abstract class BuildTest extends BaseTest {
         }
 
         // build the project
-        runGradleTasks(sdkDir, gradleVersion, project, "clean", "assembleDebug");
+        runGradleTasks(sdkDir, gradleVersion, project, tasks);
 
         return project;
     }
diff --git a/gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.groovy b/gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.groovy
deleted file mode 100644 (file)
index 73a592a..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2012 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.android.build.gradle
-
-import com.android.build.gradle.internal.test.BaseTest
-
-/**
- * Device tests.
- *
- * This build relies on the {@link BuildTest} to have been run, so that all that there
- * is left to do is deploy the tested and test apps to the device and run the tests (and gather
- * the result).
- *
- * The dependency on the build tests is ensured by the gradle tasks definition.
- *
- * This does not test every projects under tests, instead it's a selection that actually has
- * tests.
- *
- */
-public class DeviceTest extends BaseTest {
-
-    private File testDir
-    private File sdkDir
-
-    @Override
-    protected void setUp() throws Exception {
-        testDir = getTestDir()
-        sdkDir = getSdkDir()
-    }
-
-    void testApi() {
-        runTestsOn("api")
-    }
-
-    void testAppLibTest() {
-        runTestsOn("applibtest")
-    }
-
-    void testBasic() {
-        runTestsOn("basic")
-    }
-
-    void testFlavored() {
-        runTestsOn("flavored")
-    }
-
-    void testFlavorLib() {
-        runTestsOn("flavorlib")
-    }
-
-    void testFlavors() {
-        runTestsOn("flavors")
-    }
-
-    void testLibsTest() {
-        runTestsOn("libsTest")
-    }
-
-    void testMigrated() {
-        runTestsOn("migrated")
-    }
-
-    void testMultiRes() {
-        runTestsOn("multires")
-    }
-
-    void testOverlay1() {
-        runTestsOn("overlay1")
-    }
-
-    void testOverlay2() {
-        runTestsOn("overlay2")
-    }
-
-    private File runTestsOn(String name) {
-        return runGradleTasks(name, "check")
-    }
-}
\ No newline at end of file
diff --git a/gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.java b/gradle/src/device-test/groovy/com/android/build/gradle/DeviceTest.java
new file mode 100644 (file)
index 0000000..778327f
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012 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.android.build.gradle;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Device tests.
+ *
+ * This build relies on the {@link BuildTest} to have been run, so that all that there
+ * is left to do is deploy the tested and test apps to the device and run the tests (and gather
+ * the result).
+ *
+ * The dependency on the build tests is ensured by the gradle tasks definition.
+ *
+ * This does not test every projects under tests, instead it's a selection that actually has
+ * tests.
+ *
+ */
+public class DeviceTest extends BuildTest {
+
+    private String projectName;
+    private String gradleVersion;
+
+    private static final String[] sBuiltProjects = new String[] {
+        "api", "applibtest", "basic", "flavored", "flavorlib",
+        "flavors", "libsTest", "migrated", "multires", "overlay1", "overlay2",
+    };
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite();
+        suite.setName("DeviceTest");
+
+        for (String gradleVersion : BasePlugin.GRADLE_SUPPORTED_VERSIONS) {
+            // first the project we build on all available versions of Gradle
+            for (String projectName : sBuiltProjects) {
+                String testName = "check_" + projectName + "_" + gradleVersion;
+
+                DeviceTest test = (DeviceTest) TestSuite.createTest(DeviceTest.class, testName);
+                test.setProjectInfo(projectName, gradleVersion);
+                suite.addTest(test);
+            }
+        }
+
+        return suite;
+    }
+
+    private void setProjectInfo(String projectName, String gradleVersion) {
+        this.projectName = projectName;
+        this.gradleVersion = gradleVersion;
+    }
+
+    @Override
+    protected void runTest() throws Throwable {
+        try {
+            runTasksOnProject(projectName, gradleVersion, "check");
+        } finally {
+            // because runTasksOnProject will throw an exception if the gradle side fails, do this
+            // in the finally block.
+
+            // TODO: Get the test output and copy it in here.
+        }
+    }
+}
\ No newline at end of file