diff options
author | Jack Wang <jackwang@google.com> | 2009-06-29 18:47:03 -0700 |
---|---|---|
committer | Jack Wang <jackwang@google.com> | 2009-06-30 18:39:33 -0700 |
commit | 2abd80af5aec583a8095d11aded4705a30ef54b5 (patch) | |
tree | 54a4b00fb17b482502c368ad36ae80b8600f4308 /testrunner/create_test.py | |
parent | 6683fa352a7ed5d2c02c227da1c7268640c19aa4 (diff) | |
download | android_development-2abd80af5aec583a8095d11aded4705a30ef54b5.tar.gz android_development-2abd80af5aec583a8095d11aded4705a30ef54b5.tar.bz2 android_development-2abd80af5aec583a8095d11aded4705a30ef54b5.zip |
Fix bug 1844502: Add create_test.py to generate Android.mk and AndroidManifest.xml for application tests.
Diffstat (limited to 'testrunner/create_test.py')
-rwxr-xr-x | testrunner/create_test.py | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/testrunner/create_test.py b/testrunner/create_test.py new file mode 100755 index 000000000..2fc3a3cff --- /dev/null +++ b/testrunner/create_test.py @@ -0,0 +1,245 @@ +#!/usr/bin/python2.4 +# +# +# Copyright 2009, 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. + +"""Utility to create Android project files for tests.""" + +# python imports +import datetime +import optparse +import os +import string +import sys + +# local imports +import android_mk +import android_manifest + + +class TestsConsts(object): + """Constants for test Android.mk and AndroidManifest.xml creation.""" + + MK_BUILD_INCLUDE = "call all-makefiles-under,$(LOCAL_PATH)" + MK_BUILD_STRING = "\ninclude $(%s)\n" % MK_BUILD_INCLUDE + TEST_MANIFEST_TEMPLATE = """<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) $YEAR 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. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="$PACKAGE_NAME.tests"> + + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation android:name="android.test.InstrumentationTestRunner" + android:targetPackage="$PACKAGE_NAME" + android:label="Tests for $MODULE_NAME"> + </instrumentation> +</manifest> +""" + TEST_MK_TEMPLATE = """LOCAL_PATH := $$(call my-dir) +include $$(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_JAVA_LIBRARIES := android.test.runner + +LOCAL_SRC_FILES := $$(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := ${MODULE_NAME}Tests${CERTIFICATE} + +LOCAL_INSTRUMENTATION_FOR := ${MODULE_NAME} + +LOCAL_SDK_VERSION := current + +include $$(BUILD_PACKAGE) +""" + TESTS_FOLDER = "tests" + + +def _GenerateTestManifest(manifest, module_name, mapping=None): + """Create and populate tests/AndroidManifest.xml with variable values from + Android.mk and AndroidManifest.xml. + + Does nothing if tests/AndroidManifest.xml already exists. + + Args: + manifest: AndroidManifest object for application manifest + module_name: module name used for labelling + mapping: optional user defined mapping of variable values, replaces values + extracted from AndroidManifest.xml + Raises: + IOError: tests/AndroidManifest.xml cannot be opened for writing + """ + # skip if file already exists + tests_path = "%s/%s" % (manifest.app_path, TestsConsts.TESTS_FOLDER) + tests_manifest_path = "%s/%s" % (tests_path, manifest.FILENAME) + if os.path.exists(tests_manifest_path): + _PrintMessage("%s already exists, not overwritten" % tests_manifest_path) + return + + if not mapping: + package_name = manifest.GetPackageName() + mapping = {"PACKAGE_NAME":package_name, "MODULE_NAME":module_name, + "YEAR":datetime.date.today().year} + output = string.Template(TestsConsts.TEST_MANIFEST_TEMPLATE).substitute(mapping) + + # create tests folder if not existent + if not os.path.exists(tests_path): + os.mkdir(tests_path) + + # write tests/AndroidManifest.xml + tests_manifest = open(tests_manifest_path, mode="w") + tests_manifest.write(output) + tests_manifest.close() + _PrintMessage("Created %s" % tests_manifest_path) + + +def _GenerateTestMK(mk, mapping=None): + """Create and populate tests/Android.mk with variable values from Android.mk. + + Does nothing if tests/Android.mk already exists. + + Args: + mk: AndroidMK object for application makefile + mapping: optional user defined mapping of variable values, replaces + values stored in mk + Raises: + IOError: tests/Android.mk cannot be opened for writing + """ + # skip if file already exists + tests_path = "%s/%s" % (mk.app_path, TestsConsts.TESTS_FOLDER) + tests_mk_path = "%s/%s" % (tests_path, mk.FILENAME) + if os.path.exists(tests_mk_path): + _PrintMessage("%s already exists, not overwritten" % tests_mk_path) + return + + # append test build if not existent in makefile + if not mk.HasInclude(TestsConsts.MK_BUILD_INCLUDE): + mk_path = "%s/%s" % (mk.app_path, mk.FILENAME) + mk_file = open(mk_path, mode="a") + mk_file.write(TestsConsts.MK_BUILD_STRING) + mk_file.close() + + # construct tests/Android.mk + # include certificate definition if existent in makefile + certificate = mk.GetVariable(mk.CERTIFICATE) + if certificate: + cert_definition = ("\n%s := %s" % (mk.CERTIFICATE, certificate)) + else: + cert_definition = "" + if not mapping: + module_name = mk.GetVariable(mk.PACKAGE_NAME) + mapping = {"MODULE_NAME":module_name, "CERTIFICATE":cert_definition} + output = string.Template(TestsConsts.TEST_MK_TEMPLATE).substitute(mapping) + + # create tests folder if not existent + if not os.path.exists(tests_path): + os.mkdir(tests_path) + + # write tests/Android.mk to disk + tests_mk = open(tests_mk_path, mode="w") + tests_mk.write(output) + tests_mk.close() + _PrintMessage("Created %s" % tests_mk_path) + + +def _ParseArgs(argv): + """Parse the command line arguments. + + Args: + argv: the list of command line arguments + Returns: + a tuple of options and individual command line arguments. + """ + parser = optparse.OptionParser(usage="%s <app_path>" % sys.argv[0]) + options, args = parser.parse_args(argv) + if len(args) < 1: + _PrintError("Error: Incorrect syntax") + parser.print_usage() + sys.exit() + return (options, args) + + +def _PrintMessage(msg): + print >> sys.stdout, msg + + +def _PrintError(msg): + print >> sys.stderr, msg + + +def _ValidateInputFiles(mk, manifest): + """Verify that required variables are defined in input files. + + Args: + mk: AndroidMK object for application makefile + manifest: AndroidManifest object for application manifest + Raises: + RuntimeError: mk does not define LOCAL_PACKAGE_NAME or + manifest does not define package variable + """ + module_name = mk.GetVariable(mk.PACKAGE_NAME) + if not module_name: + raise RuntimeError("Variable %s missing from %s" % + (mk.PACKAGE_NAME, mk.FILENAME)) + + package_name = manifest.GetPackageName() + if not package_name: + raise RuntimeError("Variable package missing from %s" % manifest.FILENAME) + + +def main(argv): + options, args = _ParseArgs(argv) + app_path = args[0]; + + if not os.path.exists(app_path): + _PrintError("Error: Application path %s not found" % app_path) + sys.exit() + + try: + mk = android_mk.AndroidMK(app_path=app_path) + manifest = android_manifest.AndroidManifest(app_path=app_path) + _ValidateInputFiles(mk, manifest) + + module_name = mk.GetVariable(mk.PACKAGE_NAME) + _GenerateTestMK(mk) + _GenerateTestManifest(manifest, module_name) + except Exception, e: + _PrintError("Error: %s" % e) + _PrintError("Error encountered, script aborted") + sys.exit() + + src_path = app_path + "/tests/src" + if not os.path.exists(src_path): + os.mkdir(src_path) + + +if __name__ == "__main__": + main(sys.argv[1:]) |