#!/bin/bash

# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Wrapper script around run_remote_tests.sh that knows how to find
# device test cells.

# --- BEGIN COMMON.SH BOILERPLATE ---
# Load common CrOS utilities.  Inside the chroot this file is installed in
# /usr/lib/crosutils.  Outside the chroot we find it relative to the script's
# location.
find_common_sh() {
  local common_paths=("$(dirname "$(readlink -f "$0")")/.." /usr/lib/crosutils)
  local path

  SCRIPT_ROOT="${common_paths[0]}"
  for path in "${common_paths[@]}"; do
    if [ -r "${path}/common.sh" ]; then
      SCRIPT_ROOT="${path}"
      break
    fi
  done
}

find_common_sh
. "${SCRIPT_ROOT}/common.sh" || exit 1
# --- END COMMON.SH BOILERPLATE ---

# Figure out the default chromelab server name.  In order for this to
# work correctly, you have to:
#
#  - Put the hostname into "scripts/.default_wifi_test_lab"
#  - Create an /etc/hosts entry in your chroot for that hostname
#    (if it isn't findable via DNS)
#  - Make sure you have created a wifi_testbed_${lab} file in the
#    ${autotest}/files/client/config/ directory
if [ -f "$GCLIENT_ROOT/src/scripts/.default_wifi_test_lab" ] ; then
  DEFAULT_LAB=`cat "$GCLIENT_ROOT/src/scripts/.default_wifi_test_lab"`
fi

# TODO(pstew) Since this is a wrapper script, we need to accept all
# arguments run_remote_tests does, plus a few more of our own.  This
# can lead to version skew issues

DEFINE_string args "" "Command line arguments for test, separated with comma" a
DEFINE_string board "" "The board for which you are building autotest"
DEFINE_string chroot "" "alternate chroot location" c
DEFINE_boolean cleanup ${FLAGS_FALSE} "Clean up temp directory"
DEFINE_string iterations "" "Iterations to run every top level test" i
DEFINE_boolean use_emerged ${FLAGS_FALSE} \
    "Force use of emerged autotest pacakges"
DEFINE_string autotest_dir "" "Use this prepackaged autotest dir"
DEFINE_string results_dir_root "" "alternate root results directory"
DEFINE_boolean verbose ${FLAGS_FALSE} "Show verbose autoserv output" v

# These flags are specific to run_wifi_tests
DEFINE_string cell "" "Cell number to perform test on"
DEFINE_string client "" "Host name or IP of device to perform test"
DEFINE_string lab "${DEFAULT_LAB}" "Lab machine to perform test on"
DEFINE_string url "" "URL to lab server config server"

FLAGS "$@" || exit 1

run_remote_flags=""
run_remote_args=${FLAGS_args}

append_flag () {
    local delim=''
    [ -n "${run_remote_flags}" ] && delim=' '
    run_remote_flags="${run_remote_flags}${delim}$*"
}

append_arg () {
    local delim=''
    [ -n "${run_remote_args}" ] && delim=' '
    run_remote_args="${run_remote_args}${delim}$*"
}

if [ -n "${FLAGS_board}" ]; then
  append_flag --board "'${FLAGS_board}'"
fi

if [ -n "${FLAGS_chroot}" ]; then
  append_flag --chroot "'${FLAGS_chroot}'"
fi

if [ "${FLAGS_cleanup}" -eq ${FLAGS_TRUE} ]; then
  append_flag --cleanup
fi

if [ -n "${FLAGS_iterations}" ]; then
  append_flag --iterations ${FLAGS_iterations}
fi

if [ "${FLAGS_use_emerged}" -eq ${FLAGS_TRUE} ]; then
  append_flag --use_emerged
fi

if [ -n "${FLAGS_autotest_dir}" ]; then
  append_flag --autotest_dir "'${FLAGS_autotest_dir}'"
fi

if [ -n "${FLAGS_results_dir_root}" ]; then
  append_flag --results_dir_root "'${FLAGS_results_dir_root}'"
fi

if [ "${FLAGS_verbose}" -eq ${FLAGS_TRUE} ]; then
  append_flag --verbose
fi

# Parse our local args
if [ -n "${FLAGS_lab}" ] ; then
  # Add a config file for the lab if one isn't already set
  if ! expr "${run_remote_args}" : '.*config_file=' >/dev/null; then
    append_arg "config_file=wifi_testbed_${FLAGS_lab}"
  fi
fi

if [ -n "${FLAGS_url}" ] ; then
  lab_url=${FLAGS_url}
elif [ -n "${FLAGS_lab}" ] ; then
  lab_url="http://${FLAGS_lab}:8080/cells"
else
  echo ">>> No lab server specified.  Please use --lab or --url options"
  exit 1
fi

cell_no=0

# Retrieve the testbed config from the server and match either the client
# or the cell number to one of the entries
ret=$(curl -s $lab_url | \
while read line; do
  # Each line from the server is made up of:
  # client_name router_name server_name client_addr router_addr server_addr
  set $line
  if [ "${FLAGS_cell}" = "$cell_no" -o "${FLAGS_client}" = "$1" -o \
       "${FLAGS_client}" = "$4" ] ; then
    if [ "$5" = "0.0.0.0" -o "$4" = "0.0.0.0" ]; then
      # Error -- these should never be zeroes
      break
    fi
    echo "$4"
    echo "router_addr=$5"
    if [ "$6" != "0.0.0.0" ] ; then
      echo "server_addr=$6"
    fi
    break
  fi
  cell_no=$[cell_no + 1]
done)

if [ -z "$ret" ] ; then
  echo ">>> Cell or host not found at $lab_url"
  exit 1
fi

set $ret
remote=$1
shift
for arg in "$@"; do
    append_arg $arg
done

eval "exec ${SCRIPTS_DIR}/run_remote_tests.sh \
      --args=\"${run_remote_args}\" --remote=${remote} $run_remote_flags \
      $FLAGS_ARGV"
