[Android] JUnit runner + gyp changes.
This adds Java code for running junit tests, as well as gyp targets for both runnable and non-runnable host-side JARs. BUG=316383 Review URL: https://codereview.chromium.org/574433003 Cr-Original-Commit-Position: refs/heads/master@{#296340} Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: 2e56d4508e33de5fc60bbbb41c5a5d5534e88174
This commit is contained in:
Родитель
84fc4c4f07
Коммит
a5c26cf3a0
1
all.gyp
1
all.gyp
|
@ -781,6 +781,7 @@
|
|||
'../sandbox/sandbox.gyp:sandbox_linux_unittests_stripped',
|
||||
'../sql/sql.gyp:sql_unittests',
|
||||
'../sync/sync.gyp:sync_unit_tests',
|
||||
'../testing/android/junit/junit_test.gyp:junit_unit_tests',
|
||||
'../third_party/leveldatabase/leveldatabase.gyp:env_chromium_unittests',
|
||||
'../third_party/WebKit/public/all.gyp:*',
|
||||
'../tools/android/android_tools.gyp:android_tools',
|
||||
|
|
|
@ -12,7 +12,8 @@ import sys
|
|||
from util import build_utils
|
||||
from util import md5_check
|
||||
|
||||
def Jar(class_files, classes_dir, jar_path):
|
||||
|
||||
def Jar(class_files, classes_dir, jar_path, manifest_file=None):
|
||||
jar_path = os.path.abspath(jar_path)
|
||||
|
||||
# The paths of the files in the jar will be the same as they are passed in to
|
||||
|
@ -20,7 +21,11 @@ def Jar(class_files, classes_dir, jar_path):
|
|||
# options.classes_dir so the .class file paths in the jar are correct.
|
||||
jar_cwd = classes_dir
|
||||
class_files_rel = [os.path.relpath(f, jar_cwd) for f in class_files]
|
||||
jar_cmd = ['jar', 'cf0', jar_path] + class_files_rel
|
||||
jar_cmd = ['jar', 'cf0', jar_path]
|
||||
if manifest_file:
|
||||
jar_cmd[1] += 'm'
|
||||
jar_cmd.append(os.path.abspath(manifest_file))
|
||||
jar_cmd.extend(class_files_rel)
|
||||
|
||||
record_path = '%s.md5.stamp' % jar_path
|
||||
md5_check.CallAndRecordIfStale(
|
||||
|
@ -34,13 +39,14 @@ def Jar(class_files, classes_dir, jar_path):
|
|||
build_utils.Touch(jar_path, fail_if_missing=True)
|
||||
|
||||
|
||||
def JarDirectory(classes_dir, excluded_classes, jar_path):
|
||||
def JarDirectory(classes_dir, excluded_classes, jar_path, manifest_file=None):
|
||||
class_files = build_utils.FindInDirectory(classes_dir, '*.class')
|
||||
for exclude in excluded_classes:
|
||||
class_files = filter(
|
||||
lambda f: not fnmatch.fnmatch(f, exclude), class_files)
|
||||
|
||||
Jar(class_files, classes_dir, jar_path)
|
||||
Jar(class_files, classes_dir, jar_path, manifest_file=manifest_file)
|
||||
|
||||
|
||||
def main():
|
||||
parser = optparse.OptionParser()
|
||||
|
@ -52,8 +58,12 @@ def main():
|
|||
|
||||
options, _ = parser.parse_args()
|
||||
|
||||
if options.excluded_classes:
|
||||
excluded_classes = build_utils.ParseGypList(options.excluded_classes)
|
||||
else:
|
||||
excluded_classes = []
|
||||
JarDirectory(options.classes_dir,
|
||||
build_utils.ParseGypList(options.excluded_classes),
|
||||
excluded_classes,
|
||||
options.jar_path)
|
||||
|
||||
if options.stamp:
|
||||
|
|
|
@ -10,6 +10,7 @@ import os
|
|||
import shutil
|
||||
import re
|
||||
import sys
|
||||
import textwrap
|
||||
|
||||
from util import build_utils
|
||||
from util import md5_check
|
||||
|
@ -99,6 +100,43 @@ def DoJavac(
|
|||
input_strings=javac_cmd)
|
||||
|
||||
|
||||
_MAX_MANIFEST_LINE_LEN = 72
|
||||
|
||||
|
||||
def CreateManifest(manifest_path, classpath, main_class=None):
|
||||
"""Creates a manifest file with the given parameters.
|
||||
|
||||
This generates a manifest file that compiles with the spec found at
|
||||
http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#JAR_Manifest
|
||||
|
||||
Args:
|
||||
manifest_path: The path to the manifest file that should be created.
|
||||
classpath: The JAR files that should be listed on the manifest file's
|
||||
classpath.
|
||||
main_class: If present, the class containing the main() function.
|
||||
|
||||
"""
|
||||
output = ['Manifest-Version: 1.0']
|
||||
if main_class:
|
||||
output.append('Main-Class: %s' % main_class)
|
||||
if classpath:
|
||||
sanitized_paths = []
|
||||
for path in classpath:
|
||||
sanitized_paths.append(os.path.basename(path.strip('"')))
|
||||
output.append('Class-Path: %s' % ' '.join(sanitized_paths))
|
||||
output.append('Created-By: ')
|
||||
output.append('')
|
||||
|
||||
wrapper = textwrap.TextWrapper(break_long_words=True,
|
||||
drop_whitespace=False,
|
||||
subsequent_indent=' ',
|
||||
width=_MAX_MANIFEST_LINE_LEN - 2)
|
||||
output = '\r\n'.join(w for l in output for w in wrapper.wrap(l))
|
||||
|
||||
with open(manifest_path, 'w') as f:
|
||||
f.write(output)
|
||||
|
||||
|
||||
def main(argv):
|
||||
colorama.init()
|
||||
|
||||
|
@ -139,11 +177,17 @@ def main(argv):
|
|||
'--classes-dir',
|
||||
help='Directory for compiled .class files.')
|
||||
parser.add_option('--jar-path', help='Jar output path.')
|
||||
parser.add_option(
|
||||
'--main-class',
|
||||
help='The class containing the main method.')
|
||||
|
||||
parser.add_option('--stamp', help='Path to touch on success.')
|
||||
|
||||
options, args = parser.parse_args(argv)
|
||||
|
||||
if options.main_class and not options.jar_path:
|
||||
parser.error('--main-class requires --jar-path')
|
||||
|
||||
classpath = []
|
||||
for arg in options.classpath:
|
||||
classpath += build_utils.ParseGypList(arg)
|
||||
|
@ -185,9 +229,16 @@ def main(argv):
|
|||
java_files)
|
||||
|
||||
if options.jar_path:
|
||||
if options.main_class:
|
||||
manifest_file = os.path.join(temp_dir, 'manifest')
|
||||
CreateManifest(manifest_file, classpath,
|
||||
options.main_class)
|
||||
else:
|
||||
manifest_file = None
|
||||
jar.JarDirectory(classes_dir,
|
||||
build_utils.ParseGypList(options.jar_excluded_classes),
|
||||
options.jar_path)
|
||||
options.jar_path,
|
||||
manifest_file=manifest_file)
|
||||
|
||||
if options.classes_dir:
|
||||
# Delete the old classes directory. This ensures that all .class files in
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
# Copyright 2014 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.
|
||||
|
||||
# This file is meant to be included into a target to provide a rule to build
|
||||
# a JAR file for use on a host in a consistent manner.
|
||||
#
|
||||
# To use this, create a gyp target with the following form:
|
||||
# {
|
||||
# 'target_name': 'my_jar',
|
||||
# 'type': 'none',
|
||||
# 'variables': {
|
||||
# 'src_paths': [
|
||||
# 'path/to/directory',
|
||||
# 'path/to/other/directory',
|
||||
# 'path/to/individual_file.java',
|
||||
# ...
|
||||
# ],
|
||||
# },
|
||||
# 'includes': [ 'path/to/this/gypi/file' ],
|
||||
# }
|
||||
#
|
||||
# Required variables:
|
||||
# src_paths - A list of all paths containing java files that should be
|
||||
# included in the jar. Paths can be either directories or files.
|
||||
# Optional/automatic variables:
|
||||
# excluded_src_paths - A list of all paths that should be excluded from
|
||||
# the jar.
|
||||
# generated_src_dirs - Directories containing additional .java files
|
||||
# generated at build time.
|
||||
# input_jars_paths - A list of paths to the jars that should be included
|
||||
# in the classpath.
|
||||
# main_class - The class containing the main() function that should be called
|
||||
# when running the jar file.
|
||||
# jar_excluded_classes - A list of .class files that should be excluded
|
||||
# from the jar.
|
||||
|
||||
{
|
||||
'dependencies': [
|
||||
'<(DEPTH)/build/android/setup.gyp:build_output_dirs',
|
||||
],
|
||||
'variables': {
|
||||
'classes_dir': '<(intermediate_dir)/classes',
|
||||
'excluded_src_paths': [],
|
||||
'generated_src_dirs': [],
|
||||
'input_jars_paths': [],
|
||||
'intermediate_dir': '<(SHARED_INTERMEDIATE_DIR)/<(_target_name)',
|
||||
'jar_dir': '<(PRODUCT_DIR)/lib.java',
|
||||
'jar_excluded_classes': [],
|
||||
'jar_name': '<(_target_name).jar',
|
||||
'jar_path': '<(jar_dir)/<(jar_name)',
|
||||
'main_class%': '',
|
||||
'stamp': '<(intermediate_dir)/jar.stamp',
|
||||
},
|
||||
'all_dependent_settings': {
|
||||
'variables': {
|
||||
'input_jars_paths': ['<(jar_path)']
|
||||
},
|
||||
},
|
||||
'actions': [
|
||||
{
|
||||
'action_name': 'javac_<(_target_name)',
|
||||
'message': 'Compiling <(_target_name) java sources',
|
||||
'variables': {
|
||||
'extra_options': [],
|
||||
'java_sources': [ '<!@(find <@(src_paths) -name "*.java")' ],
|
||||
'conditions': [
|
||||
['"<(excluded_src_paths)" != ""', {
|
||||
'java_sources!': ['<!@(find <@(excluded_src_paths) -name "*.java")']
|
||||
}],
|
||||
['"<(jar_excluded_classes)" != ""', {
|
||||
'extra_options': ['--excluded-classes=<(jar_excluded_classes)']
|
||||
}],
|
||||
['">(main_class)" != ""', {
|
||||
'extra_options': ['--main-class=>(main_class)']
|
||||
}]
|
||||
],
|
||||
},
|
||||
'inputs': [
|
||||
'<(DEPTH)/build/android/gyp/util/build_utils.py',
|
||||
'<(DEPTH)/build/android/gyp/javac.py',
|
||||
'^@(java_sources)',
|
||||
'>@(input_jars_paths)',
|
||||
],
|
||||
'outputs': [
|
||||
'<(jar_path)',
|
||||
'<(stamp)',
|
||||
],
|
||||
'action': [
|
||||
'python', '<(DEPTH)/build/android/gyp/javac.py',
|
||||
'--classpath=>(input_jars_paths)',
|
||||
'--src-gendirs=>(generated_src_dirs)',
|
||||
'--chromium-code=<(chromium_code)',
|
||||
'--stamp=<(stamp)',
|
||||
'--jar-path=<(jar_path)',
|
||||
'<@(extra_options)',
|
||||
'^@(java_sources)',
|
||||
],
|
||||
},
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
# Copyright 2014 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.
|
||||
|
||||
# This file is meant to be included into a target to provide a rule to
|
||||
# copy a prebuilt JAR for use on a host to the output directory.
|
||||
#
|
||||
# To use this, create a gyp target with the following form:
|
||||
# {
|
||||
# 'target_name': 'my_prebuilt_jar',
|
||||
# 'type': 'none',
|
||||
# 'variables': {
|
||||
# 'jar_path': 'path/to/prebuilt.jar',
|
||||
# },
|
||||
# 'includes': [ 'path/to/this/gypi/file' ],
|
||||
# }
|
||||
#
|
||||
# Required variables:
|
||||
# jar_path - The path to the prebuilt jar.
|
||||
|
||||
{
|
||||
'dependencies': [
|
||||
],
|
||||
'variables': {
|
||||
'dest_path': '<(PRODUCT_DIR)/lib.java/<(_target_name).jar',
|
||||
'src_path': '<(jar_path)',
|
||||
},
|
||||
'all_dependent_settings': {
|
||||
'variables': {
|
||||
'input_jars_paths': [
|
||||
'<(dest_path)',
|
||||
]
|
||||
},
|
||||
},
|
||||
'actions': [
|
||||
{
|
||||
'action_name': 'copy_prebuilt_jar',
|
||||
'message': 'Copy <(src_path) to <(dest_path)',
|
||||
'inputs': [
|
||||
'<(src_path)',
|
||||
],
|
||||
'outputs': [
|
||||
'<(dest_path)',
|
||||
],
|
||||
'action': [
|
||||
'python', '<(DEPTH)/build/cp.py', '<(src_path)', '<(dest_path)',
|
||||
],
|
||||
}
|
||||
]
|
||||
}
|
Загрузка…
Ссылка в новой задаче