mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
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
115 lines
3.7 KiB
Python
Executable File
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())
|