#!/bin/bash
# Copyright 2014 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# TODO(b:269503867): De-shell this utility.
# This script requires that you run build_packages first.

# Special because this can only run inside the chroot.
if [ ! -r /mnt/host/source/src/scripts/common.sh ]; then
  echo "Must run within chroot" >&2
  exit 1
fi
. /mnt/host/source/src/scripts/common.sh


# Flags
DEFINE_string board "${DEFAULT_BOARD}" \
  "Target board of DUT running the tests"
DEFINE_boolean smoke "${FLAGS_FALSE}" \
  "Run a minimal set of tests for sanity"
DEFINE_boolean commit "${FLAGS_FALSE}" \
  "Run the tests required to pass the Commit Queue"
DEFINE_boolean labqual "${FLAGS_FALSE}" \
  "Run the BVT tests required for lab qualification"
DEFINE_boolean debug "${FLAGS_FALSE}" \
  "Print commands that would've been run without doing anything"
DEFINE_boolean labqual_stable "${FLAGS_FALSE}" \
  "Run the BVT tests required for lab qualification using stable revamped labqual suite"

# These options only matter if we're using Servo, which only
# happens when --labqual or --labqual_stable is specified.
DEFINE_string servo_host "" \
  "When running servo tests, specifies the host running servod"
DEFINE_string servo_port "" \
  "When running servo tests, specifies the port for contacting servod"
# Free-form string to check against servod's reported servo type.
DEFINE_string servo_type "" \
  "When running servo tests, specifies the servo type"
# Free-form string to a file path for locally downloaded firmware tarball
# only applicable when --labqual_stable is specified.
# Ex: <dir>/firmware_from_source.tar.bz2
DEFINE_string firmware_path "" \
  "locally downloaded firmware file to run firmware flash tests through stable revamped labqual suite"

# Parse command line; die on errors
FLAGS_HELP="usage: $(basename "$0") [flags] <hostname-or-ipaddr>"
FLAGS "${@}" || exit 1
eval set -- "${FLAGS_ARGV}"
set -e

if [ -z "${FLAGS_board}" ]; then
  die "--board required"
fi

DEBUG=
if [ "${FLAGS_debug}" -eq "${FLAGS_TRUE}" ]; then
  DEBUG="echo"
fi

if [ $# -ne 1 ]; then
  die "Must specify exactly one DUT"
fi

DUT="$1"
OPTIONS=( --board="${FLAGS_board}" )
TESTS=( suite:{labqual,bvt-{inline,cq,perbuild,tast-cq}} )
GET_SERVO_TYPE_CMD=( "dut-control" "--value_only" )
TAST_SERVO_PARAMS=( "-var=servo=" )

SUITE_CHECK=0
if [ "${FLAGS_smoke}" -eq "${FLAGS_TRUE}" ]; then
  SUITE_CHECK=$(( SUITE_CHECK + 1 ))
  TESTS=( suite:bvt-inline )
fi
if [ "${FLAGS_commit}" -eq "${FLAGS_TRUE}" ]; then
  SUITE_CHECK=$(( SUITE_CHECK + 1 ))
  TESTS=( suite:bvt-{inline,cq,tast-cq} )
fi
if [ "${FLAGS_labqual}" -eq "${FLAGS_TRUE}" ] || [ "${FLAGS_labqual_stable}" -eq "${FLAGS_TRUE}" ]; then
  SUITE_CHECK=$(( SUITE_CHECK + 1 ))
  TESTS=( suite:labqual)

  # Handle Servo options for the lab qualification tests.
  if [ "${FLAGS_labqual_stable}" -eq "${FLAGS_TRUE}" ] && [  -z "${FLAGS_servo_host}" -o  -z "${FLAGS_servo_port}" ]; then
    die "servo host and port must be specified for labqual stable tests"
  fi
  if [ -n "${FLAGS_servo_host}" ]; then
    SERVO_ARGS="--args=servo_host=${FLAGS_servo_host}"
    if [ -n "${FLAGS_servo_port}" ]; then
      SERVO_ARGS="${SERVO_ARGS} servo_port=${FLAGS_servo_port}"
      TAST_SERVO_PARAMS+="${FLAGS_servo_host}:${FLAGS_servo_port}"
    fi
    OPTIONS+=( "${SERVO_ARGS}" )
  elif [ -n "${FLAGS_servo_port}" ]; then
    OPTIONS+=( "--args=servo_port=${FLAGS_servo_port}" )
  fi

  if [ -n "${FLAGS_servo_type}" ]; then
    if [ -n "${FLAGS_servo_host}" ]; then
      GET_SERVO_TYPE_CMD+=( "--host=${FLAGS_servo_host}" )
    fi
    if [ -n "${FLAGS_servo_port}" ]; then
      GET_SERVO_TYPE_CMD+=( "--port=${FLAGS_servo_port}" )
    fi
    GET_SERVO_TYPE_CMD+=( "servo_type" )

    DETECTED_SERVO_TYPE=""
    if [ -n "${DEBUG}" ]; then
      echo "${GET_SERVO_TYPE_CMD[@]}"
    else
      DETECTED_SERVO_TYPE=$("${GET_SERVO_TYPE_CMD[@]}")
    fi
    if [ -z "${DEBUG}" ]; then
      if [ "${DETECTED_SERVO_TYPE}" != "${FLAGS_servo_type}" ]; then
        die "detected servo type ${DETECTED_SERVO_TYPE} does not match expected servo type ${FLAGS_servo_type}"
      fi
    fi
  fi
fi

if [ "${FLAGS_labqual_stable}" -eq "${FLAGS_TRUE}" ] && [ -n "${FLAGS_firmware_path}" ]; then
  TAST_SERVO_PARAMS+=" -var=firmware.localFirmwarePath=${FLAGS_firmware_path}"
fi

if [ "${SUITE_CHECK}" -gt 1 ]; then
  die "can specify at most one of --smoke --commit or --labqual"
fi

${DEBUG} test_that "${OPTIONS[@]}" "${DUT}" "${TESTS[@]}"
AUTOTEST_STATUS=$?

TAST_STATUS=0
if [ "${FLAGS_labqual}" -eq "${FLAGS_TRUE}" ]; then
  # Run a subset of Tast tests for qualifying a model before lab deployment.
  ${DEBUG} tast -verbose run -build=false "${DUT}" '("group:labqual")'
  TAST_STATUS=$?
fi
if [ "${FLAGS_labqual_stable}" -eq "${FLAGS_TRUE}" ]; then
  # Run a lanqual_stable Tast tests for qualifying a model before lab deployment.
  ${DEBUG} tast -verbose run -build=false "${TAST_SERVO_PARAMS}" "${DUT}" '("group:labqual_stable")'
  TAST_STATUS=$?
fi

if [ "${AUTOTEST_STATUS}" -ne 0 ] || [ "${TAST_STATUS}" -ne 0 ]; then
  die "Autotest exited with ${AUTOTEST_STATUS}; Tast exited with ${TAST_STATUS}"
fi
