blob: ef0e6b3d312c3ca6be96ee92bea99eabd26215a2 [file] [log] [blame]
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from contextlib import contextmanager
from PB.recipes.flutter.engine.engine import InputProperties
from PB.recipes.flutter.engine.engine import EnvProperties
from PB.go.chromium.org.luci.buildbucket.proto import build as build_pb2
from google.protobuf import struct_pb2
import re
DEPS = [
'depot_tools/depot_tools',
'flutter/repo_util',
'flutter/retry',
'flutter/shard_util_v2',
'flutter/ssh',
'flutter/test_utils',
'flutter/yaml',
'fuchsia/cas_util',
'flutter/goma',
'recipe_engine/buildbucket',
'recipe_engine/context',
'recipe_engine/file',
'recipe_engine/json',
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/raw_io',
'recipe_engine/step',
]
PROPERTIES = InputProperties
ENV_PROPERTIES = EnvProperties
# FFX is still a little bit flaky sometimes. A temporary workaround will be to
# retry the tests multiple times if they fail.
MAX_RETRIES = 3
def GetCheckoutPath(api):
return api.path['cache'].join('builder', 'src')
def GetEmulatorArch(api):
arch = api.properties.get('emulator_arch', 'x64')
if arch not in ['arm64', 'x64']:
api.step.StepWarning('invalid architecture: %s - defaulting to x64' % arch)
return 'x64'
return arch
def Build(api, config, *targets):
checkout = GetCheckoutPath(api)
build_dir = checkout.join('out/%s' % config)
goma_jobs = api.properties['goma_jobs']
ninja_path = checkout.join('flutter', 'third_party', 'ninja', 'ninja')
ninja_args = [ninja_path, '-j', goma_jobs, '-C', build_dir]
ninja_args.extend(targets)
with api.goma():
name = 'build %s' % ' '.join([config] + list(targets))
api.step(name, ninja_args)
def GetFlutterFuchsiaBuildTargets(product, include_test_targets=False):
targets = ['flutter/shell/platform/fuchsia:fuchsia']
if include_test_targets:
targets += ['fuchsia_tests']
return targets
def BuildAndTestFuchsia(api, build_script, git_rev):
arch = GetEmulatorArch(api)
# Prepares build files for debug/JIT Fuchsia
RunGN(api, '--fuchsia', '--fuchsia-cpu', arch, '--runtime-mode', 'debug',
'--no-lto')
# Prepares build files for profile/AOT Fuchsia
RunGN(api, '--fuchsia', '--fuchsia-cpu', arch, '--runtime-mode', 'profile',
'--no-lto')
# Builds debug/JIT Fuchsia
Build(api, 'fuchsia_debug_%s' % arch, *GetFlutterFuchsiaBuildTargets(False, True))
# Builds profile/AOT Fuchsia
Build(api, 'fuchsia_profile_%s' % arch, *GetFlutterFuchsiaBuildTargets(False, True))
# Package the build artifacts.
#
# We pass --skip-build here to take the existing artifacts that have been built
# and package them. This will not build fuchsia artifacts despite the name of
# the build_script being build_fuchsia_artifacts.
#
# TODO(akbiggs): Clean this up if we feel brave.
fuchsia_debug_package_cmd = [
'python3', build_script, '--engine-version', git_rev, '--skip-build',
'--archs', arch, '--runtime-mode', 'debug',
]
fuchsia_profile_package_cmd = [
'python3', build_script, '--engine-version', git_rev, '--skip-build',
'--archs', arch, '--runtime-mode', 'profile', '--skip-remove-buckets'
]
api.step('package Debug/JIT Fuchsia Artifacts', fuchsia_debug_package_cmd)
api.step('package Profile/AOT Fuchsia Artifacts', fuchsia_profile_package_cmd)
TestFuchsiaFEMU(api)
def RunGN(api, *args):
checkout = GetCheckoutPath(api)
gn_cmd = ['python3', checkout.join('flutter/tools/gn'), '--goma']
gn_cmd.extend(args)
# Run with goma_dir context.
env = {'GOMA_DIR': api.goma.goma_dir}
with api.context(env=env):
api.step('gn %s' % ' '.join(args), gn_cmd)
def GetFuchsiaBuildId(api):
checkout = GetCheckoutPath(api)
manifest_path = checkout.join('fuchsia', 'sdk', 'linux', 'meta',
'manifest.json')
manifest_data = api.file.read_json('read manifest', manifest_path)
return manifest_data['id']
def CasRoot(api):
"""Create a CAS containing flutter test components and fuchsia runfiles for FEMU."""
sdk_version = GetFuchsiaBuildId(api)
checkout = GetCheckoutPath(api)
root_dir = api.path.mkdtemp('femu_runfiles_')
cas_tree = api.cas_util.tree(root=root_dir)
test_suites = []
def add(src, name_rel_to_root):
# CAS requires the files to be located directly inside the root folder.
cas_tree.register_link(
target=src,
linkname=cas_tree.root.join(name_rel_to_root),
)
def addFlutterTests():
arch = GetEmulatorArch(api)
add(
checkout.join('out', 'fuchsia_bucket', 'flutter', arch, 'debug', 'aot',
'flutter_aot_runner-0.far'), 'flutter_aot_runner-0.far')
test_suites_file = checkout.join(
'flutter', 'testing', 'fuchsia', 'test_suites.yaml')
for suite in api.yaml.read('retrieve list of test suites',
test_suites_file, api.json.output()).json.output:
# Default behavior is to run all tests on x64 if "emulator_arch" isn't present
# If "emulator_arch" is present, we run based on the emulator_arch specified
# x64 - femu_test.py
# arm64 - arm_femu_test.py
if arch not in suite.get('emulator_arch', ['x64']):
continue
# Ensure command is well-formed.
# See https://fuchsia.dev/fuchsia-src/concepts/packages/package_url.
match = re.match(r'^(test run) (?P<test_far_file>fuchsia-pkg://[0-9a-z\-_\.]+/(?P<name>[0-9a-z\-_\.]+)#meta/[0-9a-z\-_\.]+(\.cm|\.cmx))( +[0-9a-zA-Z\-_*\.: =]+)?$', suite['test_command'])
if not match:
raise api.step.StepFailure('Invalid test command: %s' % suite['test_command'])
suite['name'] = match.group('name')
suite['run_with_dart_aot'] = 'run_with_dart_aot' in suite and suite['run_with_dart_aot'] == 'true'
suite['test_far_file'] = match.group('test_far_file')
if 'packages' not in suite:
suite['packages'] = [ suite['package'] ]
suite['package_basenames'] = []
for path in suite['packages']:
# Captures the FAR name (long/path/to/far/file/actual_far.far would output actual_far.far)
basename = re.match(r'(:?.*/)*([^/]*$)', path).group(2)
suite['package_basenames'].append(basename)
if suite['run_with_dart_aot']:
add(checkout.join('out', 'fuchsia_profile_%s' % arch, path), basename)
else:
add(checkout.join('out', 'fuchsia_debug_%s' % arch, path), basename)
test_suites.append(suite)
addFlutterTests()
cas_tree.create_links("create tree of runfiles")
cas_hash = api.cas_util.upload(cas_tree.root, step_name='archive FEMU Run Files')
return test_suites, root_dir, cas_hash
def RunTestSuiteOnFfxEmuImpl(api, suite, ffx, arch):
# Launch the emulator
if arch == 'arm64':
launch_step = api.step(
'launch arm64 emulator with QEMU engine', [
ffx, '-v', 'emu', 'start', 'terminal.qemu-arm64', '--engine',
'qemu', '--headless', '--startup-timeout', '360'
]
)
else:
launch_step = api.step(
'launch x64 emulator',
[ffx, '-v', 'emu', 'start', 'terminal.qemu-x64', '--headless']
)
# Output information for current emulator
# Contains version, product information, etc.
api.step('list all targets in the collection', [ffx, 'target', 'list'])
api.step('retrieve femu information', [ffx, 'target', 'show'])
ffx_repo_list_json = api.step(
'get repository information',
[ffx, '--machine', 'json', 'repository', 'list'],
stdout=api.json.output()
).stdout
ffx_repo_path = ffx_repo_list_json[0]['spec']['path']
for package in suite['package_basenames']:
api.step(
'ffx repository publish {}'.format(package), [
ffx, 'repository', 'publish', ffx_repo_path, '--package-archive',
package
]
)
api.step('start FFX repository', [ffx, 'repository', 'server', 'start'])
api.step(
'Register repository',
[ffx, 'target', 'repository', 'register', '--alias', 'fuchsia.com']
)
# Run the actual test
# Test command is guaranteed to be well-formed
# TODO(http://fxb/121613): Emulator instances are not cleaned up
# when tests fail. Added a clean up step before tests start to
# stop all running emulators.
with api.step.defer_results():
api.retry.step('run ffx test', [ffx] + suite['test_command'].split(' '))
def ReadLogFiles(api):
"""
Read the log files generated by ffx and by the Fuchsia emulator and present
them in the test result page.
"""
with api.step.nest('logs') as dump_step:
dump_step.presentation.logs['ffx_daemon_log'] = api.file.read_text(
'read ffx daemon log',
api.path.join(
api.context.env.get('FFX_ISOLATE_DIR'), 'cache', 'logs',
'ffx.daemon.log'
)
)
dump_step.presentation.logs['ffx_log'] = api.file.read_text(
'read ffx log',
api.path.join(
api.context.env.get('FFX_ISOLATE_DIR'), 'cache', 'logs', 'ffx.log'
)
)
dump_step.presentation.logs['emulator_log'] = api.file.read_text(
'read ffx emulator log',
api.path.join(
api.context.env.get('FFX_ISOLATE_DIR'), 'data', 'emu', 'instances',
'fuchsia-emulator', 'emulator.log'
)
)
dump_step.presentation.logs['emulator_serial_log'] = api.file.read_text(
'read ffx serial log',
api.path.join(
api.context.env.get('FFX_ISOLATE_DIR'), 'data', 'emu', 'instances',
'fuchsia-emulator', 'emulator.log.serial'
)
)
def CleanupAfterTestRun(api, ffx, arch):
ReadLogFiles(api)
# Cleans up running processes to prevent clashing with future test runs
api.step('stop FFX repository', [ffx, 'repository', 'server', 'stop'])
api.step('stop {} emulator'.format(arch), [ffx, '-v', 'emu', 'stop', '--all'])
def RunTestSuiteOnFfxEmu(api, suite, ffx, arch):
"""
Run the Fuchsia test suite |suite| on the Fuchsia emulator, using ffx.
"""
for attempt in range(MAX_RETRIES):
step_name = 'run %s' % suite['name']
if attempt != 0:
step_name += ' (attempt #%d)' % (attempt + 1)
with api.step.nest(step_name):
try:
return RunTestSuiteOnFfxEmuImpl(api, suite, ffx, arch)
except api.step.StepFailure as ex:
if attempt == MAX_RETRIES - 1:
raise
finally:
CleanupAfterTestRun(api, ffx, arch)
def TestFuchsiaFEMU(api):
"""Run flutter tests on FEMU."""
test_suites, root_dir, cas_hash = CasRoot(api)
arch = GetEmulatorArch(api)
checkout = GetCheckoutPath(api)
ffx = checkout.join('fuchsia/sdk/linux/tools/x64/ffx')
pb_suffix = ''
with api.context(cwd=root_dir), api.step.nest('Set FFX config'):
# Fuchsia LSC runs will override the SDK and product bundles that should be
# used for the tests. The path to the test artifacts is passed through the
# `gclient_variables`.
gclient_variables = api.properties.get('gclient_variables', {})
if 'product_bundles_path' in gclient_variables:
product_bundle_manifest_path = 'gs://fuchsia-artifacts/%s' % gclient_variables[
'product_bundles_path']
# Set the ffx config to let it know that it's a valid product bundle path.
api.step(
'Set PBM metadata path', [
ffx, 'config', 'set', 'pbms.metadata',
'["%s"]' % product_bundle_manifest_path
]
)
# We'll need to suffix all the product-bundle names with a full path
# otherwise ffx product-bundle will complain that it can find a
# product-bundle associated with the current SDK version in the current PBM
# metadata path (this also avoid accidentally using the wrong product bundle).
pb_suffix = '%s#' % product_bundle_manifest_path
# Conditionally enable ffx's CSO flag
if api.properties.get('enable_cso', False):
api.step(
'enable CSO in ffx', [ffx, 'config', 'set', 'overnet.cso', 'enabled']
)
else:
api.step(
'disable CSO in ffx',
[ffx, 'config', 'set', 'overnet.cso', 'disabled']
)
# Disable ffx analytics so this does not count as a real user
api.step('disable ffx analytics', [ffx, 'config', 'analytics', 'disable'])
# Set the log level to debug to help investigate failures.
api.step('set logging level', [ffx, 'config', 'set', 'log.level', 'debug'])
# Pick up new config change
api.step('restart ffx daemon', [ffx, 'daemon', 'stop'])
# TODO(fxb/121613). Workaround for the issue of previously running
# emulator.
api.step('list emulators', [ffx, 'emu', 'list'])
api.step('stop all emulator instances', [ffx, 'emu', 'stop', '--all'])
# Retrieve the required product bundle
# Contains necessary images, packages, etc to launch the emulator
api.step(
'get terminal.qemu-%s product bundle' % arch,
[ffx, 'product-bundle', 'get',
'%sterminal.qemu-%s' % (pb_suffix, arch)]
)
with api.context(cwd=root_dir), api.step.nest('run FEMU test on %s' % arch):
for suite in test_suites:
RunTestSuiteOnFfxEmu(api, suite, ffx, arch)
def BuildFuchsia(api):
"""
Schedules release builds for x64 on other bots, and then builds the x64 runners
(which do not require LTO and thus are faster to build).
On Linux, we also run tests for the runner against x64, and if they fail
we cancel the scheduled builds.
"""
checkout = GetCheckoutPath(api)
build_script = str(
checkout.join('flutter/tools/fuchsia/build_fuchsia_artifacts.py'))
git_rev = api.buildbucket.gitiles_commit.id or 'HEAD'
BuildAndTestFuchsia(api, build_script, git_rev)
def RunSteps(api, properties, env_properties):
cache_root = api.buildbucket.builder_cache_path
checkout = GetCheckoutPath(api)
api.file.rmtree('clobber build output', checkout.join('out'))
api.file.ensure_directory('ensure checkout cache', cache_root)
dart_bin = checkout.join('third_party', 'dart', 'tools', 'sdks', 'dart-sdk',
'bin')
ffx_isolate_dir = api.path.mkdtemp('ffx_isolate_files')
env = {
'FFX_ISOLATE_DIR': ffx_isolate_dir,
}
env_prefixes = {'PATH': [dart_bin]}
api.repo_util.engine_checkout(cache_root, env, env_prefixes)
# Various scripts we run assume access to depot_tools on path for `ninja`.
with api.context(
cwd=cache_root, env=env,
env_prefixes=env_prefixes), api.depot_tools.on_path():
if api.platform.is_linux and api.properties.get('build_fuchsia', True):
BuildFuchsia(api)
############ RECIPE TEST ############
def GenTests(api):
output_props = struct_pb2.Struct()
output_props['cas_output_hash'] = 'deadbeef'
build = api.buildbucket.try_build_message(
builder='FEMU Test', project='flutter')
build.output.CopyFrom(build_pb2.Build.Output(properties=output_props))
def ffx_repo_list_step_data(step_name):
return api.step_data(
step_name,
stdout=api.json.output([{
'name': 'terminal.qemu-arm64', 'spec': {
'type':
'pm',
'path':
'/foo/bar/data/pbms/18411389924820269552/terminal.qemu-arm64/packages'
}
}])
)
def ffx_repo_list_step_data_with_retries(base_step_name, retry_count):
ret = []
for i in range(retry_count):
if i == 0:
step_name = base_step_name + '.get repository information'
else:
step_name = base_step_name + (
' (attempt #%d).get repository information' % (i + 1)
)
ret.append(ffx_repo_list_step_data(step_name))
return tuple(ret)
def fail_step_with_retries(base_step_name, step_suffix):
return (
api.step_data(base_step_name + '.' + step_suffix, retcode=1),
api.step_data(
base_step_name + ' (attempt #2).' + step_suffix, retcode=1
),
api.step_data(
base_step_name + ' (attempt #3).' + step_suffix, retcode=1
)
)
yield api.test(
'start_femu',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
),
clobber=False,
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'package':
'v2_test-123.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm -- --gtest_filter=-ParagraphTest.*:a.b'
}, {
'package':
'v1_test_component-321.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v1_test_component#meta/v1_test_component.cmx -ParagraphTest.*:a.b'
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
'''# This is a comment.
- package: v2_test-123.far
test_command: test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm -- --gtest_filter=-ParagraphTest.*:a.b
# Legacy cfv1 test
- package: v1_test_component-321.far
test_command: test run fuchsia-pkg://fuchsia.com/v1_test_component#meta/v1_test_component.cmx -ParagraphTest.*:a.b'''
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
*fail_step_with_retries(
'run FEMU test on x64.run v2_test', 'launch x64 emulator'
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'femu_with_package_list',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
),
clobber=False,
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'test_command':
'test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm -- --gtest_filter=-ParagraphTest.*:a.b',
'packages': ['v2_test-123.far']
}, {
'test_command':
'test run fuchsia-pkg://fuchsia.com/v1_test_component#meta/v1_test_component.cmx -ParagraphTest.*:a.b',
'packages': ['v1_test_component-321.far']
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
'''# This is a comment.
- test_command: test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm -- --gtest_filter=-ParagraphTest.*:a.b
packages:
- v2_test-123.far
# Legacy cfv1 test
- test_command: test run fuchsia-pkg://fuchsia.com/v1_test_component#meta/v1_test_component.cmx -ParagraphTest.*:a.b
packages:
- v1_test_component-321.far'''
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
*ffx_repo_list_step_data_with_retries(
'run FEMU test on x64.run v2_test', MAX_RETRIES
),
*fail_step_with_retries(
'run FEMU test on x64.run v2_test',
'ffx repository publish v2_test-123.far'
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'multiple_non_root_fars',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
),
clobber=False,
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'test_command':
'test run fuchsia-pkg://fuchsia.com/flutter-embedder-test#meta/flutter-embedder-test.cmx',
'packages': [
'flutter-embedder-test-0.far',
'gen/flutter/shell/platform/fuchsia/flutter/integration_flutter_tests/embedder/child-view/child-view/child-view.far',
'gen/flutter/shell/platform/fuchsia/flutter/integration_flutter_tests/embedder/parent-view/parent-view/parent-view.far'
]
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
'''# This is a comment.
- test_command: test run fuchsia-pkg://fuchsia.com/flutter-embedder-test#meta/flutter-embedder-test.cmx
packages:
- flutter-embedder-test-0.far
- gen/flutter/shell/platform/fuchsia/flutter/integration_flutter_tests/embedder/child-view/child-view/child-view.far
- gen/flutter/shell/platform/fuchsia/flutter/integration_flutter_tests/embedder/parent-view/parent-view/parent-view.far'''
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
*ffx_repo_list_step_data_with_retries(
'run FEMU test on x64.run flutter-embedder-test', 2
),
api.step_data(
'run FEMU test on x64.run flutter-embedder-test.ffx repository publish flutter-embedder-test-0.far',
retcode=1
),
api.step_data(
'run FEMU test on x64.run flutter-embedder-test (attempt #2).ffx repository publish flutter-embedder-test-0.far',
retcode=0
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'no_zircon_file',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
vdl_version='g3-revision:vdl_fuchsia_xxxxxxxx_RC00',
clobber=False,
),
clobber=False,
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'package':
'v2_test-123.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm'
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
"""# This is a comment.
- package: v2_test-123.far
test_command: test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm"""
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
ffx_repo_list_step_data(
'run FEMU test on x64.run v2_test.get repository information'
),
)
yield api.test(
'dangerous_test_commands',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
), clobber=False,),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'package': 'ordinary_package1.far',
'test_command': 'suspicious command'
}, {
'package': 'ordinary_package2.far',
'test_command': 'test run fuchsia-pkg://fuchsia.com/ordinary_package2#meta/ordinary_package2.cmx; suspicious command'
}, {
'package': 'ordinary_package3.far',
'test_command': 'test run fuchsia-pkg://fuchsia.com/ordinary_package3#meta/ordinary_package3.cmx $(suspicious command)'
}, {
'package': 'ordinary_package4.far',
'test_command': 'test run fuchsia-pkg://fuchsia.com/ordinary_package4#meta/ordinary_package4.cmx `suspicious command`'
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text('''
- package: ordinary_package1.far
test_command: suspicious command
- package: ordinary_package2.far
test_command: test run fuchsia-pkg://fuchsia.com/ordinary_package2#meta/ordinary_package2.cmx; suspicious command
- package: ordinary_package3.far
test_command: test run fuchsia-pkg://fuchsia.com/ordinary_package3#meta/ordinary_package3.cmx $(suspicious command)
- package: ordinary_package4.far
test_command: test run fuchsia-pkg://fuchsia.com/ordinary_package4#meta/ordinary_package4.cmx `suspicious command`''')
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'run_with_dart_aot_behavior',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
),
clobber=False,
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'test_command':
'test run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm',
'run_with_dart_aot':
'true',
'packages': [
'dart-aot-runner-integration-test-0.far',
'dart_aot_runner-0.far',
'gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far'
]
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
'''# This is a comment.
- test_command: test run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm
run_with_dart_aot: true
packages:
- dart-aot-runner-integration-test-0.far
- dart_aot_runner-0.far
- gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far'''
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
ffx_repo_list_step_data(
'run FEMU test on x64.run dart-jit-runner-integration-test.get repository information'
),
api.step_data(
'run FEMU test on x64.run dart-jit-runner-integration-test.ffx repository publish dart_aot_runner-0.far',
retcode=0
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'invalid_emulator_arch',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
emulator_arch='x32'
),
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'package':
'v2_test-123.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm'
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
"""# This is a comment.
- package: v2_test-123.far
test_command: test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm"""
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
ffx_repo_list_step_data(
'run FEMU test on x64.run v2_test.get repository information'
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'run_on_test_specified_arch',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
),
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'test_command':
'test run fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm',
'packages': [
'dart-aot-runner-integration-test-0.far',
'dart_aot_runner-0.far',
], 'emulator_arch': [
'x64',
'arm64',
]
}, {
'test_command':
'test run fuchsia-pkg://fuchsia.com/only-run-on-arm64#meta/only-run-on-arm64',
'packages': ['dart_aot_runner-0.far'], 'emulator_arch': ['arm64']
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
'''# This is a comment.
- test_command: test run fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm
run_with_dart_aot: true
packages:
- dart-aot-runner-integration-test-0.far
- dart_aot_runner-0.far
emulator_arch:
- x64
- arm64
- test_command: test run fuchsia-pkg://fuchsia.com/only-run-on-arm64#meta/only-run-on-arm64',
packages:
- dart_aot_runner-0.far'
emulator_arch:
- arm64'''
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
ffx_repo_list_step_data(
'run FEMU test on x64.run run-on-both-arch.get repository information'
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'arm64_emulator_arch',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
emulator_arch='arm64'
),
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'package':
'v2_test-123.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm',
'emulator_arch': ['arm64']
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
"""# This is a comment.
- package: v2_test-123.far
test_command: test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm
emulator_arch:
- arm64"""
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
ffx_repo_list_step_data(
'run FEMU test on arm64.run v2_test.get repository information'
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'start_femu_with_cso',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
enable_cso=True,
),
clobber=False,
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'package':
'v2_test-123.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm -- --gtest_filter=-ParagraphTest.*:a.b'
}, {
'package':
'v1_test_component-321.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v1_test_component#meta/v1_test_component.cmx -ParagraphTest.*:a.b'
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
'''# This is a comment.
- package: v2_test-123.far
test_command: test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm -- --gtest_filter=-ParagraphTest.*:a.b
# Legacy cfv1 test
- package: v1_test_component-321.far
test_command: test run fuchsia-pkg://fuchsia.com/v1_test_component#meta/v1_test_component.cmx -ParagraphTest.*:a.b'''
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
*fail_step_with_retries(
'run FEMU test on x64.run v2_test', 'launch x64 emulator'
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'start_femu_with_override_pbm',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
enable_cso=True,
gclient_variables={
"download_fuchsia_sdk":
True,
"fuchsia_sdk_path":
"development/8787238722685733041/sdk/linux-amd64/core.tar.gz",
"product_bundles_path":
"development/8787238722685733041/sdk/product_bundles.json"
},
),
clobber=False,
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'package':
'v2_test-123.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm -- --gtest_filter=-ParagraphTest.*:a.b'
}, {
'package':
'v1_test_component-321.far',
'test_command':
'test run fuchsia-pkg://fuchsia.com/v1_test_component#meta/v1_test_component.cmx -ParagraphTest.*:a.b'
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
'''# This is a comment.
- package: v2_test-123.far
test_command: test run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm -- --gtest_filter=-ParagraphTest.*:a.b
# Legacy cfv1 test
- package: v1_test_component-321.far
test_command: test run fuchsia-pkg://fuchsia.com/v1_test_component#meta/v1_test_component.cmx -ParagraphTest.*:a.b'''
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
*fail_step_with_retries(
'run FEMU test on x64.run v2_test', 'launch x64 emulator'
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)
yield api.test(
'run_test_with_retry',
api.properties(
InputProperties(
goma_jobs='1024',
build_fuchsia=True,
test_fuchsia=True,
git_url='https://github.com/flutter/engine',
git_ref='refs/pull/1/head',
clobber=False,
),
),
api.step_data(
'retrieve list of test suites.parse',
api.json.output([{
'test_command':
'test run fuchsia-pkg://fuchsia.com/run-on-x64#meta/run-on-x64.cm',
'packages': [
'dart-aot-runner-integration-test-0.far',
'dart_aot_runner-0.far',
], 'emulator_arch': ['x64',]
}])
),
api.step_data(
'retrieve list of test suites.read',
api.file.read_text(
'''# This is a comment.
- test_command: test run fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm
run_with_dart_aot: true
packages:
- dart-aot-runner-integration-test-0.far
- dart_aot_runner-0.far
emulator_arch:
- x64'''
)
),
api.step_data(
'read manifest',
api.file.read_json({'id': '0.20200101.0.1'}),
),
api.step_data(
'run FEMU test on x64.run run-on-x64.launch x64 emulator', retcode=1
),
api.step_data(
'run FEMU test on x64.run run-on-x64 (attempt #2).launch x64 emulator',
retcode=1
),
ffx_repo_list_step_data(
'run FEMU test on x64.run run-on-x64 (attempt #3).get repository information'
),
api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
)