| Index: testing/android/generate_native_test.py
|
| diff --git a/testing/android/generate_native_test.py b/testing/android/generate_native_test.py
|
| deleted file mode 100755
|
| index af5bd8c4aaae336148fa017bd7ec34739fbf0a5a..0000000000000000000000000000000000000000
|
| --- a/testing/android/generate_native_test.py
|
| +++ /dev/null
|
| @@ -1,202 +0,0 @@
|
| -#!/usr/bin/env python
|
| -#
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -# On Android we build unit test bundles as shared libraries. To run
|
| -# tests, we launch a special "test runner" apk which loads the library
|
| -# then jumps into it. Since java is required for many tests
|
| -# (e.g. PathUtils.java), a "pure native" test bundle is inadequate.
|
| -#
|
| -# This script, generate_native_test.py, is used to generate the source
|
| -# for an apk that wraps a unit test shared library bundle. That
|
| -# allows us to have a single boiler-plate application be used across
|
| -# all unit test bundles.
|
| -
|
| -import logging
|
| -import optparse
|
| -import os
|
| -import re
|
| -import subprocess
|
| -import sys
|
| -
|
| -# cmd_helper.py is under ../../build/android/
|
| -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..',
|
| - '..', 'build', 'android')))
|
| -from pylib import cmd_helper # pylint: disable=F0401
|
| -
|
| -
|
| -class NativeTestApkGenerator(object):
|
| - """Generate a native test apk source tree.
|
| -
|
| - TODO(jrg): develop this more so the activity name is replaced as
|
| - well. That will allow multiple test runners to be installed at the
|
| - same time. (The complication is that it involves renaming a java
|
| - class, which implies regeneration of a jni header, and on and on...)
|
| - """
|
| -
|
| - # Files or directories we need to copy to create a complete apk test shell.
|
| - _SOURCE_FILES = ['AndroidManifest.xml',
|
| - 'native_test_apk.xml',
|
| - 'res', # res/values/strings.xml
|
| - 'java', # .../ChromeNativeTestActivity.java
|
| - ]
|
| -
|
| - # Files in the destion directory that have a "replaceme" string
|
| - # which should be replaced by the basename of the shared library.
|
| - # Note we also update the filename if 'replaceme' is itself found in
|
| - # the filename.
|
| - _REPLACEME_FILES = ['AndroidManifest.xml',
|
| - 'native_test_apk.xml',
|
| - 'res/values/strings.xml']
|
| -
|
| - def __init__(self, native_library, strip_binary, output_directory,
|
| - target_abi):
|
| - self._native_library = native_library
|
| - self._strip_binary = strip_binary
|
| - self._output_directory = os.path.abspath(output_directory)
|
| - self._target_abi = target_abi
|
| - self._root_name = None
|
| - if self._native_library:
|
| - self._root_name = self._LibraryRoot()
|
| - logging.info('root name: %s', self._root_name)
|
| -
|
| - def _LibraryRoot(self):
|
| - """Return a root name for a shared library.
|
| -
|
| - The root name should be suitable for substitution in apk files
|
| - like the manifest. For example, blah/foo/libbase_unittests.so
|
| - becomes base_unittests.
|
| - """
|
| - rootfinder = re.match('.?lib(.+).so',
|
| - os.path.basename(self._native_library))
|
| - if rootfinder:
|
| - return rootfinder.group(1)
|
| - else:
|
| - return None
|
| -
|
| - def _CopyTemplateFilesAndClearDir(self):
|
| - """Copy files needed to build a new apk.
|
| -
|
| - Uses rsync to avoid unnecessary io. This call also clears outstanding
|
| - files in the directory.
|
| - """
|
| - srcdir = os.path.abspath(os.path.dirname(__file__))
|
| - destdir = self._output_directory
|
| - if not os.path.exists(destdir):
|
| - os.makedirs(destdir)
|
| - elif not '/out/' in destdir:
|
| - raise Exception('Unbelievable output directory; bailing for safety')
|
| - logging.info('rsync %s --> %s', self._SOURCE_FILES, destdir)
|
| - logging.info(cmd_helper.GetCmdOutput(
|
| - ['rsync', '-aRv', '--delete', '--exclude', '.svn'] +
|
| - self._SOURCE_FILES + [destdir], cwd=srcdir))
|
| -
|
| - def _ReplaceStrings(self):
|
| - """Replace 'replaceme' strings in generated files with a root libname.
|
| -
|
| - If we have no root libname (e.g. no shlib was specified), do nothing.
|
| - """
|
| - if not self._root_name:
|
| - return
|
| - logging.info('Replacing "replaceme" with ' + self._root_name)
|
| - for f in self._REPLACEME_FILES:
|
| - dest = os.path.join(self._output_directory, f)
|
| - contents = open(dest).read()
|
| - contents = contents.replace('replaceme', self._root_name)
|
| - dest = dest.replace('replaceme', self._root_name) # update the filename!
|
| - open(dest, 'w').write(contents)
|
| -
|
| - def _CopyLibrary(self):
|
| - """Copy the shlib into the apk source tree (if relevant)."""
|
| - if self._native_library:
|
| - destdir = os.path.join(self._output_directory, 'libs/' + self._target_abi)
|
| - if not os.path.exists(destdir):
|
| - os.makedirs(destdir)
|
| - dest = os.path.join(destdir, os.path.basename(self._native_library))
|
| - logging.info('strip %s --> %s', self._native_library, dest)
|
| - cmd_helper.RunCmd(
|
| - [self._strip_binary, '--strip-unneeded', self._native_library, '-o',
|
| - dest])
|
| -
|
| - def CreateBundle(self):
|
| - """Create the apk bundle source and assemble components."""
|
| - self._CopyTemplateFilesAndClearDir()
|
| - self._ReplaceStrings()
|
| - self._CopyLibrary()
|
| -
|
| - def Compile(self, ant_args):
|
| - """Build the generated apk with ant.
|
| -
|
| - Args:
|
| - ant_args: extra args to pass to ant
|
| - """
|
| - cmd = ['ant']
|
| - if ant_args:
|
| - cmd.extend(ant_args)
|
| - cmd.append("-DAPP_ABI=" + self._target_abi)
|
| - cmd.extend(['-buildfile',
|
| - os.path.join(self._output_directory, 'native_test_apk.xml')])
|
| - logging.info(cmd)
|
| - p = subprocess.Popen(cmd, stderr=subprocess.STDOUT)
|
| - (stdout, _) = p.communicate()
|
| - logging.info(stdout)
|
| - if p.returncode != 0:
|
| - logging.error('Ant return code %d', p.returncode)
|
| - sys.exit(p.returncode)
|
| -
|
| -def main(argv):
|
| - parser = optparse.OptionParser()
|
| - parser.add_option('--verbose',
|
| - help='Be verbose')
|
| - parser.add_option('--native_library',
|
| - help='Full name of native shared library test bundle')
|
| - parser.add_option('--jars',
|
| - help='Space separated list of jars to be included')
|
| - parser.add_option('--output',
|
| - help='Output directory for generated files.')
|
| - parser.add_option('--app_abi', default='armeabi',
|
| - help='ABI for native shared library')
|
| - parser.add_option('--strip-binary',
|
| - help='Binary to use for stripping the native libraries.')
|
| - parser.add_option('--ant-args', action='append',
|
| - help='extra args for ant')
|
| - parser.add_option('--stamp-file',
|
| - help='Path to file to touch on success.')
|
| - parser.add_option('--no-compile', action='store_true',
|
| - help='Use this flag to disable ant compilation.')
|
| -
|
| - options, _ = parser.parse_args(argv)
|
| -
|
| - # It is not an error to specify no native library; the apk should
|
| - # still be generated and build. It will, however, print
|
| - # NATIVE_LOADER_FAILED when run.
|
| - if not options.output:
|
| - raise Exception('No output directory specified for generated files')
|
| -
|
| - if options.verbose:
|
| - logging.basicConfig(level=logging.DEBUG, format=' %(message)s')
|
| -
|
| - if not options.strip_binary:
|
| - options.strip_binary = os.getenv('STRIP')
|
| - if not options.strip_binary:
|
| - raise Exception('No tool for stripping the libraries has been supplied')
|
| -
|
| - ntag = NativeTestApkGenerator(native_library=options.native_library,
|
| - strip_binary=options.strip_binary,
|
| - output_directory=options.output,
|
| - target_abi=options.app_abi)
|
| -
|
| - ntag.CreateBundle()
|
| - if not options.no_compile:
|
| - ntag.Compile(options.ant_args)
|
| -
|
| - if options.stamp_file:
|
| - with file(options.stamp_file, 'a'):
|
| - os.utime(options.stamp_file, None)
|
| -
|
| - logging.info('COMPLETE.')
|
| -
|
| -if __name__ == '__main__':
|
| - sys.exit(main(sys.argv))
|
|
|