#!/bin/bash
# Copyright 2018 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.

### build, copy to and run a test on target

## usage: fx run-test-component [-t|--test <test_name>] [-d|--device <device>] PKG_TARGET
## Builds the specified test package (e.g., appmgr_integration_tests), copies it to the
## target, and executes it.
##
## If using this command, please run 'fx build' again before paving your device
## because 'fx build updates' used by this script does not build images so it
## can leave paver in weird state.
## Arguments:
##   -t|--test    Test to run. If not specified, it will run all tests in PKG_TARGET.
##   -d|--device  Target device.

set -e

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/vars.sh
fx-config-read

function usage {
  fx-command-help run-test-component
}


function main {

  fx-standard-switches "$@"
  set -- "${FX_ARGV[@]}"

  test=""
  target=""
  device_args=()

  while (($#)); do
    case $1 in
      -t|--test)
        shift  # name
        if [[ -z "$1" ]]; then
          echo "Missing parameter: <test_name>" >&2
          usage
          exit 1
        fi
        test="$1"
        ;;
      -d|--device)
        shift  # name
        if [[ -z "$1" ]]; then
          echo "Missing parameter: <device>" >&2
          fx-command-help
          exit 1
        fi
        device_args=("-d" "$1")
        ;;
      *)
        if [[ "$target" == "" ]]; then
          target="$1"
        else
          usage
          exit 1
        fi
        ;;
    esac
    shift  # value
  done

  if [[ $target == "" ]]; then
    usage
    return 1
  fi

  if [[ -z "$(pgrep -f "amber-files/repository")" ]]; then
    echo "WARNING: It looks like amber-srv is not running."
    echo "WARNING: You probably need to start \"fx serve-updates\""
    exit 1
  fi

  echo -e "Building ${target}"
  # build all packages as there is no way to only build one and push it to
  # update repository.
  fx-command-run build updates
  echo -e "\nPush package to device"
  fx-command-run push-package "${device_args[@]}" "${target}"

  if [[ "${test}" == "" ]]; then
    echo -e "\nRun all tests in ${target}"
    fx-command-run shell "${device_args[@]}" runtests "pkgfs/packages/${target}/0/test"
  else
    url="fuchsia-pkg://fuchsia.com/${target}#meta/${test}.cmx"
    echo -e "\nRunning ${url}"
    fx-command-run shell "${device_args[@]}" run_test_component "${url}"
  fi
}


main "$@"
