zijiehe@ ed3b8da5e8 [fuchsia] Use BundledTestRunner from test-scripts (flutter/engine#54404)
The BundledTestRunner has been moved to chromium already, flutter can now use it without needing to reimplement the same logic.

The logic of parsing yaml file is still flutter specific and keeps as-is.

Bug: http://crbug.com/356463343

[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
2024-08-13 20:55:33 +00:00

115 lines
3.7 KiB
Python
Executable File

#!/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())