#!/bin/bash

# Copyright (c) 2014 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.

set -e

BRANCH=$1
BUILD=$2

ATEST='../../../third_party/autotest/files/cli/atest'
RUN_SUITE='../../../third_party/autotest/files/site_utils/run_suite.py'

USAGE_STRING='Usage: ./run_wifi_release_suite.sh <branch number> <build number>'

if [[ $# -eq 0  ||  -z $2 ]] ; then
  echo $USAGE_STRING
  exit
fi

# atheros_ar9300 on kernel 3.4
list_1=(alex lumpy stumpy)

# atheros_ar9462 on kernel 3.4
list_2=(parrot butterfly)

# atheros_ar9462 on kernel 3.8
list_3=(link stout peppy falco)

# marvell_88w8797_2x2 on kernel 3.8
list_4=(snow spring)

# marvell_88w8897_2x2 on kernel 3.8
list_5=(peach_pi peach_pit)

# intel wilkins peak 2 on kernel 3.10
list_6=(squawks rambi falco_li)

DESIRED_BOARDS=(list_1 list_2 list_3 list_4 list_5 list_6)

return_available_hosts() {
  OIFS='$IFS'
  IFS=$'\n'

  boards=("${!1}")

  #TODO: Filter out stderr so the user doesn't see it.
  for host in `$ATEST host list | grep wificell` ; do
    IFS=$' '
    local host_info=($host)
    for board in ${boards[@]}; do
      if [[ $board == ${host_info[3]} && (${host_info[1]} != 'Repairing' &&
        ${host_info[1]} != 'Repair Failed') &&
        ${host_info[2]} == 'False' ]] ; then
        boards_to_run+=($board)
      fi
    done;
    IFS=$'\n'
  done;
  IFS=$OIFS
}

boards_to_run=()

for sub_list in ${DESIRED_BOARDS[@]} ; do
  previous_count=${#boards_to_run[@]}

  subst="$sub_list[@]"
  list_items=(`echo "${!subst}"`)
  return_available_hosts list_items[@]

  current_count=${#boards_to_run[@]}
  if [ $current_count -eq $previous_count ] ; then
    echo 'No devices from '$sub_list' were available!'
  fi

done;

#TODO: Remove duplicates from the list of boards_to_run

results_folder='/tmp/wifi_release_R'$BRANCH'-'$BUILD'-'`date +%Y-%m-%d-%H-%M-%S`
if [ -e $results_folder ] ; then
  rm -rf $results_folder
fi

#TODO: Create a wifi_release_Rx-x.latest symn link
mkdir $results_folder

for board in ${boards_to_run[@]}; do
  # Perform the conversion from autotest platform names to board build names
  if [ $board == 'spring' ] ; then
    board='daisy_spring'
  elif [ $board == 'snow' ] ; then
    board='daisy'
  elif [ $board == 'alex' ] ; then
    board='x86-alex'
  fi

  run_command=$RUN_SUITE' --build='$board'-release/R'$BRANCH'-'$BUILD
  run_command+=' --pool=wificell --board='$board' --suite_name=wifi_release'

  results_file=$results_folder'/'$board'.txt'

  echo 'Running: '$board
  eval $run_command &> $results_file &
  disown %1

done;

echo 'Results can be seen in: '$results_folder
