#!/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.
## -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 $?
fx-config-read

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')"

_args=(
  "${PREBUILT_DART_DIR}/bin/dart"
  "--enable-experiment=non-nullable"
  "--no-sound-null-safety"
  "--packages=${FUCHSIA_DIR}/scripts/fxtest/package_config.json"
  "${FUCHSIA_DIR}/scripts/fxtest/bin/main.dart"
)

# 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

exec "${_args[@]}" "$@"
