| # 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) |