diff --git a/.ci.yaml b/.ci.yaml index edc4faa761885..c4f00b9064e7a 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -193,7 +193,12 @@ targets: - name: Linux linux_fuchsia recipe: engine_v2/engine_v2 - timeout: 60 + # Temporarily increase the timeout of this builder to 75 minutes to avoid + # being penetrated by cold goma / rbclient cache. + # TODO(zijiehe-google-com): Drop the timeout to 60 minutes once the release + # builder can finish within a reasonable time. + # https://github.com/flutter/flutter/issues/142932 + timeout: 75 properties: release_build: "true" config_name: linux_fuchsia diff --git a/ci/builders/linux_fuchsia.json b/ci/builders/linux_fuchsia.json index 011a13618aa11..facbae0827b6c 100644 --- a/ci/builders/linux_fuchsia.json +++ b/ci/builders/linux_fuchsia.json @@ -115,10 +115,12 @@ { "drone_dimensions": [ "device_type=none", + "kvm=1", "os=Linux" ], "gclient_variables": { - "download_android_deps": false + "download_android_deps": false, + "run_fuchsia_emu": true }, "gn": [ "--fuchsia", @@ -131,9 +133,22 @@ "ninja": { "config": "fuchsia_release_x64", "targets": [ - "flutter/shell/platform/fuchsia:fuchsia" + "flutter/shell/platform/fuchsia:fuchsia", + "flutter/shell/platform/fuchsia/dart_runner:dart_runner_tests", + "fuchsia_tests" ] - } + }, + "tests": [ + { + "name": "x64 emulator based release tests", + "language": "python3", + "script": "flutter/tools/fuchsia/with_envs.py", + "parameters": [ + "testing/fuchsia/run_tests.py", + "fuchsia_release_x64" + ] + } + ] }, { "drone_dimensions": [ @@ -158,6 +173,7 @@ "config": "fuchsia_debug_x64", "targets": [ "flutter/shell/platform/fuchsia:fuchsia", + "flutter/shell/platform/fuchsia/dart_runner:dart_runner_tests", "fuchsia_tests" ] }, @@ -176,7 +192,7 @@ ] }, { - "name": "x64 emulator based tests", + "name": "x64 emulator based debug tests", "language": "python3", "script": "flutter/tools/fuchsia/with_envs.py", "parameters": [ diff --git a/shell/platform/fuchsia/dart_runner/embedder/BUILD.gn b/shell/platform/fuchsia/dart_runner/embedder/BUILD.gn index afd12c4b51be8..562191cbcf6b0 100644 --- a/shell/platform/fuchsia/dart_runner/embedder/BUILD.gn +++ b/shell/platform/fuchsia/dart_runner/embedder/BUILD.gn @@ -54,8 +54,7 @@ template("create_aot_snapshot") { # No asserts in debug or release product. # No asserts in release with flutter_profile=true (non-product) # Yes asserts in non-product debug. - if (!invoker.product && - (!(flutter_runtime_mode == "profile") || is_debug)) { + if (!invoker.product && (flutter_runtime_mode == "debug" || is_debug)) { args += [ "--enable_asserts" ] } args += [ rebase_path(shim_kernel) ] diff --git a/shell/platform/fuchsia/dart_runner/kernel/BUILD.gn b/shell/platform/fuchsia/dart_runner/kernel/BUILD.gn index af896f65e28b8..c990742404703 100644 --- a/shell/platform/fuchsia/dart_runner/kernel/BUILD.gn +++ b/shell/platform/fuchsia/dart_runner/kernel/BUILD.gn @@ -69,8 +69,7 @@ template("create_kernel_core_snapshot") { # No asserts in debug or release product. # No asserts in release with flutter_profile=true (non-product) # Yes asserts in non-product debug. - if (!invoker.product && - (is_debug || !(flutter_runtime_mode == "profile"))) { + if (!invoker.product && (is_debug || flutter_runtime_mode == "debug")) { args += [ "--enable_asserts" ] } args += [ rebase_path(platform_dill) ] diff --git a/shell/platform/fuchsia/dart_runner/vmservice/BUILD.gn b/shell/platform/fuchsia/dart_runner/vmservice/BUILD.gn index 8aa7da550baab..c299edb5f3f78 100644 --- a/shell/platform/fuchsia/dart_runner/vmservice/BUILD.gn +++ b/shell/platform/fuchsia/dart_runner/vmservice/BUILD.gn @@ -65,7 +65,7 @@ template("aot_snapshot") { # No asserts in debug or release product. # No asserts in release with flutter_profile=true (non-product) # Yes asserts in non-product debug. - if (!product && (!(flutter_runtime_mode == "profile") || is_debug)) { + if (!product && (flutter_runtime_mode == "debug" || is_debug)) { args += [ "--enable_asserts" ] } diff --git a/shell/platform/fuchsia/flutter/kernel/BUILD.gn b/shell/platform/fuchsia/flutter/kernel/BUILD.gn index bc9853d5cd7f9..dd77441bfd3cd 100644 --- a/shell/platform/fuchsia/flutter/kernel/BUILD.gn +++ b/shell/platform/fuchsia/flutter/kernel/BUILD.gn @@ -73,8 +73,7 @@ template("core_snapshot") { # No asserts in debug or release product. # No asserts in release with flutter_profile=true (non-product) # Yes asserts in non-product debug. - if (!invoker.product && - (is_debug || !(flutter_runtime_mode == "profile"))) { + if (!invoker.product && (is_debug || flutter_runtime_mode == "debug")) { args += [ "--enable_asserts" ] } args += [ rebase_path(platform_dill) ] diff --git a/testing/fuchsia/run_tests.py b/testing/fuchsia/run_tests.py index 2a301c828299c..40c66be2b96a1 100755 --- a/testing/fuchsia/run_tests.py +++ b/testing/fuchsia/run_tests.py @@ -1,12 +1,28 @@ -#!/usr/bin/env python3 +#!/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 argparse +import logging import os import sys +from subprocess import CompletedProcess +from typing import List + +# 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 @@ -25,32 +41,89 @@ from run_executable_test import ExecutableTestRunner from test_runner import TestRunner -# TODO(https://github.com/flutter/flutter/issues/140179): Respect build -# configurations. -OUT_DIR = os.path.join(DIR_SRC_ROOT, 'out/fuchsia_debug_x64') +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) -# TODO(https://github.com/flutter/flutter/issues/140179): Execute all the tests -# in -# https://github.com/flutter/engine/blob/main/testing/fuchsia/test_suites.yaml -# and avoid hardcoded paths. -def _get_test_runner(runner_args: argparse.Namespace, *_) -> TestRunner: - return ExecutableTestRunner( - OUT_DIR, [], - 'fuchsia-pkg://fuchsia.com/dart_runner_tests#meta/dart_runner_tests.cm', - runner_args.target_id, None, '/tmp/log', - [os.path.join(OUT_DIR, 'dart_runner_tests.far')], None +class BundledTestRunner(TestRunner): + + # private, use bundled_test_runner_of function instead. + def __init__( + self, target_id: str, package_deps: List[str], tests: List[str], + logs_dir: str + ): + super().__init__(OUT_DIR, [], None, target_id, package_deps) + self.tests = tests + self.logs_dir = logs_dir + + def run_test(self) -> CompletedProcess: + returncode = 0 + for test in self.tests: + # pylint: disable=protected-access + test_runner = ExecutableTestRunner( + OUT_DIR, [], test, self._target_id, None, self.logs_dir, [], None + ) + test_runner._package_deps = self._package_deps + result = test_runner.run_test().returncode + logging.info('Result of test %s is %s', test, result) + if result != 0: + returncode = result + return CompletedProcess(args='', returncode=returncode) + + +def bundled_test_runner_of(target_id: str) -> BundledTestRunner: + log_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 tests with multiple packages or with extra + # test arguments, https://github.com/flutter/flutter/issues/140179. + tests = list( + filter( + lambda test: test['test_command'].startswith('test run ') and test[ + 'test_command'].endswith('.cm'), tests + ) + ) + tests = list( + filter( + lambda test: 'package' in test and test['package'].endswith('-0.far'), + tests + ) + ) + tests = list( + filter( + lambda test: not 'variant' in test or VARIANT == test['variant'], + tests + ) + ) + for test in tests: + original_package = test['package'] + test['package'] = os.path.join( + OUT_DIR, test['package'].replace('-0.far', '.far') + ) + try: + os.remove(test['package']) + except FileNotFoundError: + pass + os.symlink(original_package, test['package']) + return BundledTestRunner( + target_id, [test['package'] for test in tests], + [test['test_command'][len('test run '):] for test in tests], log_dir ) +def _get_test_runner(runner_args: argparse.Namespace, *_) -> TestRunner: + return bundled_test_runner_of(runner_args.target_id) + + if __name__ == '__main__': - try: - os.remove(os.path.join(OUT_DIR, 'dart_runner_tests.far')) - except FileNotFoundError: - pass - os.symlink( - 'dart_runner_tests-0.far', os.path.join(OUT_DIR, 'dart_runner_tests.far') - ) + logging.info('Running tests in %s', OUT_DIR) sys.argv.append('--out-dir=' + OUT_DIR) # The 'flutter-test-type' is a place holder and has no specific meaning; the # _get_test_runner is overrided. diff --git a/testing/fuchsia/test_suites.yaml b/testing/fuchsia/test_suites.yaml index c311fe2fc28dc..876a51ad8914f 100644 --- a/testing/fuchsia/test_suites.yaml +++ b/testing/fuchsia/test_suites.yaml @@ -19,16 +19,20 @@ package: flow_tests-0.far - test_command: test run fuchsia-pkg://fuchsia.com/runtime_tests#meta/runtime_tests.cm package: runtime_tests-0.far + variant: fuchsia_debug_x64 - test_command: test run fuchsia-pkg://fuchsia.com/shell_tests#meta/shell_tests.cm package: shell_tests-0.far + variant: fuchsia_debug_x64 - test_command: test run fuchsia-pkg://fuchsia.com/testing_tests#meta/testing_tests.cm package: testing_tests-0.far - test_command: test run fuchsia-pkg://fuchsia.com/txt_tests#meta/txt_tests.cm -- --gtest_filter=-ParagraphTest.* package: txt_tests-0.far - test_command: test run fuchsia-pkg://fuchsia.com/ui_tests#meta/ui_tests.cm package: ui_tests-0.far + variant: fuchsia_debug_x64 - test_command: test run fuchsia-pkg://fuchsia.com/embedder_tests#meta/embedder_tests.cm package: embedder_tests-0.far + variant: fuchsia_debug_x64 - test_command: test run fuchsia-pkg://fuchsia.com/dart_utils_tests#meta/dart_utils_tests.cm package: dart_utils_tests-0.far - test_command: test run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm