| #!/usr/bin/env python3 |
| # 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 |
| import os |
| import re |
| import sys |
| |
| import utils |
| |
| JCTFROOT = join(utils.REPO_ROOT, 'third_party', 'jctf') |
| DESTINATION_DIR = join(utils.REPO_ROOT, 'build', 'generated', 'test', 'java', |
| 'com', 'android', 'tools', 'r8', 'jctf') |
| PACKAGE_PREFIX = 'com.google.jctf.test.lib.java.' |
| RELATIVE_TESTDIR = join('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 fix_long_path(p): |
| if os.name == 'nt': |
| p = ('\\\\?\\' + p).decode('utf-8') |
| return p |
| |
| def file_contains_string(filepath, search_string): |
| with open(fix_long_path(filepath)) as f: |
| return search_string in f.read() |
| |
| def read_package_from_java_file(filepath): |
| with open(fix_long_path(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('.', os.sep), 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(fix_long_path(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 = fix_long_path(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, 'r8cf', 'R8CF', relative_package) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(Main()) |