You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.8 KiB
129 lines
3.8 KiB
#!/usr/bin/env python |
|
# Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file |
|
# for details. All rights reserved. Use of this source code is governed by a |
|
# BSD-style license that can be found in the LICENSE file. |
|
|
|
from __future__ import print_function |
|
from glob import glob |
|
from itertools import chain |
|
from os import makedirs |
|
from os.path import exists, join, dirname |
|
from shutil import rmtree |
|
from string import Template, upper |
|
import os |
|
import re |
|
import sys |
|
|
|
import utils |
|
|
|
JCTFROOT = 'third_party/jctf' |
|
DESTINATION_DIR = 'build/generated/test/java/com/android/tools/r8/jctf' |
|
PACKAGE_PREFIX = 'com.google.jctf.test.lib.java.' |
|
RELATIVE_TESTDIR = 'LibTests/src/com/google/jctf/test/lib/java' |
|
TESTDIR = join(JCTFROOT, RELATIVE_TESTDIR) |
|
TEMPLATE = Template( |
|
"""// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file |
|
// for details. All rights reserved. Use of this source code is governed by a |
|
// BSD-style license that can be found in the LICENSE file. |
|
package com.android.tools.r8.jctf.${compilerUnderTest}.${relativePackage}; |
|
|
|
import org.junit.Test; |
|
import com.android.tools.r8.R8RunArtTestsTest; |
|
|
|
/** |
|
* Auto-generated test for the jctf test: |
|
* ${name} |
|
* |
|
* DO NOT EDIT THIS FILE. EDIT THE HERE DOCUMENT TEMPLATE IN |
|
* tools/create_jctf_tests.py INSTEAD! |
|
*/ |
|
public class ${testClassName} extends R8RunArtTestsTest { |
|
|
|
public ${testClassName}() { |
|
super("${nameWithoutPackagePrefix}", DexTool.NONE); |
|
} |
|
|
|
@Test |
|
public void run${testClassName}() throws Exception { |
|
// For testing with other Art VMs than the default set the system property |
|
// 'dex_vm' to the desired VM string (e.g. '4.4.4', see ToolHelper.DexVm) |
|
runJctfTest(CompilerUnderTest.${compilerUnderTestEnum}, |
|
"$classFile", |
|
"$name" |
|
); |
|
} |
|
} |
|
""") |
|
|
|
EXIT_FAILURE = 1 |
|
RE_PACKAGE = re.compile('package\\s+(com[^\\s;]*)') |
|
|
|
def file_contains_string(filepath, search_string): |
|
with open(filepath) as f: |
|
return search_string in f.read() |
|
|
|
def read_package_from_java_file(filepath): |
|
with open(filepath) as f: |
|
for line in f: |
|
m = RE_PACKAGE.search(line) |
|
if m: |
|
return m.groups()[0] |
|
raise IOError("Can't find package statement in java file: " + filepath) |
|
|
|
|
|
def generate_test(class_name, compiler_under_test, compiler_under_test_enum, |
|
relative_package): |
|
filename = join(DESTINATION_DIR, compiler_under_test, |
|
relative_package.replace('.', '/'), class_name + '.java') |
|
utils.makedirs_if_needed(dirname(filename)) |
|
|
|
full_class_name = '{}{}.{}'.format(PACKAGE_PREFIX, relative_package, |
|
class_name) |
|
contents = TEMPLATE.substitute( |
|
compilerUnderTest = compiler_under_test, |
|
relativePackage = relative_package, |
|
name = full_class_name, |
|
testClassName = class_name, |
|
compilerUnderTestEnum = compiler_under_test_enum, |
|
classFile = full_class_name.replace('.', '/') + '.class', |
|
nameWithoutPackagePrefix = '{}.{}'.format(relative_package, class_name)) |
|
|
|
with open(filename, 'w') as f: |
|
f.write(contents) |
|
|
|
def Main(): |
|
if not exists(JCTFROOT): |
|
print('JCTF test package not found in {}'.format(JCTFROOT), |
|
file = sys.stderr) |
|
return EXIT_FAILURE |
|
|
|
for tool in ['d8', 'r8']: |
|
p = join(DESTINATION_DIR, tool) |
|
if exists(p): |
|
rmtree(p) |
|
makedirs(p) |
|
|
|
java_files = (chain.from_iterable(glob(join(x[0], '*.java')) |
|
for x in os.walk(TESTDIR))) |
|
|
|
dot_java_dot = '.java.' |
|
|
|
for f in java_files: |
|
if not file_contains_string(f, '@Test'): |
|
continue |
|
|
|
class_name = os.path.splitext(os.path.basename(f))[0] |
|
assert class_name.find('-') < 0 |
|
|
|
package = read_package_from_java_file(f) |
|
|
|
idx = package.find(dot_java_dot) |
|
assert idx >= 0 |
|
relative_package = package[idx + len(dot_java_dot):] |
|
|
|
generate_test(class_name, 'd8', 'R8_AFTER_D8', relative_package) |
|
generate_test(class_name, 'r8', 'R8', relative_package) |
|
|
|
|
|
if __name__ == '__main__': |
|
sys.exit(Main())
|
|
|