#!/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 {
  grep "^$1$" "${FUCHSIA_BUILD_DIR}/base_packages.list" > /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 "$@"
