#!/usr/bin/env vpython3 # [VPYTHON:BEGIN] # python_version: "3.8" # wheel < # name: "infra/python/wheels/pyyaml/${platform}_${py_python}_${py_abi}" # version: "version:5.4.1.chromium.1" # > # [VPYTHON:END] # Copyright (c) 2013, the Flutter project authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be found # in the LICENSE file. import logging import os import sys from typing import Any, Iterable, List, Mapping, Set # The import is coming from vpython wheel and pylint cannot find it. import yaml # pylint: disable=import-error # The imports are coming from fuchsia/test_scripts and pylint cannot find them # without setting a global init-hook which is less favorable. # But this file will be executed as part of the CI, its correctness of importing # is guaranteed. sys.path.insert( 0, os.path.join(os.path.dirname(__file__), '../../tools/fuchsia/test_scripts/test/') ) # pylint: disable=import-error, wrong-import-position from bundled_test_runner import run_tests, TestCase from common import DIR_SRC_ROOT from compatible_utils import force_running_unattended if len(sys.argv) == 2: VARIANT = sys.argv[1] sys.argv.pop() elif len(sys.argv) == 1: VARIANT = 'fuchsia_debug_x64' else: assert False, 'Expect only one parameter as the compile output directory.' OUT_DIR = os.path.join(DIR_SRC_ROOT, 'out', VARIANT) # Visible for testing def resolve_packages(tests: Iterable[Mapping[str, Any]]) -> Set[str]: packages = set() for test in tests: if 'package' in test: packages.add(test['package']) else: assert 'packages' in test, \ 'Expect either one package or a list of packages' packages.update(test['packages']) resolved_packages = set() for package in packages: if package.endswith('-0.far'): # Make a symbolic link to match the name of the package itself without the # '-0.far' suffix. new_package = os.path.join(OUT_DIR, package.replace('-0.far', '.far')) try: # Remove the old one if it exists, usually happen on the devbox, so # ignore the FileNotFoundError. os.remove(new_package) except FileNotFoundError: pass os.symlink(package, new_package) resolved_packages.add(new_package) else: resolved_packages.add(os.path.join(OUT_DIR, package)) return resolved_packages # Visible for testing def build_test_cases(tests: Iterable[Mapping[str, Any]]) -> List[TestCase]: test_cases = [] for test in [t['test_command'] for t in tests]: assert test.startswith('test run ') test = test[len('test run '):] if ' -- ' in test: package, args = test.split(' -- ', 1) test_cases.append(TestCase(package=package, args=args)) else: test_cases.append(TestCase(package=test)) return test_cases def main() -> int: logging.basicConfig(level=logging.INFO) logging.info('Running tests in %s', OUT_DIR) force_running_unattended() sys.argv.append('--out-dir=' + OUT_DIR) if VARIANT.endswith('_arm64') or VARIANT.endswith('_arm64_tester'): sys.argv.append('--product=terminal.qemu-arm64') sys.argv.append('--logs-dir=' + os.environ.get('FLUTTER_LOGS_DIR', '/tmp/log')) with open(os.path.join(os.path.dirname(__file__), 'test_suites.yaml'), 'r') as file: tests = yaml.safe_load(file) # TODO(zijiehe-google-com): Run all tests in release build, # https://github.com/flutter/flutter/issues/140179. def variant(test) -> bool: return 'variant' not in test or test['variant'] in VARIANT tests = [t for t in tests if variant(t)] for package in resolve_packages(tests): sys.argv.append('--packages=' + package) return run_tests(build_test_cases(tests)) if __name__ == '__main__': sys.exit(main())