#!/usr/bin/env python3

# Copyright (C) 2019 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.
#

import argparse
import fnmatch
import logging
import os
import os.path
import subprocess
import sys
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/art'

class FSObject:
  def __init__(self, name, is_dir, is_exec, is_symlink, size):
    self.name = name
    self.is_dir = is_dir
    self.is_exec = is_exec
    self.is_symlink = is_symlink
    self.size = size

  def __str__(self):
    return '%s(dir=%r,exec=%r,symlink=%r,size=%d)' \
             % (self.name, self.is_dir, self.is_exec, self.is_symlink, self.size)


class TargetApexProvider:
  def __init__(self, apex, tmpdir, debugfs):
    self._tmpdir = tmpdir
    self._debugfs = debugfs
    self._folder_cache = {}
    self._payload = os.path.join(self._tmpdir, 'apex_payload.img')
    # Extract payload to tmpdir.
    apex_zip = zipfile.ZipFile(apex)
    apex_zip.extract('apex_payload.img', tmpdir)

  def __del__(self):
    # Delete temps.
    if os.path.exists(self._payload):
      os.remove(self._payload)

  def get(self, path):
    apex_dir, name = os.path.split(path)
    if not apex_dir:
      apex_dir = '.'
    apex_map = self.read_dir(apex_dir)
    return apex_map[name] if name in apex_map else None

  def read_dir(self, apex_dir):
    if apex_dir in self._folder_cache:
      return self._folder_cache[apex_dir]
    # Cannot use check_output as it will annoy with stderr.
    process = subprocess.Popen([self._debugfs, '-R', 'ls -l -p %s' % apex_dir, self._payload],
                               stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                               universal_newlines=True)
    stdout, _ = process.communicate()
    res = str(stdout)
    apex_map = {}
    # Debugfs output looks like this:
    #   debugfs 1.44.4 (18-Aug-2018)
    #   /12/040755/0/2000/.//
    #   /2/040755/1000/1000/..//
    #   /13/100755/0/2000/dalvikvm32/28456/
    #   /14/100755/0/2000/dexoptanalyzer/20396/
    #   /15/100755/0/2000/linker/1152724/
    #   /16/100755/0/2000/dex2oat/563508/
    #   /17/100755/0/2000/linker64/1605424/
    #   /18/100755/0/2000/profman/85304/
    #   /19/100755/0/2000/dalvikvm64/28576/
    #    |     |   |   |       |        |
    #    |     |   |   #- gid  #- name  #- size
    #    |     |   #- uid
    #    |     #- type and permission bits
    #    #- inode nr (?)
    #
    # Note: could break just on '/' to avoid names with newlines.
    for line in res.split("\n"):
      if not line:
        continue
      comps = line.split('/')
      if len(comps) != 8:
        logging.warning('Could not break and parse line \'%s\'', line)
        continue
      bits = comps[2]
      name = comps[5]
      size_str = comps[6]
      # Use a negative value as an indicator of undefined/unknown size.
      size = int(size_str) if size_str != '' else -1
      if len(bits) != 6:
        logging.warning('Dont understand bits \'%s\'', bits)
        continue
      is_dir = bits[1] == '4'

      def is_exec_bit(ch):
        return int(ch) & 1 == 1

      is_exec = is_exec_bit(bits[3]) and is_exec_bit(bits[4]) and is_exec_bit(bits[5])
      is_symlink = bits[1] == '2'
      apex_map[name] = FSObject(name, is_dir, is_exec, is_symlink, size)
    self._folder_cache[apex_dir] = apex_map
    return apex_map


class TargetFlattenedApexProvider:
  def __init__(self, apex):
    self._folder_cache = {}
    self._apex = apex

  def get(self, path):
    apex_dir, name = os.path.split(path)
    if not apex_dir:
      apex_dir = '.'
    apex_map = self.read_dir(apex_dir)
    return apex_map[name] if name in apex_map else None

  def read_dir(self, apex_dir):
    if apex_dir in self._folder_cache:
      return self._folder_cache[apex_dir]
    apex_map = {}
    dirname = os.path.join(self._apex, apex_dir)
    if os.path.exists(dirname):
      for basename in os.listdir(dirname):
        filepath = os.path.join(dirname, basename)
        is_dir = os.path.isdir(filepath)
        is_exec = os.access(filepath, os.X_OK)
        is_symlink = os.path.islink(filepath)
        size = os.path.getsize(filepath)
        apex_map[basename] = FSObject(basename, is_dir, is_exec, is_symlink, size)
    self._folder_cache[apex_dir] = apex_map
    return apex_map


class HostApexProvider:
  def __init__(self, apex, tmpdir):
    self._tmpdir = tmpdir
    self._folder_cache = {}
    self._payload = os.path.join(self._tmpdir, 'apex_payload.zip')
    # Extract payload to tmpdir.
    apex_zip = zipfile.ZipFile(apex)
    apex_zip.extract('apex_payload.zip', tmpdir)

  def __del__(self):
    # Delete temps.
    if os.path.exists(self._payload):
      os.remove(self._payload)

  def get(self, path):
    apex_dir, name = os.path.split(path)
    if not apex_dir:
      apex_dir = ''
    apex_map = self.read_dir(apex_dir)
    return apex_map[name] if name in apex_map else None

  def read_dir(self, apex_dir):
    if apex_dir in self._folder_cache:
      return self._folder_cache[apex_dir]
    if not self._folder_cache:
      self.parse_zip()
    if apex_dir in self._folder_cache:
      return self._folder_cache[apex_dir]
    return {}

  def parse_zip(self):
    apex_zip = zipfile.ZipFile(self._payload)
    infos = apex_zip.infolist()
    for zipinfo in infos:
      path = zipinfo.filename

      # Assume no empty file is stored.
      assert path

      def get_octal(val, index):
        return (val >> (index * 3)) & 0x7

      def bits_is_exec(val):
        # TODO: Enforce group/other, too?
        return get_octal(val, 2) & 1 == 1

      is_zipinfo = True
      while path:
        apex_dir, base = os.path.split(path)
        # TODO: If directories are stored, base will be empty.

        if apex_dir not in self._folder_cache:
          self._folder_cache[apex_dir] = {}
        dir_map = self._folder_cache[apex_dir]
        if base not in dir_map:
          if is_zipinfo:
            bits = (zipinfo.external_attr >> 16) & 0xFFFF
            is_dir = get_octal(bits, 4) == 4
            is_symlink = get_octal(bits, 4) == 2
            is_exec = bits_is_exec(bits)
            size = zipinfo.file_size
          else:
            is_exec = False  # Seems we can't get this easily?
            is_symlink = False
            is_dir = True
            # Use a negative value as an indicator of undefined/unknown size.
            size = -1
          dir_map[base] = FSObject(base, is_dir, is_exec, is_symlink, size)
        is_zipinfo = False
        path = apex_dir


# DO NOT USE DIRECTLY! This is an "abstract" base class.
class Checker:
  def __init__(self, provider):
    self._provider = provider
    self._errors = 0
    self._expected_file_globs = set()

  def fail(self, msg, *fail_args):
    self._errors += 1
    logging.error(msg, *fail_args)

  def error_count(self):
    return self._errors

  def reset_errors(self):
    self._errors = 0

  def is_file(self, path):
    fs_object = self._provider.get(path)
    if fs_object is None:
      return False, 'Could not find %s'
    if fs_object.is_dir:
      return False, '%s is a directory'
    return True, ''

  def check_file(self, path):
    ok, msg = self.is_file(path)
    if not ok:
      self.fail(msg, path)
    self._expected_file_globs.add(path)
    return ok

  def check_executable(self, filename):
    path = 'bin/%s' % filename
    if not self.check_file(path):
      return
    if not self._provider.get(path).is_exec:
      self.fail('%s is not executable', path)

  def check_executable_symlink(self, filename):
    path = 'bin/%s' % filename
    fs_object = self._provider.get(path)
    if fs_object is None:
      self.fail('Could not find %s', path)
      return
    if fs_object.is_dir:
      self.fail('%s is a directory', path)
      return
    if not fs_object.is_symlink:
      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
    lib_is_file, _ = self.is_file(lib_path)
    if lib_is_file:
      self._expected_file_globs.add(lib_path)
    lib64_is_file, _ = self.is_file(lib64_path)
    if lib64_is_file:
      self._expected_file_globs.add(lib64_path)
    if not lib_is_file and not lib64_is_file:
      self.fail('Library missing: %s', filename)

  def check_java_library(self, basename):
    return self.check_file('javalib/%s.jar' % basename)

  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()):
      if name not in ('.', '..'):
        paths.append(os.path.join(dir_path, name))
    expected_paths = set()
    dir_prefix = dir_path + '/'
    for path_glob in self._expected_file_globs:
      expected_paths |= set(fnmatch.filter(paths, path_glob))
      # If there are globs in subdirectories of dir_path we want to match their
      # path segments at this directory level.
      if path_glob.startswith(dir_prefix):
        subpath = path_glob[len(dir_prefix):]
        subpath_first_segment, _, _ = subpath.partition('/')
        expected_paths |= set(fnmatch.filter(paths, dir_prefix + subpath_first_segment))
    for unexpected_path in set(paths) - expected_paths:
      self.fail('Unexpected file \'%s\'', unexpected_path)

  # Just here for docs purposes, even if it isn't good Python style.

  def check_symlinked_multilib_executable(self, filename):
    """Check bin/filename32, and/or bin/filename64, with symlink bin/filename."""
    raise NotImplementedError

  def check_multilib_executable(self, filename):
    """Check bin/filename for 32 bit, and/or bin/filename64."""
    raise NotImplementedError

  def check_native_library(self, basename):
    """Check lib/basename.so, and/or lib64/basename.so."""
    raise NotImplementedError

  def check_optional_native_library(self, basename_glob):
    """Allow lib/basename.so and/or lib64/basename.so to exist."""
    raise NotImplementedError

  def check_prefer64_library(self, basename):
    """Check lib64/basename.so, or lib/basename.so on 32 bit only."""
    raise NotImplementedError


class Arch32Checker(Checker):
  def check_symlinked_multilib_executable(self, filename):
    self.check_executable('%s32' % filename)
    self.check_executable_symlink(filename)

  def check_multilib_executable(self, filename):
    self.check_executable(filename)

  def check_native_library(self, basename):
    # TODO: Use $TARGET_ARCH (e.g. check whether it is "arm" or "arm64") to improve
    # the precision of this test?
    self.check_file('lib/%s.so' % basename)

  def check_optional_native_library(self, basename_glob):
    self.ignore_path('lib/%s.so' % basename_glob)

  def check_prefer64_library(self, basename):
    self.check_native_library(basename)


class Arch64Checker(Checker):
  def check_symlinked_multilib_executable(self, filename):
    self.check_executable('%s64' % filename)
    self.check_executable_symlink(filename)

  def check_multilib_executable(self, filename):
    self.check_executable('%s64' % filename)

  def check_native_library(self, basename):
    # TODO: Use $TARGET_ARCH (e.g. check whether it is "arm" or "arm64") to improve
    # the precision of this test?
    self.check_file('lib64/%s.so' % basename)

  def check_optional_native_library(self, basename_glob):
    self.ignore_path('lib64/%s.so' % basename_glob)

  def check_prefer64_library(self, basename):
    self.check_native_library(basename)


class MultilibChecker(Checker):
  def check_symlinked_multilib_executable(self, filename):
    self.check_executable('%s32' % filename)
    self.check_executable('%s64' % filename)
    self.check_executable_symlink(filename)

  def check_multilib_executable(self, filename):
    self.check_executable('%s64' % filename)
    self.check_executable(filename)

  def check_native_library(self, basename):
    # TODO: Use $TARGET_ARCH (e.g. check whether it is "arm" or "arm64") to improve
    # the precision of this test?
    self.check_file('lib/%s.so' % basename)
    self.check_file('lib64/%s.so' % basename)

  def check_optional_native_library(self, basename_glob):
    self.ignore_path('lib/%s.so' % basename_glob)
    self.ignore_path('lib64/%s.so' % basename_glob)

  def check_prefer64_library(self, basename):
    self.check_file('lib64/%s.so' % basename)


class ReleaseChecker:
  def __init__(self, checker):
    self._checker = checker

  def __str__(self):
    return 'Release Checker'

  def run(self):
    # Check the APEX manifest.
    self._checker.check_file('apex_manifest.json')

    # Check binaries for ART.
    self._checker.check_executable('dex2oat')
    self._checker.check_executable('dexdump')
    self._checker.check_executable('dexlist')
    self._checker.check_executable('dexoptanalyzer')
    self._checker.check_executable('profman')
    self._checker.check_symlinked_multilib_executable('dalvikvm')

    # Check exported libraries for ART.
    self._checker.check_native_library('libdexfile_external')
    self._checker.check_native_library('libnativebridge')
    self._checker.check_native_library('libnativehelper')
    self._checker.check_native_library('libnativeloader')

    # Check internal libraries for ART.
    self._checker.check_native_library('libadbconnection')
    self._checker.check_native_library('libart')
    self._checker.check_native_library('libart-compiler')
    self._checker.check_native_library('libart-dexlayout')
    self._checker.check_native_library('libartbase')
    self._checker.check_native_library('libartpalette')
    self._checker.check_native_library('libdexfile')
    self._checker.check_native_library('libdexfile_support')
    self._checker.check_native_library('libopenjdkjvm')
    self._checker.check_native_library('libopenjdkjvmti')
    self._checker.check_native_library('libprofile')
    self._checker.check_native_library('libsigchain')

    # Check java libraries for Managed Core Library.
    self._checker.check_java_library('apache-xml')
    self._checker.check_java_library('bouncycastle')
    self._checker.check_java_library('core-icu4j')
    self._checker.check_java_library('core-libart')
    self._checker.check_java_library('core-oj')
    self._checker.check_java_library('okhttp')

    # Check internal native libraries for Managed Core Library.
    self._checker.check_native_library('libjavacore')
    self._checker.check_native_library('libopenjdk')

    # Check internal native library dependencies.
    #
    # Any internal dependency not listed here will cause a failure in
    # NoSuperfluousLibrariesChecker. Internal dependencies are generally just
    # implementation details, but in the release package we want to track them
    # because a) they add to the package size and the RAM usage (in particular
    # if the library is also present in /system or another APEX and hence might
    # get loaded twice through linker namespace separation), and b) we need to
    # catch invalid dependencies on /system or other APEXes that should go
    # through an exported library with stubs (b/128708192 tracks implementing a
    # better approach for that).
    self._checker.check_native_library('libbacktrace')
    self._checker.check_native_library('libbase')
    self._checker.check_native_library('libc++')
    self._checker.check_native_library('libdt_fd_forward')
    self._checker.check_native_library('libdt_socket')
    self._checker.check_native_library('libjdwp')
    self._checker.check_native_library('liblzma')
    self._checker.check_native_library('libnpt')
    self._checker.check_native_library('libunwindstack')
    self._checker.check_native_library('libziparchive')
    self._checker.check_optional_native_library('libvixl')  # Only on ARM/ARM64

    # Allow extra dependencies that appear in ASAN builds.
    self._checker.check_optional_native_library('libclang_rt.asan*')
    self._checker.check_optional_native_library('libclang_rt.hwasan*')
    self._checker.check_optional_native_library('libclang_rt.ubsan*')


class ReleaseTargetChecker:
  def __init__(self, checker):
    self._checker = checker

  def __str__(self):
    return 'Release (Target) Checker'

  def run(self):
    # Check the APEX package scripts.
    self._checker.check_executable('art_postinstall_hook')
    self._checker.check_executable('art_preinstall_hook')
    self._checker.check_executable('art_preinstall_hook_boot')
    self._checker.check_executable('art_preinstall_hook_system_server')
    self._checker.check_executable('art_prepostinstall_utils')

    # Check binaries for ART.
    self._checker.check_executable('oatdump')

    # Check internal libraries for ART.
    self._checker.check_prefer64_library('libart-disassembler')

    # Check binaries for Bionic.
    self._checker.check_multilib_executable('linker')
    self._checker.check_multilib_executable('linker_asan')

    # Check libraries for Bionic.
    self._checker.check_native_library('bionic/libc')
    self._checker.check_native_library('bionic/libdl')
    self._checker.check_native_library('bionic/libm')
    # ... and its internal dependencies
    self._checker.check_native_library('libc_malloc_hooks')
    self._checker.check_native_library('libc_malloc_debug')

    # Check exported native libraries for Managed Core Library.
    self._checker.check_native_library('libandroidicu')
    self._checker.check_native_library('libandroidio')

    # Check internal native library dependencies.
    self._checker.check_native_library('libcrypto')
    self._checker.check_native_library('libexpat')
    self._checker.check_native_library('libicui18n')
    self._checker.check_native_library('libicuuc')
    self._checker.check_native_library('libpac')
    self._checker.check_native_library('libz')

    # Guest architecture proxy libraries currently end up in these
    # subdirectories in x86 builds with native bridge.
    # TODO(b/131155689): These are unused - fix the build rules to avoid
    # creating them.
    self._checker.ignore_path('lib/arm')
    self._checker.ignore_path('lib64/arm64')


class ReleaseHostChecker:
  def __init__(self, checker):
    self._checker = checker

  def __str__(self):
    return 'Release (Host) Checker'

  def run(self):
    # Check binaries for ART.
    self._checker.check_executable('hprof-conv')
    self._checker.check_symlinked_multilib_executable('dex2oatd')

    # Check exported native libraries for Managed Core Library.
    self._checker.check_native_library('libandroidicu-host')
    self._checker.check_native_library('libandroidio')

    # Check internal libraries for Managed Core Library.
    self._checker.check_native_library('libexpat-host')
    self._checker.check_native_library('libicui18n-host')
    self._checker.check_native_library('libicuuc-host')
    self._checker.check_native_library('libz-host')


class DebugChecker:
  def __init__(self, checker):
    self._checker = checker

  def __str__(self):
    return 'Debug Checker'

  def run(self):
    # Check binaries for ART.
    self._checker.check_executable('dexdiag')
    self._checker.check_executable('dexanalyze')
    self._checker.check_executable('dexlayout')
    self._checker.check_symlinked_multilib_executable('imgdiag')

    # Check debug binaries for ART.
    self._checker.check_executable('dexlayoutd')
    self._checker.check_executable('dexoptanalyzerd')
    self._checker.check_symlinked_multilib_executable('imgdiagd')
    self._checker.check_executable('profmand')

    # Check internal libraries for ART.
    self._checker.check_native_library('libadbconnectiond')
    self._checker.check_native_library('libartbased')
    self._checker.check_native_library('libartd')
    self._checker.check_native_library('libartd-compiler')
    self._checker.check_native_library('libartd-dexlayout')
    self._checker.check_native_library('libdexfiled')
    self._checker.check_native_library('libopenjdkjvmd')
    self._checker.check_native_library('libopenjdkjvmtid')
    self._checker.check_native_library('libprofiled')

    # Check internal libraries for Managed Core Library.
    self._checker.check_native_library('libopenjdkd')


class DebugTargetChecker:
  def __init__(self, checker):
    self._checker = checker

  def __str__(self):
    return 'Debug (Target) Checker'

  def run(self):
    # Check ART debug binaries.
    self._checker.check_executable('dex2oatd')
    self._checker.check_executable('oatdumpd')

    # Check ART internal libraries.
    self._checker.check_native_library('libdexfiled_external')
    self._checker.check_prefer64_library('libartd-disassembler')

    # Check internal native library dependencies.
    #
    # Like in the release package, we check that we don't get other dependencies
    # besides those listed here. In this case the concern is not bloat, but
    # rather that we don't get behavioural differences between user (release)
    # and userdebug/eng builds, which could happen if the debug package has
    # duplicate library instances where releases don't. In other words, it's
    # uncontroversial to add debug-only dependencies, as long as they don't make
    # assumptions on having a single global state (ideally they should have
    # double_loadable:true, cf. go/double_loadable). Also, like in the release
    # package we need to look out for dependencies that should go through
    # exported library stubs (until b/128708192 is fixed).
    self._checker.check_optional_native_library('libvixld')  # Only on ARM/ARM64
    self._checker.check_prefer64_library('libmeminfo')
    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

  def __str__(self):
    return 'No superfluous binaries checker'

  def run(self):
    self._checker.check_no_superfluous_files('bin')


class NoSuperfluousLibrariesChecker:
  def __init__(self, checker):
    self._checker = checker

  def __str__(self):
    return 'No superfluous libraries checker'

  def run(self):
    self._checker.check_no_superfluous_files('javalib')
    self._checker.check_no_superfluous_files('lib')
    self._checker.check_no_superfluous_files('lib/bionic')
    self._checker.check_no_superfluous_files('lib64')
    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=False):
    self._provider = provider
    self._print_size = print_size

  def print_list(self):

    def print_list_rec(path):
      apex_map = self._provider.read_dir(path)
      if apex_map is None:
        return
      apex_map = dict(apex_map)
      if '.' in apex_map:
        del apex_map['.']
      if '..' in apex_map:
        del apex_map['..']
      for (_, val) in sorted(apex_map.items()):
        val_path = os.path.join(path, val.name)
        if self._print_size:
          if val.size < 0:
            print('[    n/a    ]  %s' % val_path)
          else:
            print('[%11d]  %s' % (val.size, val_path))
        else:
          print(val_path)
        if val.is_dir:
          print_list_rec(val_path)

    print_list_rec('')


class Tree:
  def __init__(self, provider, title, print_size=False):
    print('%s' % title)
    self._provider = provider
    self._has_next_list = []
    self._print_size = print_size

  @staticmethod
  def get_vertical(has_next_list):
    string = ''
    for v in has_next_list:
      string += '%s   ' % ('│' if v else ' ')
    return string

  @staticmethod
  def get_last_vertical(last):
    return '└── ' if last else '├── '

  def print_tree(self):

    def print_tree_rec(path):
      apex_map = self._provider.read_dir(path)
      if apex_map is None:
        return
      apex_map = dict(apex_map)
      if '.' in apex_map:
        del apex_map['.']
      if '..' in apex_map:
        del apex_map['..']
      key_list = list(sorted(apex_map.keys()))
      for i, key in enumerate(key_list):
        prev = self.get_vertical(self._has_next_list)
        last = self.get_last_vertical(i == len(key_list) - 1)
        val = apex_map[key]
        if self._print_size:
          if val.size < 0:
            print('%s%s[    n/a    ]  %s' % (prev, last, val.name))
          else:
            print('%s%s[%11d]  %s' % (prev, last, val.size, val.name))
        else:
          print('%s%s%s' % (prev, last, val.name))
        if val.is_dir:
          self._has_next_list.append(i < len(key_list) - 1)
          val_path = os.path.join(path, val.name)
          print_tree_rec(val_path)
          self._has_next_list.pop()

    print_tree_rec('')


# Note: do not sys.exit early, for __del__ cleanup.
def art_apex_test_main(test_args):
  if test_args.host and test_args.flattened:
    logging.error("Both of --host and --flattened set")
    return 1
  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.flattened and not test_args.tmpdir:
    logging.error("Need a tmpdir.")
    return 1
  if not test_args.flattened and not test_args.host and not test_args.debugfs:
    logging.error("Need debugfs.")
    return 1
  if test_args.bitness not in ['32', '64', 'multilib', 'auto']:
    logging.error('--bitness needs to be one of 32|64|multilib|auto')

  try:
    if test_args.host:
      apex_provider = HostApexProvider(test_args.apex, test_args.tmpdir)
    else:
      if test_args.flattened:
        apex_provider = TargetFlattenedApexProvider(test_args.apex)
      else:
        apex_provider = TargetApexProvider(test_args.apex, test_args.tmpdir, test_args.debugfs)
  except (zipfile.BadZipFile, zipfile.LargeZipFile) as e:
    logging.error('Failed to create provider: %s', e)
    return 1

  if test_args.tree:
    Tree(apex_provider, test_args.apex, test_args.size).print_tree()
    return 0
  if test_args.list:
    List(apex_provider, test_args.size).print_list()
    return 0

  checkers = []
  if test_args.bitness == 'auto':
    logging.warning('--bitness=auto, trying to autodetect. This may be incorrect!')
    has_32 = apex_provider.get('lib') is not None
    has_64 = apex_provider.get('lib64') is not None
    if has_32 and has_64:
      logging.warning('  Detected multilib')
      test_args.bitness = 'multilib'
    elif has_32:
      logging.warning('  Detected 32-only')
      test_args.bitness = '32'
    elif has_64:
      logging.warning('  Detected 64-only')
      test_args.bitness = '64'
    else:
      logging.error('  Could not detect bitness, neither lib nor lib64 contained.')
      List(apex_provider).print_list()
      return 1

  if test_args.bitness == '32':
    base_checker = Arch32Checker(apex_provider)
  elif test_args.bitness == '64':
    base_checker = Arch64Checker(apex_provider)
  else:
    assert test_args.bitness == 'multilib'
    base_checker = MultilibChecker(apex_provider)

  checkers.append(ReleaseChecker(base_checker))
  if test_args.host:
    checkers.append(ReleaseHostChecker(base_checker))
  else:
    checkers.append(ReleaseTargetChecker(base_checker))
  if test_args.debug or test_args.testing:
    checkers.append(DebugChecker(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.
    checkers.append(NoSuperfluousLibrariesChecker(base_checker))

  failed = False
  for checker in checkers:
    logging.info('%s...', checker)
    checker.run()
    if base_checker.error_count() > 0:
      logging.error('%s FAILED', checker)
      failed = True
    else:
      logging.info('%s SUCCEEDED', checker)
    base_checker.reset_errors()

  return 1 if failed else 0


def art_apex_test_default(test_parser):
  if 'ANDROID_PRODUCT_OUT' not in os.environ:
    logging.error('No-argument use requires ANDROID_PRODUCT_OUT')
    sys.exit(1)
  product_out = os.environ['ANDROID_PRODUCT_OUT']
  if 'ANDROID_HOST_OUT' not in os.environ:
    logging.error('No-argument use requires ANDROID_HOST_OUT')
    sys.exit(1)
  host_out = os.environ['ANDROID_HOST_OUT']

  test_args = test_parser.parse_args(['dummy'])  # For consistency.
  test_args.debugfs = '%s/bin/debugfs' % host_out
  test_args.tmpdir = '.'
  test_args.tree = False
  test_args.list = False
  test_args.bitness = 'auto'
  failed = False

  if not os.path.exists(test_args.debugfs):
    logging.error("Cannot find debugfs (default path %s). Please build it, e.g., m debugfs",
                  test_args.debugfs)
    sys.exit(1)

  # TODO: Add host support
  configs = [
    {'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:
    logging.info(config['name'])
    # TODO: Host will need different path.
    test_args.apex = '%s/system/apex/%s.apex' % (product_out, config['name'])
    if not os.path.exists(test_args.apex):
      failed = True
      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

  if failed:
    sys.exit(1)


if __name__ == "__main__":
  parser = argparse.ArgumentParser(description='Check integrity of a Runtime APEX.')

  parser.add_argument('apex', help='apex file input')

  parser.add_argument('--host', help='Check as host apex', action='store_true')

  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')
  parser.add_argument('--size', help='Print file sizes', action='store_true')

  parser.add_argument('--tmpdir', help='Directory for temp files')
  parser.add_argument('--debugfs', help='Path to debugfs')

  parser.add_argument('--bitness', help='Bitness to check, 32|64|multilib|auto', default='auto')

  if len(sys.argv) == 1:
    art_apex_test_default(parser)
  else:
    args = parser.parse_args()

    if args is None:
      sys.exit(1)

    exit_code = art_apex_test_main(args)
    sys.exit(exit_code)
