Fix bug 1844502: Add create_test.py to generate Android.mk and AndroidManifest.xml for application tests.
diff --git a/testrunner/android_mk.py b/testrunner/android_mk.py
new file mode 100644
index 0000000..663aa5c
--- /dev/null
+++ b/testrunner/android_mk.py
@@ -0,0 +1,96 @@
+#!/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.
+
+"""In memory representation of Android.mk file.
+
+Specifications for Android.mk can be found at
+development/ndk/docs/ANDROID-MK.txt
+"""
+
+import re
+from sets import Set
+
+
+class AndroidMK(object):
+ """In memory representation of Android.mk file."""
+
+ _RE_INCLUDE = re.compile(r'include\s+\$\((.+)\)')
+ _VAR_DELIMITER = ":="
+ FILENAME = "Android.mk"
+ CERTIFICATE = "LOCAL_CERTIFICATE"
+ PACKAGE_NAME = "LOCAL_PACKAGE_NAME"
+
+ def __init__(self, app_path=None):
+ self._includes = Set() # variables included in makefile
+ self._variables = {} # variables defined in makefile
+
+ if app_path:
+ self.ParseMK(app_path)
+
+ def _ProcessMKLine(self, line):
+ """Add a variable definition or include.
+
+ Ignores unrecognized lines.
+
+ Args:
+ line: line of text from makefile
+ """
+ m = self._RE_INCLUDE.match(line)
+ if m:
+ self._includes.add(m.group(1))
+ else:
+ parts = line.split(self._VAR_DELIMITER)
+ if len(parts) > 1:
+ self._variables[parts[0].strip()] = parts[1].strip()
+
+ def GetVariable(self, identifier):
+ """Retrieve makefile variable.
+
+ Args:
+ identifier: name of variable to retrieve
+ Returns:
+ value of specified identifier, None if identifier not found in makefile
+ """
+ # use dict.get(x) rather than dict[x] to avoid KeyError exception,
+ # so None is returned if identifier not found
+ return self._variables.get(identifier, None)
+
+ def HasInclude(self, identifier):
+ """Check variable is included in makefile.
+
+ Args:
+ identifer: name of variable to check
+ Returns:
+ True if identifer is included in makefile, otherwise False
+ """
+ return identifier in self._includes
+
+ def ParseMK(self, app_path):
+ """Parse Android.mk at the specified path.
+
+ Args:
+ app_path: path to folder containing Android.mk
+ Raises:
+ IOError: Android.mk cannot be found at given path, or cannot be opened
+ for reading
+ """
+ self.app_path = app_path.rstrip("/")
+ self.mk_path = "%s/%s" % (self.app_path, self.FILENAME)
+ mk = open(self.mk_path)
+ for line in mk:
+ self._ProcessMKLine(line)
+ mk.close()