diff options
author | Xavier Ducrohet <xav@android.com> | 2013-01-04 11:44:01 -0800 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2013-01-04 13:47:05 -0800 |
commit | 699b11b8fe52f3dd7b6f3350f7f3228aa306a213 (patch) | |
tree | 5aee5827ac624df3a3746f83a084824e4b96d564 /gradle/src | |
parent | aed769eef90077a9447cf31b40a38c9790bbebc3 (diff) | |
download | build-699b11b8fe52f3dd7b6f3350f7f3228aa306a213.tar.gz |
Add options to the test reporting.
Support for customized results and report location.
Queries the IDevice to construct a name.
Copied the flavorlib samples to flavorlibWithFailedTests and
removed the failing tests from flavorlib as it's still useful to
have as a project with no failing test.
Change-Id: Iea3f2ab0828ab93c2ace3ed41b4a5dda7554bbe3
Diffstat (limited to 'gradle/src')
5 files changed, 78 insertions, 14 deletions
diff --git a/gradle/src/build-test/groovy/com/android/build/gradle/BuildTest.groovy b/gradle/src/build-test/groovy/com/android/build/gradle/BuildTest.groovy index 62f1ba0..1935fdb 100644 --- a/gradle/src/build-test/groovy/com/android/build/gradle/BuildTest.groovy +++ b/gradle/src/build-test/groovy/com/android/build/gradle/BuildTest.groovy @@ -132,10 +132,15 @@ class BuildTest extends BaseTest { void testOtherProjects() { File[] projects = testDir.listFiles() for (File project : projects) { + if (!project.isDirectory()) { + continue + } + String name = project.name if (name.startsWith(".")) { continue } + if (!builtProjects.contains(name)) { buildProject(name) } diff --git a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy index 349c69c..3b1e85a 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy @@ -14,12 +14,12 @@ * limitations under the License. */ package com.android.build.gradle - import com.android.build.gradle.internal.dsl.AaptOptionsImpl import com.android.build.gradle.internal.dsl.AndroidSourceSetFactory import com.android.build.gradle.internal.dsl.DexOptionsImpl import com.android.build.gradle.internal.dsl.GroupableProductFlavor import com.android.build.gradle.internal.dsl.ProductFlavorDsl +import com.android.build.gradle.internal.test.TestOptions import com.android.builder.ProductFlavor import org.gradle.api.Action import org.gradle.api.NamedDomainObjectContainer @@ -28,7 +28,6 @@ import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.reflect.Instantiator - /** * Base android extension for all android plugins. */ @@ -39,6 +38,7 @@ public abstract class BaseExtension { final ProductFlavor defaultConfig final AaptOptionsImpl aaptOptions final DexOptionsImpl dexOptions + final TestOptions testOptions private final BasePlugin plugin private final DefaultDomainObjectSet<BuildVariant> buildVariants = @@ -58,6 +58,7 @@ public abstract class BaseExtension { aaptOptions = instantiator.newInstance(AaptOptionsImpl.class) dexOptions = instantiator.newInstance(DexOptionsImpl.class) + testOptions = instantiator.newInstance(TestOptions.class) sourceSetsContainer = project.container(AndroidSourceSet, new AndroidSourceSetFactory(instantiator, project.fileResolver)) @@ -113,6 +114,10 @@ public abstract class BaseExtension { action.execute(dexOptions) } + void test(Action<TestOptions> action) { + action.execute(testOptions) + } + public DefaultDomainObjectSet<BuildVariant> getBuildVariants() { plugin.createAndroidTasks() return buildVariants diff --git a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy index 3531aff..3e331a1 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy @@ -587,10 +587,18 @@ public abstract class BasePlugin { } runTestsTask.conventionMapping.resultsDir = { - project.file("$project.buildDir/test-results/$variant.flavorDirName") + String location = extension.testOptions.resultsDir != null ? + extension.testOptions.resultsDir : + "$project.buildDir/test-results/$variant.flavorDirName" + + project.file(location) } runTestsTask.conventionMapping.reportsDir = { - project.file("$project.buildDir/reports/tests/$variant.flavorDirName") + String location = extension.testOptions.reportDir != null ? + extension.testOptions.reportDir : + "$project.buildDir/reports/tests/$variant.flavorDirName" + + project.file(location) } variant.runTestsTask = runTestsTask } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/RunTestsTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/RunTestsTask.groovy index 1d00484..6a36248 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/RunTestsTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/RunTestsTask.groovy @@ -14,7 +14,10 @@ * limitations under the License. */ package com.android.build.gradle.internal.tasks + import com.android.SdkConstants +import com.android.annotations.NonNull +import com.android.annotations.Nullable import com.android.build.gradle.internal.ApplicationVariant import com.android.builder.internal.util.concurrent.WaitableExecutor import com.android.builder.testing.CustomTestRunListener @@ -59,6 +62,7 @@ public class RunTestsTask extends BaseTask { private static class DeviceTestRunner implements Callable<Boolean> { private final IDevice mDevice + private final String mDeviceName private final File mResultsDir private final File mTestApk private final ApplicationVariant mVariant @@ -66,9 +70,12 @@ public class RunTestsTask extends BaseTask { private final ApplicationVariant mTestedVariant private final ILogger mLogger - DeviceTestRunner(IDevice device, File testApk, ApplicationVariant variant, File testedApk, - ApplicationVariant testedVariant, File resultsDir, ILogger logger) { + DeviceTestRunner(@NonNull IDevice device, + @NonNull File testApk, @NonNull ApplicationVariant variant, + @Nullable File testedApk, @NonNull ApplicationVariant testedVariant, + @NonNull File resultsDir, @NonNull ILogger logger) { mDevice = device + mDeviceName = computeDeviceName(device) mResultsDir = resultsDir mTestApk = testApk mVariant = variant @@ -81,13 +88,11 @@ public class RunTestsTask extends BaseTask { Boolean call() throws Exception { try { if (mTestedApk != null) { - mLogger.info("Device '%s': installing %s", mDevice.serialNumber, - mTestedApk.absolutePath) + mLogger.info("Device '%s': installing %s", mDeviceName, mTestedApk.absolutePath) mDevice.installPackage(mTestedApk.absolutePath, true /*reinstall*/) } - mLogger.info("Device '%s': installing %s", mDevice.serialNumber, - mTestApk.absolutePath) + mLogger.info("Device '%s': installing %s", mDeviceName, mTestApk.absolutePath) mDevice.installPackage(mTestApk.absolutePath, true /*reinstall*/) @@ -97,7 +102,7 @@ public class RunTestsTask extends BaseTask { runner.setRunName(mDevice.serialNumber) CustomTestRunListener runListener = new CustomTestRunListener( - mDevice.serialNumber, mLogger) + mDeviceName, mLogger) runListener.setReportDir(mResultsDir) runner.run(runListener) @@ -106,16 +111,31 @@ public class RunTestsTask extends BaseTask { } finally { // uninstall the apps String packageName = mVariant.packageName - mLogger.info("Device '%s': uninstalling %s", mDevice.serialNumber, packageName) + mLogger.info("Device '%s': uninstalling %s", mDeviceName, packageName) mDevice.uninstallPackage(packageName) if (mTestedApk != null) { packageName = mTestedVariant.packageName - mLogger.info("Device '%s': uninstalling %s", mDevice.serialNumber, packageName) + mLogger.info("Device '%s': uninstalling %s", mDeviceName, packageName) mDevice.uninstallPackage(packageName) } } } + + private String computeDeviceName(@NonNull IDevice device) { + String version = device.getProperty(IDevice.PROP_BUILD_VERSION); + boolean emulator = device.isEmulator() + + String name; + if (emulator) { + name = mDevice.avdName != null ? mDevice.avdName + "(AVD)" : mDevice.serialNumber + } else { + String model = device.getProperty(IDevice.DEVICE_MODEL_PROPERTY) + name = model != null ? model : mDevice.serialNumber + } + + return version != null ? name + " - " + version : name + } } @TaskAction @@ -134,7 +154,7 @@ public class RunTestsTask extends BaseTask { timeOut -= sleepTime } - if (timeOut == 0) { + if (timeOut <= 0 && !bridge.hasInitialDeviceList()) { throw new BuildException("Timeout getting device list.", null) } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/test/TestOptions.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/test/TestOptions.groovy new file mode 100644 index 0000000..bc16f61 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/test/TestOptions.groovy @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2013 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.internal.test + +/** + * Options for the tests. + */ +class TestOptions { + + String resultsDir + String reportDir +} |