128 lines
4.9 KiB
Python
Executable File
128 lines
4.9 KiB
Python
Executable File
#!/usr/bin/env vpython3
|
|
# Copyright 2022 The Chromium Authors
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
"""Implements commands for running tests E2E on a Fuchsia device."""
|
|
|
|
import argparse
|
|
import sys
|
|
import tempfile
|
|
|
|
from contextlib import ExitStack
|
|
from typing import List
|
|
|
|
from common import register_common_args, register_device_args, \
|
|
register_log_args, resolve_packages, run_ffx_command, \
|
|
set_ffx_isolate_dir
|
|
from compatible_utils import running_unattended
|
|
from ffx_integration import ScopedFfxConfig, test_connection
|
|
from flash_device import register_update_args, update
|
|
from log_manager import LogManager, start_system_log
|
|
from publish_package import publish_packages, register_package_args
|
|
from run_blink_test import BlinkTestRunner
|
|
from run_executable_test import create_executable_test_runner, \
|
|
register_executable_test_args
|
|
from run_telemetry_test import TelemetryTestRunner
|
|
from run_webpage_test import WebpageTestRunner
|
|
from serve_repo import register_serve_args, serve_repository
|
|
from start_emulator import create_emulator_from_args, register_emulator_args
|
|
from test_runner import TestRunner
|
|
from ermine_ctl import ErmineCtl
|
|
|
|
|
|
def _get_test_runner(runner_args: argparse.Namespace,
|
|
test_args: List[str]) -> TestRunner:
|
|
"""Initialize a suitable TestRunner class."""
|
|
|
|
if runner_args.test_type == 'blink':
|
|
return BlinkTestRunner(runner_args.out_dir, test_args,
|
|
runner_args.target_id)
|
|
if runner_args.test_type in ['gpu', 'perf']:
|
|
return TelemetryTestRunner(runner_args.test_type, runner_args.out_dir,
|
|
test_args, runner_args.target_id)
|
|
if runner_args.test_type in ['webpage']:
|
|
return WebpageTestRunner(runner_args.out_dir, test_args,
|
|
runner_args.target_id)
|
|
return create_executable_test_runner(runner_args, test_args)
|
|
|
|
|
|
def main():
|
|
"""E2E method for installing packages and running a test."""
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
'test_type',
|
|
help='The type of test to run. Options include \'blink\', \'gpu\', '
|
|
'or in the case of executable tests, the test name.')
|
|
parser.add_argument('--device',
|
|
'-d',
|
|
action='store_true',
|
|
default=False,
|
|
help='Use an existing device.')
|
|
|
|
# Register arguments
|
|
register_common_args(parser)
|
|
register_device_args(parser)
|
|
register_emulator_args(parser)
|
|
register_executable_test_args(parser)
|
|
register_update_args(parser, default_os_check='ignore', default_pave=False)
|
|
register_log_args(parser)
|
|
register_package_args(parser, allow_temp_repo=True)
|
|
register_serve_args(parser)
|
|
|
|
# Treat unrecognized arguments as test specific arguments.
|
|
runner_args, test_args = parser.parse_known_args()
|
|
|
|
if not runner_args.out_dir:
|
|
raise ValueError('--out-dir must be specified.')
|
|
|
|
if runner_args.target_id:
|
|
runner_args.device = True
|
|
|
|
with ExitStack() as stack:
|
|
if running_unattended():
|
|
set_ffx_isolate_dir(
|
|
stack.enter_context(tempfile.TemporaryDirectory()))
|
|
run_ffx_command(('daemon', 'stop'), check=False)
|
|
if running_unattended():
|
|
stack.enter_context(
|
|
ScopedFfxConfig('repository.server.listen', '"[::]:0"'))
|
|
log_manager = stack.enter_context(LogManager(runner_args.logs_dir))
|
|
if runner_args.device:
|
|
update(runner_args.system_image_dir, runner_args.os_check,
|
|
runner_args.target_id, runner_args.serial_num,
|
|
runner_args.pave)
|
|
else:
|
|
runner_args.target_id = stack.enter_context(
|
|
create_emulator_from_args(runner_args))
|
|
|
|
test_connection(runner_args.target_id)
|
|
|
|
test_runner = _get_test_runner(runner_args, test_args)
|
|
package_deps = test_runner.package_deps
|
|
|
|
if not runner_args.repo:
|
|
# Create a directory that serves as a temporary repository.
|
|
runner_args.repo = stack.enter_context(
|
|
tempfile.TemporaryDirectory())
|
|
|
|
publish_packages(package_deps.values(), runner_args.repo,
|
|
not runner_args.no_repo_init)
|
|
|
|
stack.enter_context(serve_repository(runner_args))
|
|
|
|
# Start system logging, after all possible restarts of the ffx daemon
|
|
# so that logging will not be interrupted.
|
|
start_system_log(log_manager, False, package_deps.values(),
|
|
('--since', 'now'), runner_args.target_id)
|
|
|
|
ermine = ErmineCtl(runner_args.target_id)
|
|
if ermine.exists:
|
|
ermine.take_to_shell()
|
|
|
|
resolve_packages(package_deps.keys(), runner_args.target_id)
|
|
return test_runner.run_test().returncode
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|