diff options
Diffstat (limited to 'build/apex/art_apex_test.py')
-rwxr-xr-x | build/apex/art_apex_test.py | 332 |
1 files changed, 327 insertions, 5 deletions
diff --git a/build/apex/art_apex_test.py b/build/apex/art_apex_test.py index 3bcf7c68de..86acfa6edd 100755 --- a/build/apex/art_apex_test.py +++ b/build/apex/art_apex_test.py @@ -26,6 +26,14 @@ import zipfile logging.basicConfig(format='%(message)s') +# Architectures supported by APEX packages. +archs = ["arm", "arm64", "x86", "x86_64"] +# Directory containing ART tests within a Runtime APEX (if the package includes +# any). ART test executables are installed in `bin/art/<arch>`. Segregating +# tests by architecture is useful on devices supporting more than one +# architecture, as it permits testing all of them using a single Runtime APEX +# package. +art_test_dir = 'bin/test' class FSObject: def __init__(self, name, is_dir, is_exec, is_symlink, size): @@ -270,6 +278,28 @@ class Checker: self.fail('%s is not a symlink', path) self._expected_file_globs.add(path) + def check_art_test_executable(self, filename): + # This is a simplistic implementation, as we declare victory as soon as the + # test binary is found for one of the supported (not built) architectures. + # Ideally we would propagate the built architectures from the build system + # to this script and require test binaries for all of them to be present. + # Note that this behavior is not specific to this method: there are other + # places in this script where we rely on this simplified strategy. + # + # TODO: Implement the suggestion above (here and in other places in this + # script). + test_found = False + for arch in archs: + test_path = '%s/%s/%s' % (art_test_dir, arch, filename) + test_is_file, _ = self.is_file(test_path) + if test_is_file: + test_found = True + self._expected_file_globs.add(test_path) + if not self._provider.get(test_path).is_exec: + self.fail('%s is not executable', test_path) + if not test_found: + self.fail('ART test binary missing: %s', filename) + def check_single_library(self, filename): lib_path = 'lib/%s' % filename lib64_path = 'lib64/%s' % filename @@ -288,6 +318,10 @@ class Checker: def ignore_path(self, path_glob): self._expected_file_globs.add(path_glob) + def check_optional_art_test_executable(self, filename): + for arch in archs: + self.ignore_path('%s/%s/%s' % (art_test_dir, arch, filename)) + def check_no_superfluous_files(self, dir_path): paths = [] for name in sorted(self._provider.read_dir(dir_path).keys()): @@ -616,6 +650,267 @@ class DebugTargetChecker: self._checker.check_prefer64_library('libprocinfo') +class TestingTargetChecker: + def __init__(self, checker): + self._checker = checker + + def __str__(self): + return 'Testing (Target) Checker' + + def run(self): + # Check cmdline tests. + self._checker.check_optional_art_test_executable('cmdline_parser_test') + + # Check compiler tests. + self._checker.check_art_test_executable('atomic_dex_ref_map_test') + self._checker.check_art_test_executable('bounds_check_elimination_test') + self._checker.check_art_test_executable('codegen_test') + self._checker.check_art_test_executable('compiled_method_storage_test') + self._checker.check_art_test_executable('data_type_test') + self._checker.check_art_test_executable('dedupe_set_test') + self._checker.check_art_test_executable('dominator_test') + self._checker.check_art_test_executable('dwarf_test') + self._checker.check_art_test_executable('exception_test') + self._checker.check_art_test_executable('find_loops_test') + self._checker.check_art_test_executable('graph_checker_test') + self._checker.check_art_test_executable('graph_test') + self._checker.check_art_test_executable('gvn_test') + self._checker.check_art_test_executable('induction_var_analysis_test') + self._checker.check_art_test_executable('induction_var_range_test') + self._checker.check_art_test_executable('jni_cfi_test') + self._checker.check_art_test_executable('jni_compiler_test') + self._checker.check_art_test_executable('licm_test') + self._checker.check_art_test_executable('linker_patch_test') + self._checker.check_art_test_executable('live_interval_test') + self._checker.check_art_test_executable('load_store_analysis_test') + self._checker.check_art_test_executable('loop_optimization_test') + self._checker.check_art_test_executable('nodes_test') + self._checker.check_art_test_executable('nodes_vector_test') + self._checker.check_art_test_executable('optimizing_cfi_test') + self._checker.check_art_test_executable('output_stream_test') + self._checker.check_art_test_executable('parallel_move_test') + self._checker.check_art_test_executable('pretty_printer_test') + self._checker.check_art_test_executable('reference_type_propagation_test') + self._checker.check_art_test_executable('scheduler_test') + self._checker.check_art_test_executable('select_generator_test') + self._checker.check_art_test_executable('side_effects_test') + self._checker.check_art_test_executable('src_map_elem_test') + self._checker.check_art_test_executable('ssa_liveness_analysis_test') + self._checker.check_art_test_executable('ssa_test') + self._checker.check_art_test_executable('stack_map_test') + self._checker.check_art_test_executable('superblock_cloner_test') + self._checker.check_art_test_executable('suspend_check_test') + self._checker.check_art_test_executable('swap_space_test') + # These tests depend on a specific code generator and are conditionally included. + self._checker.check_optional_art_test_executable('constant_folding_test') + self._checker.check_optional_art_test_executable('dead_code_elimination_test') + self._checker.check_optional_art_test_executable('linearize_test') + self._checker.check_optional_art_test_executable('live_ranges_test') + self._checker.check_optional_art_test_executable('liveness_test') + self._checker.check_optional_art_test_executable('managed_register_arm64_test') + self._checker.check_optional_art_test_executable('managed_register_arm_test') + self._checker.check_optional_art_test_executable('managed_register_mips64_test') + self._checker.check_optional_art_test_executable('managed_register_x86_64_test') + self._checker.check_optional_art_test_executable('managed_register_x86_test') + self._checker.check_optional_art_test_executable('register_allocator_test') + + # Check dex2oat tests. + self._checker.check_art_test_executable('compiler_driver_test') + self._checker.check_art_test_executable('dex2oat_image_test') + self._checker.check_art_test_executable('dex2oat_test') + self._checker.check_art_test_executable('dex_to_dex_decompiler_test') + self._checker.check_art_test_executable('elf_writer_test') + self._checker.check_art_test_executable('image_test') + self._checker.check_art_test_executable('image_write_read_test') + self._checker.check_art_test_executable('index_bss_mapping_encoder_test') + self._checker.check_art_test_executable('multi_oat_relative_patcher_test') + self._checker.check_art_test_executable('oat_writer_test') + self._checker.check_art_test_executable('verifier_deps_test') + # These tests depend on a specific code generator and are conditionally included. + self._checker.check_optional_art_test_executable('relative_patcher_arm64_test') + self._checker.check_optional_art_test_executable('relative_patcher_mips32r6_test') + self._checker.check_optional_art_test_executable('relative_patcher_mips64_test') + self._checker.check_optional_art_test_executable('relative_patcher_mips_test') + self._checker.check_optional_art_test_executable('relative_patcher_thumb2_test') + self._checker.check_optional_art_test_executable('relative_patcher_x86_64_test') + self._checker.check_optional_art_test_executable('relative_patcher_x86_test') + + # Check dexanalyze tests. + self._checker.check_optional_art_test_executable('dexanalyze_test') + + # Check dexdiag tests. + self._checker.check_optional_art_test_executable('dexdiag_test') + + # Check dexdump tests. + self._checker.check_art_test_executable('dexdump_test') + + # Check dexlayout tests. + self._checker.check_optional_art_test_executable('dexlayout_test') + + # Check dexlist tests. + self._checker.check_art_test_executable('dexlist_test') + + # Check dexoptanalyzer tests. + self._checker.check_art_test_executable('dexoptanalyzer_test') + + # Check imgdiag tests. + self._checker.check_art_test_executable('imgdiag_test') + + # Check libartbase tests. + self._checker.check_art_test_executable('arena_allocator_test') + self._checker.check_art_test_executable('bit_field_test') + self._checker.check_art_test_executable('bit_memory_region_test') + self._checker.check_art_test_executable('bit_string_test') + self._checker.check_art_test_executable('bit_struct_test') + self._checker.check_art_test_executable('bit_table_test') + self._checker.check_art_test_executable('bit_utils_test') + self._checker.check_art_test_executable('bit_vector_test') + self._checker.check_art_test_executable('fd_file_test') + self._checker.check_art_test_executable('file_utils_test') + self._checker.check_art_test_executable('hash_set_test') + self._checker.check_art_test_executable('hex_dump_test') + self._checker.check_art_test_executable('histogram_test') + self._checker.check_art_test_executable('indenter_test') + self._checker.check_art_test_executable('instruction_set_test') + self._checker.check_art_test_executable('intrusive_forward_list_test') + self._checker.check_art_test_executable('leb128_test') + self._checker.check_art_test_executable('logging_test') + self._checker.check_art_test_executable('mem_map_test') + self._checker.check_art_test_executable('membarrier_test') + self._checker.check_art_test_executable('memfd_test') + self._checker.check_art_test_executable('memory_region_test') + self._checker.check_art_test_executable('memory_type_table_test') + self._checker.check_art_test_executable('safe_copy_test') + self._checker.check_art_test_executable('scoped_flock_test') + self._checker.check_art_test_executable('time_utils_test') + self._checker.check_art_test_executable('transform_array_ref_test') + self._checker.check_art_test_executable('transform_iterator_test') + self._checker.check_art_test_executable('utils_test') + self._checker.check_art_test_executable('variant_map_test') + self._checker.check_art_test_executable('zip_archive_test') + + # Check libartpalette tests. + self._checker.check_art_test_executable('palette_test') + + # Check libdexfile tests. + self._checker.check_art_test_executable('art_dex_file_loader_test') + self._checker.check_art_test_executable('art_libdexfile_support_tests') + self._checker.check_art_test_executable('class_accessor_test') + self._checker.check_art_test_executable('code_item_accessors_test') + self._checker.check_art_test_executable('compact_dex_file_test') + self._checker.check_art_test_executable('compact_offset_table_test') + self._checker.check_art_test_executable('descriptors_names_test') + self._checker.check_art_test_executable('dex_file_loader_test') + self._checker.check_art_test_executable('dex_file_verifier_test') + self._checker.check_art_test_executable('dex_instruction_test') + self._checker.check_art_test_executable('primitive_test') + self._checker.check_art_test_executable('string_reference_test') + self._checker.check_art_test_executable('test_dex_file_builder_test') + self._checker.check_art_test_executable('type_lookup_table_test') + self._checker.check_art_test_executable('utf_test') + + # Check libprofile tests. + self._checker.check_optional_art_test_executable('profile_boot_info_test') + self._checker.check_optional_art_test_executable('profile_compilation_info_test') + + # Check oatdump tests. + self._checker.check_art_test_executable('oatdump_app_test') + self._checker.check_art_test_executable('oatdump_image_test') + self._checker.check_art_test_executable('oatdump_test') + + # Check profman tests. + self._checker.check_art_test_executable('profile_assistant_test') + + # Check runtime compiler tests. + self._checker.check_art_test_executable('module_exclusion_test') + self._checker.check_art_test_executable('reflection_test') + + # Check runtime tests. + self._checker.check_art_test_executable('arch_test') + self._checker.check_art_test_executable('barrier_test') + self._checker.check_art_test_executable('card_table_test') + self._checker.check_art_test_executable('cha_test') + self._checker.check_art_test_executable('class_linker_test') + self._checker.check_art_test_executable('class_loader_context_test') + self._checker.check_art_test_executable('class_table_test') + self._checker.check_art_test_executable('compiler_filter_test') + self._checker.check_art_test_executable('dex_cache_test') + self._checker.check_art_test_executable('dlmalloc_space_random_test') + self._checker.check_art_test_executable('dlmalloc_space_static_test') + self._checker.check_art_test_executable('entrypoints_order_test') + self._checker.check_art_test_executable('exec_utils_test') + self._checker.check_art_test_executable('gtest_test') + self._checker.check_art_test_executable('handle_scope_test') + self._checker.check_art_test_executable('heap_test') + self._checker.check_art_test_executable('heap_verification_test') + self._checker.check_art_test_executable('hidden_api_test') + self._checker.check_art_test_executable('image_space_test') + self._checker.check_art_test_executable('immune_spaces_test') + self._checker.check_art_test_executable('imtable_test') + self._checker.check_art_test_executable('indirect_reference_table_test') + self._checker.check_art_test_executable('instruction_set_features_arm64_test') + self._checker.check_art_test_executable('instruction_set_features_arm_test') + self._checker.check_art_test_executable('instruction_set_features_mips64_test') + self._checker.check_art_test_executable('instruction_set_features_mips_test') + self._checker.check_art_test_executable('instruction_set_features_test') + self._checker.check_art_test_executable('instruction_set_features_x86_64_test') + self._checker.check_art_test_executable('instruction_set_features_x86_test') + self._checker.check_art_test_executable('instrumentation_test') + self._checker.check_art_test_executable('intern_table_test') + self._checker.check_art_test_executable('java_vm_ext_test') + self._checker.check_art_test_executable('jdwp_options_test') + self._checker.check_art_test_executable('jit_memory_region_test') + self._checker.check_art_test_executable('jni_internal_test') + self._checker.check_art_test_executable('large_object_space_test') + self._checker.check_art_test_executable('math_entrypoints_test') + self._checker.check_art_test_executable('memcmp16_test') + self._checker.check_art_test_executable('method_handles_test') + self._checker.check_art_test_executable('method_type_test') + self._checker.check_art_test_executable('method_verifier_test') + self._checker.check_art_test_executable('mod_union_table_test') + self._checker.check_art_test_executable('monitor_pool_test') + self._checker.check_art_test_executable('monitor_test') + self._checker.check_art_test_executable('mutex_test') + self._checker.check_art_test_executable('oat_file_assistant_test') + self._checker.check_art_test_executable('oat_file_test') + self._checker.check_art_test_executable('object_test') + self._checker.check_art_test_executable('parsed_options_test') + self._checker.check_art_test_executable('prebuilt_tools_test') + self._checker.check_art_test_executable('profiling_info_test') + self._checker.check_art_test_executable('proxy_test') + self._checker.check_art_test_executable('quick_trampoline_entrypoints_test') + self._checker.check_art_test_executable('reference_queue_test') + self._checker.check_art_test_executable('reference_table_test') + self._checker.check_art_test_executable('reg_type_test') + self._checker.check_art_test_executable('rosalloc_space_random_test') + self._checker.check_art_test_executable('rosalloc_space_static_test') + self._checker.check_art_test_executable('runtime_callbacks_test') + self._checker.check_art_test_executable('runtime_test') + self._checker.check_art_test_executable('safe_math_test') + self._checker.check_art_test_executable('space_bitmap_test') + self._checker.check_art_test_executable('space_create_test') + self._checker.check_art_test_executable('stub_test') + self._checker.check_art_test_executable('subtype_check_info_test') + self._checker.check_art_test_executable('subtype_check_test') + self._checker.check_art_test_executable('system_weak_test') + self._checker.check_art_test_executable('task_processor_test') + self._checker.check_art_test_executable('thread_pool_test') + self._checker.check_art_test_executable('timing_logger_test') + self._checker.check_art_test_executable('transaction_test') + self._checker.check_art_test_executable('two_runtimes_test') + self._checker.check_art_test_executable('unstarted_runtime_test') + self._checker.check_art_test_executable('var_handle_test') + self._checker.check_art_test_executable('vdex_file_test') + + # Check sigchainlib tests. + self._checker.check_art_test_executable('sigchain_test') + + # Check ART test (internal) libraries. + self._checker.check_native_library('libart-gtest') + self._checker.check_native_library('libartd-disassembler') + self._checker.check_native_library('libartd-simulator-container') + + class NoSuperfluousBinariesChecker: def __init__(self, checker): self._checker = checker @@ -642,6 +937,18 @@ class NoSuperfluousLibrariesChecker: self._checker.check_no_superfluous_files('lib64/bionic') +class NoSuperfluousArtTestsChecker: + def __init__(self, checker): + self._checker = checker + + def __str__(self): + return 'No superfluous ART tests checker' + + def run(self): + for arch in archs: + self._checker.check_no_superfluous_files('%s/%s' % (art_test_dir, arch)) + + class List: def __init__(self, provider, print_size): self._provider = provider @@ -731,15 +1038,24 @@ def art_apex_test_main(test_args): if test_args.tree and test_args.debug: logging.error("Both of --tree and --debug set") return 1 + if test_args.tree and test_args.testing: + logging.error("Both of --tree and --testing set") + return 1 if test_args.list and test_args.debug: logging.error("Both of --list and --debug set") return 1 + if test_args.list and test_args.testing: + logging.error("Both of --list and --testing set") + return 1 if test_args.list and test_args.tree: logging.error("Both of --list and --tree set") return 1 if test_args.size and not (test_args.list or test_args.tree): logging.error("--size set but neither --list nor --tree set") return 1 + if test_args.host and test_args.testing: + logging.error("Both of --host and --testing set") + return 1 if not test_args.tmpdir: logging.error("Need a tmpdir.") return 1 @@ -800,13 +1116,16 @@ def art_apex_test_main(test_args): checkers.append(ReleaseHostChecker(base_checker)) else: checkers.append(ReleaseTargetChecker(base_checker)) - if test_args.debug: + if test_args.debug or test_args.testing: checkers.append(DebugChecker(base_checker)) - if test_args.debug and not test_args.host: - checkers.append(DebugTargetChecker(base_checker)) + if not test_args.host: + checkers.append(DebugTargetChecker(base_checker)) + if test_args.testing: + checkers.append(TestingTargetChecker(base_checker)) # These checkers must be last. checkers.append(NoSuperfluousBinariesChecker(base_checker)) + checkers.append(NoSuperfluousArtTestsChecker(base_checker)) if not test_args.host: # We only care about superfluous libraries on target, where their absence # can be vital to ensure they get picked up from the right package. @@ -851,8 +1170,9 @@ def art_apex_test_default(test_parser): # TODO: Add host support configs = [ - {'name': 'com.android.runtime.release', 'debug': False, 'host': False}, - {'name': 'com.android.runtime.debug', 'debug': True, 'host': False}, + {'name': 'com.android.runtime.release', 'debug': False, 'testing': False, 'host': False}, + {'name': 'com.android.runtime.debug', 'debug': True, 'testing': False, 'host': False}, + {'name': 'com.android.runtime.testing', 'debug': False, 'testing': True, 'host': False}, ] for config in configs: @@ -864,6 +1184,7 @@ def art_apex_test_default(test_parser): logging.error("Cannot find APEX %s. Please build it first.", test_args.apex) continue test_args.debug = config['debug'] + test_args.testing = config['testing'] test_args.host = config['host'] failed = art_apex_test_main(test_args) != 0 @@ -881,6 +1202,7 @@ if __name__ == "__main__": parser.add_argument('--flattened', help='Check as flattened (target) apex', action='store_true') parser.add_argument('--debug', help='Check as debug apex', action='store_true') + parser.add_argument('--testing', help='Check as testing apex', action='store_true') parser.add_argument('--list', help='List all files', action='store_true') parser.add_argument('--tree', help='Print directory tree', action='store_true') |