#!/bin/bash
# Copyright 2017 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
#### DEPRECATED
### build a test package and run on target.

## usage: fx run-test PKG_TARGET [runtests flags]
##
## This command is being deprecated in favor of `fx test`. Read more at:
##   https://fuchsia.dev/fuchsia-src/development/testing/running_tests_as_components#converting_from_run-test_or_run-host-tests
##
## Builds the update package group, updates the device as necessary, and then
## executes the test as specified by [runtests flags] (or all tests in
## PKG_TARGET if no flags are given).
##
## Arguments:
##   PKG_TARGET    A package name as appears in `fx list-packages`
##   All later arguments are passed directly to `runtests`, see `fx run-test -h` for all flags.
##
## Known Bugs:
## fxbug.dev/22526: After run-test, performing a pave without executing 'fx build'
## results in "appmgr not started after 20s", as this command only builds new
## packages, it avoids creating new paver artifacts, as such, a pave without a
## fresh build produces a system with inconsistent state.

set -e

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/updates.sh || exit $?
fx-config-read

# Determine if the given package name ($1) is in the base package list
function is-in-base {
  fx-command-run list-packages --base "^$1$" > /dev/null
}

function main {
  if [[ $# -lt 1 ]]; then
    fx-command-help
    exit 1
  fi

  case "$1" in
  -h|--help)
    fx-command-help
    echo -e >&2 "\nRuntests help follows:"
    fx-command-run shell runtests -h
    exit 0
    ;;
  -*)
    fx-error "first given argument \"$1\" looks like a flag, a package name must be supplied before all flags."
    exit 1
    ;;
  *)
    target="$1"
    shift
  esac

  fx-warn "This command is being deprecated in favor of \`fx test\`.\n         Usage: fx test <TEST_NAME>\n         For more information, visit: https://fuchsia.dev/fuchsia-src/development/testing/run_fuchsia_tests\n"

  local test_specs="$(fx-command-run test --exact --info "${target}")"
  if [[ -z "${test_specs}" ]]; then
    fx-error "Cannot find an exact match in test specs for \"${target}\". " \
      "Try using \`fx test ${target}\` if you need partial matches."
    exit 3
  fi
  # concatenate all package_urls found in a comma-separated list
  local package_urls=( $(sed -n 's/^package_url: \(.*\)/\1/p' <<< "${test_specs}") )

  if [[ ${#package_urls[@]} -eq 0 ]]; then
    fx-error "Test spec for \"${target}\" doesn't have a Fuchsia component URI. " \
      "Try running it using \`fx test ${target}\` instead."
    exit 3
  fi

  check-for-amber-server || return 1

  echo >&2 "Building ..."
  # build all packages as there is no way to only build one and push it to
  # update repository.
  fx-command-run build updates

  if ! fx-command-run update-if-in-base "${target}"; then
    return 2
  fi

  echo >&2 "Updating ${target} cache on device"
  if ! fx-command-run push-package "${target}"; then
    return 2
  fi

  fx-command-run shell runtests "${package_urls[@]}" "$@" 2>&1 \
    | fx-command-run symbolize
}

main "$@"
