blob: ff9a904479bac1720b531719784c6f36c8da77fa [file] [log] [blame]
#!/bin/bash
# Copyright 2019 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.
#### CATEGORY=Run, inspect and debug
### Entry point for all Fuchsia tests (host, target and end-to-end)
## Usage: fx test [testName ...]
##
## Options:
## -h, --help
## --host If true, only runs host tests. The opposite of `--device`
## -d, --device If true, only runs device tests. The opposite of `--host`
## -p, --package Matches tests against their Fuchsia package Name
## -c, --component Matches tests against their Fuchsia component Name. When
## --package is also specified, results are filtered both by package
## and component.
## -a, --and When present, adds additional requirements to the preceding
## `testName` filter
## --printtests If true, prints the contents of `//out/default/tests.json`
## --[no-]build If true, invokes `fx build` before running the test suite
## (defaults to on)
## --[no-]restrict-logs If true, passes a flag of the same name to the component test runner
## (defaults to on)
## --[no-]updateifinbase If true, invokes `fx update-if-in-base` before running device tests
## (defaults to on)
## --[no-]use-package-hash If true, uses the package Merkle root hash from the build artifacts when executing device tests
## (defaults to on)
## --info If true, prints the test specification in key:value format, and exits
## -r, --random If true, randomizes test execution order
## --fuzzy The Levenshtein distance threshold to use when generating suggestions
## (defaults to "3")
## --dry If true, does not invoke any tests
## -f, --fail If true, halts test suite execution on the first failed test
## --[no-]log If true, emits all output from all tests to a file. Turned on
## when running real tests unless `--no-log` is passed.
## --logpath 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 //out/default.
## --limit If passed, ends test suite execution after N tests
## -s, --slow 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.
## (defaults to "2")
## -R, --realm If passed, runs the tests in a named realm instead of a
## randomized one.
## --min-severity-logs Filters log output to only messages with this for device tests.
## Valid severities: TRACE, DEBUG, INFO, WARN, ERROR, FATAL.
## --[no-]exact If true, does not perform any fuzzy-matching on tests
## --[no-]e2e If true, allows the execution of host tests that require a connected device or emulator, such as end-to-end tests.
## --[no-]only-e2e If true, skips all non-e2e tests. The `--e2e` flag is redundant when passing this flag.
## --skipped If true, prints a debug statement about each skipped test.
##
## Note: The old `-s` abbreviation now applies to `--simple`.
## --simple If true, removes any color or decoration from output
## -o, --output If true, also displays the output from passing tests
## -u, --silenceunsupported If true, will 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.
## --test-filter Runs specific test cases in v2 suite. Run
## 'fx shell run-test-suite --help' for more info about this flag.
## --count Number of times to run the test. Run
## 'fx shell run-test-suite --help' for more info about this flag.
## --[no-]also-run-disabled-tests Whether to also run tests that have been marked disabled/ignored by
## the test author. Run 'fx shell run-test-suite --help' for more info about this
## flag.
## --timeout Test timeout in seconds. Run 'fx shell run-test-suite --help' or
## 'fx shell run-test-component --help' for more info about this flag.
## -v, --verbose
##
## Examples:
##
## - Execute all tests
## fx test
##
## - Execute the test component available at this URL
## fx test fuchsia-pkg://fuchsia.com/myPackageName/#meta/componentName.cmx
##
## - Execute the test whose package URL's `package-name` component matches
## the value. Runs all tests contained in this package.
## fx test myPackageName
##
## - Execute the test whose package URL's `resource-path` component matches
## the value. Runs only that test out of its containing package.
## fx test componentName
##
## - Execute all tests at and below this path (usually host tests)
## fx test //subtree/path
##
## - Multiple test names can be supplied in the same invocation, e.g.:
## fx test //subtree/path //another/path fuchsia-pkg://...
##
## The value(s) supplied for `testName` can be fully-formed Fuchsia Package URLs,
## Fuchsia package names, or Fuchsia-tree directories. Partial tree paths
## will execute all descendent tests.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/dart_utils.sh || exit $?
fx-config-read
# Device discovery and building missing symbolizer are slow operations that
# don't need to happen when the user requests specific operations, like help and
# info.
skip_slow_setup=false
for arg in "$@"; do
if [[ "$arg" == "--help" || "$arg" == "-h" || "$arg" == "--info" || "$arg" == "--dry" ]]; then
skip_slow_setup=true
break
fi
if [[ "$arg" == "--" ]]; then
break
fi
done
if ! $skip_slow_setup; then
# force build of required symbolizer host tools if they don't exist:
fx-command-run host-tool --print symbolizer > /dev/null
fx-command-run host-tool --print symbol-index > /dev/null
# initialize some variables required for E2E tests:
export FUCHSIA_DEVICE_ADDR="$(get-fuchsia-device-addr)"
if [[ "$FUCHSIA_DEVICE_ADDR" == "::1" && -z "$SL4F_HTTP_PORT" ]]; then
# Device addr is localhost, assume that means that ports were forwarded with
# fx serve-remote from a remote workstation/laptop with a device attached.
export SL4F_HTTP_PORT=9080
fi
port="$(get-device-ssh-port)"
if [[ -n "${port}" ]]; then
export FUCHSIA_SSH_PORT="${port}"
fi
FUCHSIA_SSH_KEY="$(get-ssh-privkey)" || exit $?
export FUCHSIA_SSH_KEY
export FUCHSIA_TEST_OUTDIR="${FUCHSIA_OUT_DIR}/test_out/$(date +'%F-%H:%M:%S')"
fi
args=()
# TODO(fxbug.dev/53267): Using tput colors is more reliable than letting Dart do its
# own terminal detection. Remove once Dart can do its own detection more
# robustly.
if [[ ! -t 1 ]] || ! tput colors >/dev/null 2>&1; then
args+=("--simple")
fi
run-dart-tool fxtest "${args[@]}" "$@"