| // Copyright 2020 The Fuchsia 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 'package:args/args.dart'; |
| import 'package:fxutils/fxutils.dart'; |
| |
| /// Test-friendly wrapper so unit tests can use `fxTestArgParser` without |
| /// having its environment-aware print statements blow up. |
| String getFriendlyBuildDir() { |
| var buildDir = '//out/default'; |
| try { |
| buildDir = FxEnv( |
| envReader: EnvReader.fromEnvironment(), |
| ).userFriendlyOutputDir ?? |
| buildDir; |
| |
| // ignore: avoid_catching_errors |
| } on RangeError { |
| // pass |
| } |
| return buildDir; |
| } |
| |
| final ArgParser fxTestArgParser = ArgParser() |
| ..addFlag('help', abbr: 'h', defaultsTo: false, negatable: false) |
| ..addFlag('host', |
| defaultsTo: false, |
| negatable: false, |
| help: 'only run host tests. The opposite of `--device`') |
| ..addFlag('device', |
| abbr: 'd', |
| defaultsTo: false, |
| negatable: false, |
| help: 'only run device tests. The opposite of `--host`') |
| ..addMultiOption('package', |
| abbr: 'p', |
| help: 'match tests against their Fuchsia package Name', |
| splitCommas: false) |
| ..addMultiOption('component', |
| abbr: 'c', |
| help: '''match tests against their Fuchsia component Name. When |
| --package is also specified, results are filtered both by package |
| and component.''', |
| splitCommas: false) |
| ..addMultiOption('and', |
| abbr: 'a', help: '''add additional requirements to the preceding |
| `testName` filter''') |
| ..addFlag('printtests', |
| defaultsTo: false, |
| negatable: false, |
| help: 'print the contents of ' |
| '`${getFriendlyBuildDir()}/tests.json`') |
| ..addFlag('build', |
| defaultsTo: true, |
| negatable: true, |
| help: 'invoke `fx build` before running the test suite') |
| ..addFlag('restrict-logs', |
| defaultsTo: true, |
| negatable: true, |
| help: 'pass a flag of the same name to the component test ' |
| 'runner') |
| ..addFlag('updateifinbase', |
| defaultsTo: true, |
| negatable: true, |
| help: 'invoke `fx update-if-in-base` before running device tests') |
| ..addFlag('use-package-hash', |
| defaultsTo: true, |
| negatable: true, |
| help: '''use the package Merkle root hash from the build artifacts |
| when executing device tests''') |
| ..addFlag('info', |
| defaultsTo: false, |
| negatable: false, |
| help: 'print the test specification in key:value format, ' |
| 'and exits') |
| ..addFlag('random', |
| abbr: 'r', |
| defaultsTo: false, |
| negatable: false, |
| help: 'randomize test execution order') |
| ..addOption('fuzzy', |
| defaultsTo: '3', |
| help: 'the Levenshtein distance threshold to use ' |
| 'when generating suggestions') |
| ..addFlag('dry', |
| defaultsTo: false, negatable: false, help: 'do not invoke any tests') |
| ..addFlag('fail', |
| abbr: 'f', |
| defaultsTo: false, |
| negatable: false, |
| help: 'halt test suite execution after the first failed test suite') |
| ..addFlag('log', |
| defaultsTo: false, |
| negatable: true, |
| help: '''emit all output from all tests to a file. Turned on |
| when running real tests unless `--no-log` is passed.''') |
| ..addOption('logpath', |
| defaultsTo: null, |
| help: '''if passed and if --no-log is not passed, customizes the |
| destination of the log artifact. |
| |
| Defaults to a timestamped file at the root of ${getFriendlyBuildDir()}.''') |
| ..addOption('limit', |
| defaultsTo: null, help: 'End test suite execution after N tests') |
| ..addOption('slow', |
| defaultsTo: '2', |
| abbr: 's', |
| help: '''when set to a non-zero value, triggers output for any test that |
| takes longer than N seconds to execute |
| |
| Note: This has no impact if the -o flag is also set. |
| Note: The -s flag used to be an abbreviation for --simple.''') |
| ..addOption('realm', |
| abbr: 'R', |
| defaultsTo: null, |
| help: '''run tests in a named realm instead of a |
| randomized one.''') |
| ..addOption('min-severity-logs', |
| help: '''filter log output to only messages with this for device tests. |
| Valid severities: TRACE, DEBUG, INFO, WARN, ERROR, FATAL.''') |
| ..addFlag('exact', |
| defaultsTo: false, help: 'do not perform any fuzzy-matching on tests') |
| ..addFlag('e2e', |
| defaultsTo: false, |
| help: '''allow execution of host tests that require a connected device |
| or emulator, such as end-to-end tests.''') |
| ..addFlag('only-e2e', |
| defaultsTo: false, |
| help: 'skip all non-e2e tests. The `--e2e` flag is redundant ' |
| 'when passing this flag.') |
| ..addFlag('skipped', |
| defaultsTo: false, |
| negatable: false, |
| help: '''print a debug statement about each skipped test. |
| |
| Note: The old `-s` abbreviation now applies to `--simple`.''') |
| ..addFlag('simple', |
| defaultsTo: false, |
| negatable: false, |
| help: 'remove any color or decoration from output') |
| ..addFlag('output', |
| abbr: 'o', |
| defaultsTo: false, |
| negatable: false, |
| help: '''display the output from passing tests. Test arguments |
| may be needed, see 'Print help for a test' example below.''') |
| ..addFlag('silenceunsupported', |
| abbr: 'u', |
| defaultsTo: false, |
| negatable: false, |
| help: '''reduce unsupported tests to a warning and continue |
| executing. This is dangerous outside of the local development |
| cycle, as "unsupported" tests are likely a problem with this |
| command and not the tests.''') |
| ..addMultiOption('test-filter', |
| help: '''run specific test cases in v2 suite. Can be specified multiple |
| times to pass in multiple patterns. |
| example: --test-filter glob1 --test-filter glob2''', |
| splitCommas: false) |
| ..addOption('count', |
| defaultsTo: null, |
| help: '''number of times to run the test. By default run 1 time. If |
| an iteration of test times out, no further iterations will |
| be executed.''') |
| ..addOption('parallel', |
| defaultsTo: null, |
| help: '''maximum number of test cases to run in parallel. Overrides any |
| parallel option set in test specs.''') |
| ..addFlag('also-run-disabled-tests', |
| defaultsTo: false, |
| help: '''run tests that have been marked disabled/ignored by the test |
| author.''') |
| ..addFlag('use-run-test-suite', |
| defaultsTo: false, |
| help: '''fallback to using run-test-suite instead of ffx test. This option |
| is a temporary escape hatch.''') |
| ..addOption('timeout', |
| defaultsTo: '0', |
| help: '''test timeout in seconds. The test is killed if not completed when |
| the timeout has elapsed.''') |
| ..addFlag('verbose', abbr: 'v', defaultsTo: false, negatable: false); |