From 6edb5a108ef4ef332bafc90defff84201cebd9a7 Mon Sep 17 00:00:00 2001 From: Piotr Gurgul Date: Tue, 1 Sep 2009 21:58:52 -0700 Subject: [PATCH] Add ant-based code coverage support to Android SDK Target 'run-tests' launches all the unit tests against the tested project. Target 'coverage' emma-instruments the tested project's classes, runs the tests against instrumented classes, collects code coverage data and extracts it to human-readable form as report.html. android_test_rules.xml contain additional rules for test projects. Test projects are auto-recognized by presence of the tested.project.dir property, which will be auto-generated for tests projects. Temporarily, please add this property manually to the build.properties file. Current version is mainly tested with default, android generated test projects. This version includes also fixing relative to absolute paths for properties which are most likely to be changed by user in external property file. --- build/sdk.atree | 6 + .../src/com/android/ant/SetupTask.java | 18 +- tools/scripts/android_rules.xml | 170 +++++++++++------- tools/scripts/android_test_rules.xml | 131 ++++++++++++++ tools/scripts/build.template | 1 + 5 files changed, 259 insertions(+), 67 deletions(-) create mode 100644 tools/scripts/android_test_rules.xml diff --git a/build/sdk.atree b/build/sdk.atree index 16d65de16..d3cfced73 100644 --- a/build/sdk.atree +++ b/build/sdk.atree @@ -59,6 +59,7 @@ development/tools/scripts/java_tests_file.template platforms/${PLATFORM_NAME}/te development/tools/scripts/layout.template platforms/${PLATFORM_NAME}/templates/layout.template development/tools/scripts/strings.template platforms/${PLATFORM_NAME}/templates/strings.template development/tools/scripts/android_rules.xml platforms/${PLATFORM_NAME}/templates/android_rules.xml +development/tools/scripts/android_test_rules.xml platforms/${PLATFORM_NAME}/templates/android_test_rules.xml development/tools/scripts/build.template tools/lib/build.template # emacs support @@ -125,6 +126,11 @@ framework/swing-worker-1.1.jar tools/lib/swing-worker-1.1.jar bin/traceview tools/traceview framework/traceview.jar tools/lib/traceview.jar +# emma lib for code coverage support +framework/emmalib.jar tools/lib/emma_device.jar +external/emma/lib/emma.jar tools/lib/emma.jar +external/emma/lib/emma_ant.jar tools/lib/emma_ant.jar + # custom ant tasks framework/anttasks.jar tools/lib/anttasks.jar diff --git a/tools/anttasks/src/com/android/ant/SetupTask.java b/tools/anttasks/src/com/android/ant/SetupTask.java index ffe8314b7..27d73d6ca 100644 --- a/tools/anttasks/src/com/android/ant/SetupTask.java +++ b/tools/anttasks/src/com/android/ant/SetupTask.java @@ -58,7 +58,8 @@ import javax.xml.xpath.XPathExpressionException; */ public final class SetupTask extends ImportTask { private final static String ANDROID_RULES = "android_rules.xml"; - + // additional android rules for test project - depends on android_rules.xml + private final static String ANDROID_TEST_RULES = "android_test_rules.xml"; // ant property with the path to the android.jar private final static String PROPERTY_ANDROID_JAR = "android.jar"; // LEGACY - compatibility with 1.6 and before @@ -103,6 +104,13 @@ public final class SetupTask extends ImportTask { // get the target property value String targetHashString = antProject.getProperty(ProjectProperties.PROPERTY_TARGET); + + boolean isTestProject = false; + + if (antProject.getProperty("tested.project.dir") != null) { + isTestProject = true; + } + if (targetHashString == null) { throw new BuildException("Android Target is not set."); } @@ -215,17 +223,21 @@ public final class SetupTask extends ImportTask { if (mDoImport) { // make sure the file exists. File templates = new File(templateFolder); + if (templates.isDirectory() == false) { throw new BuildException(String.format("Template directory '%s' is missing.", templateFolder)); } + String importedRulesFileName = isTestProject ? ANDROID_TEST_RULES : ANDROID_RULES; + // now check the rules file exists. - File rules = new File(templateFolder, ANDROID_RULES); + File rules = new File(templateFolder, importedRulesFileName); + if (rules.isFile() == false) { throw new BuildException(String.format("Build rules file '%s' is missing.", templateFolder)); - } + } // set the file location to import setFile(rules.getAbsolutePath()); diff --git a/tools/scripts/android_rules.xml b/tools/scripts/android_rules.xml index 64f0e392e..bdb983493 100644 --- a/tools/scripts/android_rules.xml +++ b/tools/scripts/android_rules.xml @@ -27,36 +27,46 @@ - - - - + + + + + + + + - - + + + + + + - + + - - - - - - - + + + + - + - - - - - + + + + + @@ -68,11 +78,11 @@ Creating output directories if needed... - - - - - + + + + + @@ -82,11 +92,11 @@ - + - + @@ -97,9 +107,9 @@ Compiling aidl files into Java classes... - - - + + + @@ -108,27 +118,48 @@ + + - - + destdir="${out.classes.absolute.dir}" + bootclasspathref="android.target.classpath" + verbose="false" classpath="${extensible.classpath}"> + + - - + - + + + + + + + + Converting compiled files and external libraries into @{out.dex.file}... + + + + + + + + + - Converting compiled files and external libraries into ${out.dir}/${dex.file.name}... - - - - - - + + + + + + - - - + + + @@ -171,8 +202,8 @@ - + + Running zip align on final apk... @@ -183,8 +214,10 @@ Debug Package: ${out.debug.package} - - + + + @@ -202,8 +235,8 @@ - + description="Builds the application. The generated apk file must be signed before + it is published."> - + Installing ${out.debug.package} onto default emulator or device... @@ -244,6 +276,13 @@ + + + + @@ -251,11 +290,14 @@ - Unable to run 'ant uninstall', application.package is not defined in build.properties + + Unable to run 'ant uninstall', application.package is not defined in build.properties + - + Uninstalling ${application.package} from the default emulator or device... @@ -264,8 +306,8 @@ - - + + @@ -278,7 +320,7 @@ debug: Builds the application and signs it with a debug key. release: Builds the application. The generated apk file must be signed before it is published. - install: Installs/reinstall the debug package onto a running + install: Installs/reinstalls the debug package onto a running emulator or device. If the application was previously installed, the signatures must match. diff --git a/tools/scripts/android_test_rules.xml b/tools/scripts/android_test_rules.xml new file mode 100644 index 000000000..dbad32dc1 --- /dev/null +++ b/tools/scripts/android_test_rules.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Instrumenting classes from ${instrumentation.dir}/${out.dir}/classes... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Running tests ... + + + + + + + + + + + + + + + + + + + + + + + + + + + Downloading coverage file into project directory... + + + + + + Extracting coverage report... + + + + + + + + + + + + + + diff --git a/tools/scripts/build.template b/tools/scripts/build.template index ca1595416..3959c570f 100644 --- a/tools/scripts/build.template +++ b/tools/scripts/build.template @@ -63,4 +63,5 @@ build steps are used. --> +