#!/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
##     --[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.
## -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[@]}" "$@"
