#!/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:
## PKG-592: 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\`. Read more at:\n  - https://fuchsia.dev/fuchsia-src/development/testing/running_tests_as_components#converting_from_run-test_or_run-host-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}" | paste -sd ',' -)"

  if [[ -z "${package_urls}" ]]; 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 -t "${package_urls}" "$@" 2>&1 \
    | fx-command-run symbolize
}

main "$@"
