blob: 855bc1149c3717d6e773fc06bd0b2ef86344863d [file] [log] [blame]
# Copyright 2018 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.
import logging
import os
import sys
from aemu_target import AemuTarget
from device_target import DeviceTarget
from qemu_target import QemuTarget
from common import GetHostArchFromPlatform
def AddCommonArgs(arg_parser):
"""Adds command line arguments to |arg_parser| for options which are shared
across test and executable target types.
Args:
arg_parser: an ArgumentParser object."""
package_args = arg_parser.add_argument_group('package', 'Fuchsia Packages')
package_args.add_argument(
'--package',
action='append',
help='Paths of the packages to install, including '
'all dependencies.')
package_args.add_argument(
'--package-name',
help='Name of the package to execute, defined in ' + 'package metadata.')
common_args = arg_parser.add_argument_group('common', 'Common arguments')
common_args.add_argument(
'--output-directory',
type=os.path.realpath,
default=None,
help=('Path to the directory in which build files are located. '))
common_args.add_argument(
'--target-cpu',
default=GetHostArchFromPlatform(),
help=('GN target_cpu setting for the build. Defaults to the same '
'architecture as host cpu.'))
common_args.add_argument('--target-staging-path',
help='target path under which to stage packages '
'during deployment.', default='/data')
common_args.add_argument('--device', default=None,
choices=['aemu','qemu','device'],
help='Choose to run on aemu|qemu|device. ' +
'By default, Fuchsia will run in QEMU.')
common_args.add_argument('-d', action='store_const', dest='device',
const='device',
help='Run on device instead of emulator.')
common_args.add_argument('--host', help='The IP of the target device. ' +
'Optional.')
common_args.add_argument('--node-name',
help='The node-name of the device to boot or deploy '
'to. Optional, will use the first discovered '
'device if omitted.')
common_args.add_argument('--port', '-p', type=int, default=22,
help='The port of the SSH service running on the ' +
'device. Optional.')
common_args.add_argument('--ssh-config', '-F',
help='The path to the SSH configuration used for '
'connecting to the target device.')
common_args.add_argument('--fuchsia-out-dir',
help='Path to a Fuchsia build output directory. '
'Equivalent to setting --ssh_config and '
'---os-check=ignore')
common_args.add_argument('--runner-logs-dir',
help='Directory to write test runner logs to.')
common_args.add_argument('--system-log-file',
help='File to write system logs to. Specify - to '
'log to stdout.')
common_args.add_argument('--exclude-system-logs',
action='store_false',
dest='include_system_logs',
help='Do not show system log data.')
common_args.add_argument('--verbose', '-v', default=False,
action='store_true',
help='Enable debug-level logging.')
common_args.add_argument(
'--qemu-cpu-cores',
type=int,
default=4,
help='Sets the number of CPU cores to provide if launching in a VM.')
common_args.add_argument('--memory', type=int, default=2048,
help='Sets the RAM size (MB) if launching in a VM'),
common_args.add_argument(
'--allow-no-kvm',
action='store_false',
dest='require_kvm',
default=True,
help='Do not require KVM acceleration for emulators.')
common_args.add_argument(
'--os_check', choices=['check', 'update', 'ignore'],
default='update',
help='Sets the OS version enforcement policy. If \'check\', then the '
'deployment process will halt if the target\'s version doesn\'t '
'match. If \'update\', then the target device will automatically '
'be repaved. If \'ignore\', then the OS version won\'t be checked.')
aemu_args = arg_parser.add_argument_group('aemu', 'AEMU Arguments')
aemu_args.add_argument(
'--enable-graphics',
action='store_true',
default=False,
help='Start AEMU with graphics instead of headless.')
aemu_args.add_argument(
'--hardware-gpu',
action='store_true',
default=False,
help='Use local GPU hardware instead of Swiftshader.')
def ConfigureLogging(args):
"""Configures the logging level based on command line |args|."""
logging.basicConfig(level=(logging.DEBUG if args.verbose else logging.INFO),
format='%(asctime)s:%(levelname)s:%(name)s:%(message)s')
# The test server spawner is too noisy with INFO level logging, so tweak
# its verbosity a bit by adjusting its logging level.
logging.getLogger('chrome_test_server_spawner').setLevel(
logging.DEBUG if args.verbose else logging.WARN)
# Verbose SCP output can be useful at times but oftentimes is just too noisy.
# Only enable it if -vv is passed.
logging.getLogger('ssh').setLevel(
logging.DEBUG if args.verbose else logging.WARN)
def GetDeploymentTargetForArgs(args):
"""Constructs a deployment target object using parameters taken from
command line arguments."""
if args.system_log_file == '-':
system_log_file = sys.stdout
elif args.system_log_file:
system_log_file = open(args.system_log_file, 'w')
else:
system_log_file = None
# Allow fuchsia to run on emulator if device not explicitly chosen.
# AEMU is the default emulator for x64 Fuchsia, and QEMU for others.
if not args.device:
if args.target_cpu == 'x64':
args.device = 'aemu'
else:
args.device = 'qemu'
target_args = { 'output_dir':args.output_directory,
'target_cpu':args.target_cpu,
'system_log_file':system_log_file }
if args.device == 'device':
target_args.update({ 'host':args.host,
'node_name':args.node_name,
'port':args.port,
'ssh_config':args.ssh_config,
'fuchsia_out_dir':args.fuchsia_out_dir,
'os_check':args.os_check })
return DeviceTarget(**target_args)
else:
target_args.update({
'cpu_cores': args.qemu_cpu_cores,
'require_kvm': args.require_kvm,
'emu_type': args.device,
'ram_size_mb': args.memory
})
if args.device == 'qemu':
return QemuTarget(**target_args)
else:
target_args.update({
'enable_graphics': args.enable_graphics,
'hardware_gpu': args.hardware_gpu
})
return AemuTarget(**target_args)