| # Copyright 2017, 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. | |
| """Generates necessary files for unit test versions for testing. | |
| After adding/changing RenderScript unit tests, run `python RSUnitTests.py` | |
| to ensure that forward/backward compatibility tests run properly. | |
| This file is so when updating/adding unit tests there is one central location | |
| for managing the list of unit tests and their versions. | |
| This is necessary since forward compatibility unit tests are chosen at compile | |
| time where backward compatibility tests are chosen at runtime. | |
| Generates a Java file for backward compatibility testing. | |
| Generates an Android.mk file for forward compatibility testing. | |
| """ | |
| import shutil | |
| import sys | |
| import os | |
| # List of platform API versions and the tests that pass on that version as | |
| # well as all newer versions (e.g. tests under 23 also pass on 24, 25, etc.). | |
| # The Slang version that correctly compiles the test is assumed to be the | |
| # same build tools version unless otherwise specified in | |
| # UNIT_TEST_TOOLS_VERSIONS below. | |
| # The test name must correspond to a UT_{}.java file. | |
| # e.g. alloc -> UT_alloc.java | |
| UNIT_TEST_PLATFORM_VERSIONS = { | |
| 19: [ | |
| 'alloc', | |
| 'array_alloc', | |
| 'array_init', | |
| 'atomic', | |
| 'bitfield', | |
| 'bug_char', | |
| 'check_dims', | |
| 'clamp_relaxed', | |
| 'clamp', | |
| 'constant', | |
| 'convert_relaxed', | |
| 'convert', | |
| 'copy_test', | |
| 'element', | |
| 'foreach', | |
| 'foreach_bounds', | |
| 'fp_mad', | |
| 'instance', | |
| 'int4', | |
| 'kernel', | |
| 'kernel_struct', | |
| 'math', | |
| 'min', | |
| 'noroot', | |
| 'primitives', | |
| 'refcount', | |
| 'reflection3264', | |
| 'rsdebug', | |
| 'rstime', | |
| 'rstypes', | |
| 'sampler', | |
| 'static_globals', | |
| 'struct', | |
| 'unsigned', | |
| 'vector', | |
| ], | |
| 21: [ | |
| 'foreach_multi', | |
| 'math_agree', | |
| 'math_conformance', | |
| ], | |
| 23: [ | |
| 'alloc_copy', | |
| 'alloc_copyPadded', | |
| 'ctxt_default', | |
| 'kernel2d', | |
| 'kernel2d_oldstyle', | |
| 'kernel3d', | |
| 'rsdebug_23', | |
| 'script_group2_gatherscatter', | |
| 'script_group2_nochain', | |
| 'script_group2_pointwise', | |
| ], | |
| 24: [ | |
| 'fp16', | |
| 'fp16_globals', | |
| 'math_24', | |
| 'math_fp16', | |
| 'reduce_backward', | |
| 'reduce', | |
| 'rsdebug_24', | |
| 'script_group2_float', | |
| 'single_source_alloc', | |
| 'single_source_ref_count', | |
| 'single_source_script', | |
| 'small_struct', | |
| 'small_struct_2', | |
| ], | |
| 26: [ | |
| 'blur_validation', | |
| 'struct_field', | |
| 'struct_field_simple', | |
| ], | |
| } | |
| # List of tests and the build tools version they compile correctly on. | |
| # The build tools version is the earliest build tools version that can | |
| # compile it correctly, all versions newer than that version are also | |
| # expected to compile correctly. | |
| # Only to override the platform version in UNIT_TEST_PLATFORM_VERSIONS. | |
| # Only affects forward compatibility tests. | |
| # Useful for Slang regression fixes. | |
| UNIT_TEST_TOOLS_VERSIONS = { | |
| 'small_struct': 26, | |
| 'reflection3264': 26, | |
| } | |
| # Tests that only belong to RSTest_Compat (support lib tests) | |
| SUPPORT_LIB_ONLY_UNIT_TESTS = { | |
| 'alloc_supportlib', | |
| 'apitest', | |
| } | |
| # Tests that are skipped in RSTest_Compat (support lib tests) | |
| SUPPORT_LIB_IGNORE_TESTS = { | |
| 'fp16', | |
| 'fp16_globals', | |
| 'math_fp16', | |
| } | |
| # Dictionary mapping unit tests to the corresponding needed .rs files | |
| # Only needed if UT_{}.java does not map to {}.rs | |
| UNIT_TEST_RS_FILES_OVERRIDE = { | |
| 'alloc_copy': [], | |
| 'alloc_copyPadded': [], | |
| 'blur_validation': [], | |
| 'script_group2_float': ['float_test.rs'], | |
| 'script_group2_gatherscatter': ['addup.rs'], | |
| 'script_group2_nochain': ['increment.rs', 'increment2.rs', 'double.rs'], | |
| 'script_group2_pointwise': ['increment.rs', 'double.rs'], | |
| } | |
| # List of API versions and the corresponding build tools release version | |
| # For use with forward compatibility testing | |
| BUILD_TOOL_VERSIONS = { | |
| 21: '21.1.2', | |
| 22: '22.0.1', | |
| 23: '23.0.3', | |
| 24: '24.0.3', | |
| 25: '25.0.2', | |
| } | |
| # ---------- Makefile generation ---------- | |
| def WriteMakeCopyright(gen_file): | |
| """Writes the copyright for a Makefile to a file.""" | |
| gen_file.write( | |
| '#\n' | |
| '# Copyright (C) 2017 The Android Open Source Project\n' | |
| '#\n' | |
| '# Licensed under the Apache License, Version 2.0 (the "License");\n' | |
| '# you may not use this file except in compliance with the License.\n' | |
| '# You may obtain a copy of the License at\n' | |
| '#\n' | |
| '# http://www.apache.org/licenses/LICENSE-2.0\n' | |
| '#\n' | |
| '# Unless required by applicable law or agreed to in writing, software\n' | |
| '# distributed under the License is distributed on an "AS IS" BASIS,\n' | |
| '# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n' | |
| '# See the License for the specific language governing permissions and\n' | |
| '# limitations under the License.\n' | |
| '#\n\n' | |
| ) | |
| def WriteMakeSrcFiles(gen_file, api_version, src_dirs=['src'], | |
| use_build_tools_version=False): | |
| """Writes applicable LOCAL_SRC_FILES to gen_file. | |
| Includes everything under ./src, base UnitTest class, and test files. | |
| api_version: only tests that can run on this version are added.""" | |
| # Get all tests compatible with the build tool version | |
| # Compatible means build tool version >= test version | |
| tests = [] | |
| for test_version, tests_for_version in ( | |
| UNIT_TEST_PLATFORM_VERSIONS.iteritems()): | |
| if api_version >= test_version: | |
| tests.extend(tests_for_version) | |
| if use_build_tools_version: | |
| tests = [x for x in tests if (x not in UNIT_TEST_TOOLS_VERSIONS or | |
| test_version >= UNIT_TEST_TOOLS_VERSIONS[x])] | |
| tests = sorted(tests) | |
| gen_file.write( | |
| 'LOCAL_SRC_FILES :=\\\n' | |
| ) | |
| for src_dir in src_dirs: | |
| gen_file.write(' $(call all-java-files-under,{})\\\n'.format(src_dir)) | |
| gen_file.write( | |
| ' $(my_rs_unit_tests_path)/UnitTest.java\\\n'.format(src_dir) | |
| ) | |
| for test in tests: | |
| # Add the Java and corresponding rs files to LOCAL_SRC_FILES | |
| gen_file.write( | |
| ' $(my_rs_unit_tests_path)/{}\\\n'.format(JavaFileForUnitTest(test)) | |
| ) | |
| for rs_file in RSFilesForUnitTest(test): | |
| gen_file.write(' $(my_rs_unit_tests_path)/{}\\\n'.format(rs_file)) | |
| # ---------- Java file generation ---------- | |
| def WriteJavaCopyright(gen_file): | |
| """Writes the copyright for a Java file to gen_file.""" | |
| gen_file.write( | |
| '/*\n' | |
| ' * Copyright (C) 2017 The Android Open Source Project\n' | |
| ' *\n' | |
| ' * Licensed under the Apache License, Version 2.0 (the "License");\n' | |
| ' * you may not use this file except in compliance with the License.\n' | |
| ' * You may obtain a copy of the License at\n' | |
| ' *\n' | |
| ' * http://www.apache.org/licenses/LICENSE-2.0\n' | |
| ' *\n' | |
| ' * Unless required by applicable law or agreed to in writing, software\n' | |
| ' * distributed under the License is distributed on an "AS IS" BASIS,\n' | |
| ' * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n' | |
| ' * See the License for the specific language governing permissions and\n' | |
| ' * limitations under the License.\n' | |
| ' */\n\n' | |
| ) | |
| # ---------- Unit Test file functions ---------- | |
| def JavaFileForUnitTest(test): | |
| """Returns the Java file name for a unit test.""" | |
| return 'UT_{}.java'.format(test) | |
| def RSFilesForUnitTest(test): | |
| """Returns a list of .rs files associated with a test.""" | |
| if test in UNIT_TEST_RS_FILES_OVERRIDE: | |
| return UNIT_TEST_RS_FILES_OVERRIDE[test] | |
| else: | |
| # Default is one .rs file with the same name as the input | |
| return ['{}.rs'.format(test)] | |
| # ---------- Dirs ---------- | |
| def ThisScriptDir(): | |
| """Returns the directory this script is in.""" | |
| return os.path.dirname(os.path.realpath(__file__)) | |
| def UnitTestDir(): | |
| """Returns the path to the directory containing the unit tests.""" | |
| return os.path.join(ThisScriptDir(), 'src', 'com', 'android', 'rs', | |
| 'unittest') | |
| def SupportLibOnlyTestDir(): | |
| """Returns the path to the directory with unit tests for support lib.""" | |
| return os.path.join(ThisScriptDir(), 'supportlibonlysrc', 'com', | |
| 'android', 'rs', 'unittest') | |
| def SupportLibGenTestDir(): | |
| """Returns the path to the directory with unit tests for support lib.""" | |
| return os.path.join(ThisScriptDir(), 'supportlibsrc_gen', 'com', | |
| 'android', 'rs', 'unittest') | |
| # ---------- RSTest_Compat/RSTest_Compat19 test generation ---------- | |
| def AllUnitTestsExceptSupportLibOnly(): | |
| """Returns a set of all unit tests except SUPPORT_LIB_ONLY_UNIT_TESTS.""" | |
| ret = set() | |
| for _, tests in UNIT_TEST_PLATFORM_VERSIONS.iteritems(): | |
| ret.update(tests) | |
| return ret | |
| def CopyUnitTestJavaFileToSupportLibTest(java_file_name, java_file_dir): | |
| """Copies the Java file to the support lib dir. | |
| Replaces RenderScript imports with corresponding support lib imports.""" | |
| in_path = os.path.join(java_file_dir, java_file_name) | |
| out_path = os.path.join(SupportLibGenTestDir(), java_file_name) | |
| with open(in_path, 'r') as in_file, open(out_path, 'w') as out_file: | |
| out_file.write( | |
| '// This file is automatically generated from\n' | |
| '// frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py\n' | |
| ) | |
| for line in in_file.readlines(): | |
| if line.startswith('import android.renderscript.'): | |
| line = line.replace('android.renderscript.', | |
| 'androidx.renderscript.') | |
| out_file.write(line) | |
| def CopyUnitTestRSToSupportLibTest(rs_file_name, rs_file_dir): | |
| """Copies the .rs to the support lib dir.""" | |
| in_path = os.path.join(rs_file_dir, rs_file_name) | |
| out_path = os.path.join(SupportLibGenTestDir(), rs_file_name) | |
| with open(out_path, 'w') as out_file: | |
| out_file.write( | |
| '// This file is automatically generated from\n' | |
| '// frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py\n' | |
| ) | |
| with open(in_path, 'r') as in_file: | |
| out_file.write(in_file.read()) | |
| def CopySharedRshToSupportLibTest(): | |
| """Copies shared.rsh to the support lib dir. | |
| Adds a #define RSTEST_COMPAT at the end.""" | |
| shared_rsh = 'shared.rsh' | |
| CopyUnitTestRSToSupportLibTest(shared_rsh, UnitTestDir()) | |
| with open(os.path.join(SupportLibGenTestDir(), shared_rsh), 'a') as shared: | |
| shared.write('\n#define RSTEST_COMPAT\n') | |
| def CopyUnitTestToSupportLibTest(test, test_dir): | |
| """Copies all files corresponding to a unit test to support lib dir.""" | |
| CopyUnitTestJavaFileToSupportLibTest(JavaFileForUnitTest(test), test_dir) | |
| for rs in RSFilesForUnitTest(test): | |
| CopyUnitTestRSToSupportLibTest(rs, test_dir) | |
| def GenerateSupportLibUnitTests(): | |
| """Generates all support lib unit tests.""" | |
| if os.path.exists(SupportLibGenTestDir()): | |
| shutil.rmtree(SupportLibGenTestDir()) | |
| os.makedirs(SupportLibGenTestDir()) | |
| CopySharedRshToSupportLibTest() | |
| CopyUnitTestJavaFileToSupportLibTest('UnitTest.java', UnitTestDir()) | |
| for test in AllUnitTestsExceptSupportLibOnly() - SUPPORT_LIB_IGNORE_TESTS: | |
| CopyUnitTestToSupportLibTest(test, UnitTestDir()) | |
| for test in SUPPORT_LIB_ONLY_UNIT_TESTS: | |
| CopyUnitTestToSupportLibTest(test, SupportLibOnlyTestDir()) | |
| print ('Generated support lib tests at {}' | |
| .format(SupportLibGenTestDir())) | |
| # ---------- RSTest_Compat19 ---------- | |
| def WriteSupportLib19Makefile(gen_file): | |
| """Writes the Makefile for support lib 19 testing.""" | |
| WriteMakeCopyright(gen_file) | |
| gen_file.write( | |
| '# This file is auto-generated by frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py.\n' | |
| '# To change unit tests version, please run the Python script above.\n\n' | |
| 'LOCAL_PATH := $(call my-dir)\n' | |
| 'include $(CLEAR_VARS)\n\n' | |
| 'LOCAL_PACKAGE_NAME := RSTest_Compat19\n' | |
| 'LOCAL_MODULE_TAGS := tests\n\n' | |
| 'LOCAL_STATIC_JAVA_LIBRARIES := \\\n' | |
| ' android-support-test \\\n' | |
| ' android-support-v8-renderscript \\\n\n' | |
| 'LOCAL_RENDERSCRIPT_TARGET_API := 19\n' | |
| 'LOCAL_RENDERSCRIPT_COMPATIBILITY := true\n' | |
| 'LOCAL_RENDERSCRIPT_FLAGS := -rs-package-name=androidx.renderscript\n' | |
| 'LOCAL_SDK_VERSION := current\n' | |
| 'LOCAL_MIN_SDK_VERSION := 8\n\n' | |
| 'my_rs_unit_tests_path := ../RSUnitTests/supportlibsrc_gen/com/android/rs/unittest\n' | |
| ) | |
| WriteMakeSrcFiles(gen_file, 19) | |
| gen_file.write( | |
| '\n' | |
| 'include $(BUILD_PACKAGE)\n\n' | |
| 'my_rs_unit_tests_path :=\n\n' | |
| ) | |
| def SupportLib19MakefileLocation(): | |
| """Returns the location of Makefile for backward compatibility 19 testing.""" | |
| return os.path.join(ThisScriptDir(), '..', 'RSTest_CompatLib19', 'Android.mk') | |
| def GenerateSupportLib19(): | |
| """Generates the necessary file for Support Library tests (19).""" | |
| with open(SupportLib19MakefileLocation(), 'w') as gen_file: | |
| WriteSupportLib19Makefile(gen_file) | |
| print ('Generated support lib (19) Makefile at {}' | |
| .format(SupportLib19MakefileLocation())) | |
| # ---------- RSTestForward ---------- | |
| def ForwardTargetName(build_tool_version_name): | |
| """Returns the target name for a forward compatibility build tool name.""" | |
| make_target_name = 'RSTestForward_{}'.format(build_tool_version_name) | |
| make_target_name = make_target_name.replace('.', '_') | |
| return make_target_name | |
| def ForwardDirLocation(build_tool_version_name): | |
| """Returns location of directory for forward compatibility testing.""" | |
| return os.path.join(ThisScriptDir(), '..', 'RSTestForward', | |
| build_tool_version_name) | |
| def ForwardJavaSrcLocation(build_tool_version_name): | |
| """Returns location of src directory for forward compatibility testing.""" | |
| return os.path.join(ForwardDirLocation(build_tool_version_name), 'src') | |
| def ForwardMakefileLocation(build_tool_version_name): | |
| """Returns the location of the Makefile for forward compatibility testing.""" | |
| return os.path.join(ForwardDirLocation(build_tool_version_name), | |
| 'Android.mk') | |
| def ForwardAndroidManifestLocation(build_tool_version_name): | |
| """Returns AndroidManifest.xml location for forward compatibility testing.""" | |
| return os.path.join(ForwardDirLocation(build_tool_version_name), | |
| 'AndroidManifest.xml') | |
| def ForwardJavaApiVersionLocation(build_tool_version_name): | |
| """Returns Java version file location for forward compatibility testing.""" | |
| return os.path.join(ForwardJavaSrcLocation(build_tool_version_name), | |
| 'RSForwardVersion.java') | |
| def WriteForwardAndroidManifest(gen_file, package): | |
| """Writes forward compatibility AndroidManifest.xml to gen_file.""" | |
| gen_file.write( | |
| '<?xml version="1.0" encoding="utf-8"?>\n' | |
| '<!-- Copyright (C) 2017 The Android Open Source Project\n' | |
| '\n' | |
| ' Licensed under the Apache License, Version 2.0 (the "License");\n' | |
| ' you may not use this file except in compliance with the License.\n' | |
| ' You may obtain a copy of the License at\n' | |
| '\n' | |
| ' http://www.apache.org/licenses/LICENSE-2.0\n' | |
| '\n' | |
| ' Unless required by applicable law or agreed to in writing, software\n' | |
| ' distributed under the License is distributed on an "AS IS" BASIS,\n' | |
| ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n' | |
| ' See the License for the specific language governing permissions and\n' | |
| ' limitations under the License.\n' | |
| '\n' | |
| ' This file is automatically generated by\n' | |
| ' frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py.\n' | |
| '-->\n' | |
| '<manifest xmlns:android="http://schemas.android.com/apk/res/android"\n' | |
| ' package="{}">\n' | |
| ' <uses-sdk\n' | |
| ' android:minSdkVersion="21"\n' | |
| ' android:targetSdkVersion="26" />\n' | |
| '\n' | |
| ' <application\n' | |
| ' android:label="RSTestForward">\n' | |
| ' <uses-library android:name="android.test.runner" />\n' | |
| ' </application>\n' | |
| '\n' | |
| ' <instrumentation\n' | |
| ' android:name="androidx.test.runner.AndroidJUnitRunner"\n' | |
| ' android:targetPackage="{}"\n' | |
| ' android:label="RenderScript Forward Compatibility Tests" />\n' | |
| '</manifest>\n'.format(package, package) | |
| ) | |
| def WriteForwardToolsVersion(gen_file, version): | |
| """Writes forward compatibility Java class with tools version as String.""" | |
| WriteJavaCopyright(gen_file) | |
| gen_file.write( | |
| 'package com.android.rs.testforward;\n\n' | |
| 'public class RSForwardVersion {{\n' | |
| ' public static final String VERSION = "{}";\n' | |
| '}}\n'.format(version) | |
| ) | |
| def WriteForwardMakefile(gen_file, build_tool_version, build_tool_version_name): | |
| """Writes the Makefile for forward compatibility testing. | |
| Makefile contains a build target per build tool version | |
| for forward compatibility testing based on the unit test list at the | |
| top of this file.""" | |
| WriteMakeCopyright(gen_file) | |
| gen_file.write( | |
| '# This file is auto-generated by frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py.\n' | |
| '# To change unit tests version, please run the Python script above.\n\n' | |
| 'ifneq ($(ENABLE_RSTESTS),)\n\n' | |
| 'LOCAL_PATH := $(call my-dir)\n' | |
| 'my_rs_unit_tests_path := ../../RSUnitTests/src/com/android/rs/unittest\n' | |
| ) | |
| make_target_name = ForwardTargetName(build_tool_version_name) | |
| gen_file.write( | |
| '\n' | |
| '# RSTestForward for build tool version {}\n\n' | |
| 'include $(CLEAR_VARS)\n\n' | |
| 'LOCAL_MODULE_TAGS := tests\n' | |
| 'LOCAL_STATIC_JAVA_LIBRARIES := android-support-test\n' | |
| 'LOCAL_COMPATIBILITY_SUITE := device-tests\n' | |
| 'LOCAL_RENDERSCRIPT_TARGET_API := current\n' | |
| 'LOCAL_PACKAGE_NAME := {}\n' | |
| 'LOCAL_SDK_VERSION := current\n' | |
| 'my_rs_path := $(TOP)/prebuilts/renderscript/host/linux-x86/{}\n' | |
| 'LOCAL_RENDERSCRIPT_CC := $(my_rs_path)/bin/llvm-rs-cc\n' | |
| 'LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE := $(my_rs_path)/include $(my_rs_path)/clang-include\n' | |
| 'my_rs_path :=\n'.format( | |
| build_tool_version_name, make_target_name, build_tool_version_name | |
| ) | |
| ) | |
| WriteMakeSrcFiles(gen_file, build_tool_version, ['../src', 'src'], True) | |
| gen_file.write( | |
| '\n' | |
| 'include $(BUILD_PACKAGE)\n\n' | |
| 'my_rs_unit_tests_path :=\n\n' | |
| 'endif\n' | |
| ) | |
| def ForwardMakeTargetsLocation(): | |
| """Returns the location of the file with all forward compatibility targets.""" | |
| return os.path.join(ThisScriptDir(), '..', 'RSTestForward', 'Targets.mk') | |
| def WriteForwardMakeTargets(gen_file): | |
| """Writes forward compatibility make target names to gen_file.""" | |
| gen_file.write('RSTESTFORWARD_TARGETS := \\\n') | |
| for build_tool_version_name in sorted(BUILD_TOOL_VERSIONS.values()): | |
| make_target_name = ForwardTargetName(build_tool_version_name) | |
| gen_file.write(' {} \\\n'.format(make_target_name)) | |
| def GenerateForward(): | |
| """Generates the necessary file for forward compatibility testing.""" | |
| for build_tool_version in sorted(BUILD_TOOL_VERSIONS.keys()): | |
| build_tool_version_name = BUILD_TOOL_VERSIONS[build_tool_version] | |
| if not os.path.exists(ForwardDirLocation(build_tool_version_name)): | |
| os.mkdir(ForwardDirLocation(build_tool_version_name)) | |
| os.mkdir(ForwardJavaSrcLocation(build_tool_version_name)) | |
| with open(ForwardMakefileLocation(build_tool_version_name), 'w') as gen_file: | |
| WriteForwardMakefile(gen_file, build_tool_version, build_tool_version_name) | |
| print ('Generated forward compatibility Makefile at {}' | |
| .format(ForwardMakefileLocation(build_tool_version_name))) | |
| with open(ForwardAndroidManifestLocation(build_tool_version_name), 'w') as gen_file: | |
| package = 'com.android.rs.testforward{}'.format(build_tool_version) | |
| WriteForwardAndroidManifest(gen_file, package) | |
| print ('Generated forward compatibility AndroidManifest.xml at {}' | |
| .format(ForwardAndroidManifestLocation(build_tool_version_name))) | |
| with open(ForwardJavaApiVersionLocation(build_tool_version_name), 'w') as gen_file: | |
| WriteForwardToolsVersion(gen_file, build_tool_version) | |
| print ('Generated forward compatibility RSForwardVersion.java at {}' | |
| .format(ForwardJavaApiVersionLocation(build_tool_version_name))) | |
| with open(ForwardMakeTargetsLocation(), 'w') as gen_file: | |
| WriteForwardMakeTargets(gen_file) | |
| print ('Generated forward compatibility targets at {}' | |
| .format(ForwardMakeTargetsLocation())) | |
| # ---------- RSTestBackward ---------- | |
| def BackwardJavaFileLocation(): | |
| """Returns the location of Java file for backward compatibility testing.""" | |
| return os.path.join(ThisScriptDir(), '..', 'RSTestBackward', 'src', 'com', | |
| 'android', 'rs', 'testbackward', 'RSTests.java') | |
| def Backward19JavaFileLocation(): | |
| """Returns the location of Java file for backward compatibility 19 testing.""" | |
| return os.path.join(ThisScriptDir(), '..', 'RSTestBackward19', 'src', 'com', | |
| 'android', 'rs', 'testbackward19', 'RSTests.java') | |
| def Backward19MakefileLocation(): | |
| """Returns the location of Makefile for backward compatibility 19 testing.""" | |
| return os.path.join(ThisScriptDir(), '..', 'RSTestBackward19', 'Android.mk') | |
| def WriteBackwardJavaFile(gen_file, package, max_api_version=None): | |
| """Writes the Java file for backward compatibility testing to gen_file. | |
| Java file determines unit tests for backward compatibility | |
| testing based on the unit test list at the top of this file.""" | |
| WriteJavaCopyright(gen_file) | |
| gen_file.write( | |
| 'package {};\n' | |
| '\n' | |
| 'import com.android.rs.unittest.*;\n' | |
| '\n' | |
| 'import java.util.ArrayList;\n' | |
| '\n' | |
| '/**\n' | |
| ' * This class is auto-generated by frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py.\n' | |
| ' * To change unit tests version, please run the Python script above.\n' | |
| ' */\n' | |
| 'public class RSTests {{\n' | |
| ' public static Iterable<Class<? extends UnitTest>> getTestClassesForCurrentAPIVersion() {{\n' | |
| ' int thisApiVersion = android.os.Build.VERSION.SDK_INT;\n' | |
| '\n' | |
| ' ArrayList<Class<? extends UnitTest>> validClasses = new ArrayList<>();'.format( | |
| package | |
| ) | |
| ) | |
| for version in sorted(UNIT_TEST_PLATFORM_VERSIONS.keys()): | |
| if max_api_version is None or version <= max_api_version: | |
| tests = sorted(UNIT_TEST_PLATFORM_VERSIONS[version]) | |
| gen_file.write( | |
| '\n\n if (thisApiVersion >= {}) {{\n'.format(version) | |
| ) | |
| for test in tests: | |
| gen_file.write( | |
| ' validClasses.add(UT_{}.class);\n'.format(test) | |
| ) | |
| gen_file.write(' }') | |
| gen_file.write('\n\n return validClasses;\n }\n}\n') | |
| def WriteBackward19Makefile(gen_file): | |
| """Writes the Makefile for backward compatibility 19 testing.""" | |
| WriteMakeCopyright(gen_file) | |
| gen_file.write( | |
| '# This file is auto-generated by frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py.\n' | |
| '# To change unit tests version, please run the Python script above.\n\n' | |
| 'LOCAL_PATH := $(call my-dir)\n' | |
| 'include $(CLEAR_VARS)\n\n' | |
| 'LOCAL_MODULE_TAGS := tests\n' | |
| 'LOCAL_STATIC_JAVA_LIBRARIES := android-support-test\n' | |
| 'LOCAL_COMPATIBILITY_SUITE := device-tests\n' | |
| 'LOCAL_RENDERSCRIPT_TARGET_API := 19\n' | |
| 'LOCAL_MIN_SDK_VERSION := 17\n' | |
| 'LOCAL_SDK_VERSION := current\n' | |
| 'LOCAL_PACKAGE_NAME := RSTestBackward19\n' | |
| 'my_rs_unit_tests_path := ../RSUnitTests/src/com/android/rs/unittest\n' | |
| ) | |
| WriteMakeSrcFiles(gen_file, 19) | |
| gen_file.write( | |
| '\n' | |
| 'include $(BUILD_PACKAGE)\n\n' | |
| 'my_rs_unit_tests_path :=\n\n' | |
| ) | |
| def GenerateBackward(): | |
| """Generates Java file for backward compatibility testing.""" | |
| with open(BackwardJavaFileLocation(), 'w') as gen_file: | |
| WriteBackwardJavaFile(gen_file, 'com.android.rs.testbackward') | |
| print ('Generated backward compatibility Java file at {}' | |
| .format(BackwardJavaFileLocation())) | |
| def GenerateBackward19(): | |
| """Generates files for backward compatibility testing for API 19.""" | |
| with open(Backward19JavaFileLocation(), 'w') as gen_file: | |
| WriteBackwardJavaFile(gen_file, 'com.android.rs.testbackward19', 19) | |
| print ('Generated backward compatibility (19) Java file at {}' | |
| .format(Backward19JavaFileLocation())) | |
| with open(Backward19MakefileLocation(), 'w') as gen_file: | |
| WriteBackward19Makefile(gen_file) | |
| print ('Generated backward compatibility (19) Makefile at {}' | |
| .format(Backward19MakefileLocation())) | |
| # ---------- Main ---------- | |
| def DisplayHelp(): | |
| """Prints help message.""" | |
| print >> sys.stderr, ('Usage: {} [forward] [backward] [backward19] [help|-h|--help]\n' | |
| .format(sys.argv[0])) | |
| print >> sys.stderr, ('[forward]: write forward compatibility Makefile to\n {}\n' | |
| .format(ForwardMakefileLocation())) | |
| print >> sys.stderr, ('[backward]: write backward compatibility Java file to\n {}\n' | |
| .format(BackwardJavaFileLocation())) | |
| print >> sys.stderr, ('[backward19]: write backward compatibility Java file (19) to\n {}\n' | |
| .format(Backward19JavaFileLocation())) | |
| print >> sys.stderr, ('[backward19]: write backward compatibility Makefile (19) to\n {}\n' | |
| .format(Backward19MakefileLocation())) | |
| print >> sys.stderr, ('[supportlib]: generate support lib unit tests to\n {}\n' | |
| .format(SupportLibGenTestDir())) | |
| print >> sys.stderr, ('[supportlib19]: generate support lib Makefile (19) to\n {}\n' | |
| .format(SupportLib19MakefileLocation())) | |
| print >> sys.stderr, 'if no options are chosen, then all files are generated' | |
| def main(): | |
| """Parses sys.argv and does stuff.""" | |
| display_help = False | |
| error = False | |
| actions = [] | |
| for arg in sys.argv[1:]: | |
| if arg in ('help', '-h', '--help'): | |
| display_help = True | |
| elif arg == 'backward': | |
| actions.append(GenerateBackward) | |
| elif arg == 'backward19': | |
| actions.append(GenerateBackward19) | |
| elif arg == 'forward': | |
| actions.append(GenerateForward) | |
| elif arg == 'supportlib': | |
| actions.append(GenerateSupportLibUnitTests) | |
| elif arg == 'supportlib19': | |
| actions.append(GenerateSupportLib19) | |
| else: | |
| print >> sys.stderr, 'unrecognized arg: {}'.format(arg) | |
| error = True | |
| if display_help or error: | |
| DisplayHelp() | |
| elif actions: | |
| for action in actions: | |
| action() | |
| else: | |
| # No args - do default action. | |
| GenerateBackward() | |
| GenerateBackward19() | |
| GenerateForward() | |
| GenerateSupportLibUnitTests() | |
| GenerateSupportLib19() | |
| if __name__ == '__main__': | |
| main() |