#!/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
# This script assumes that atest is in PATH
ATEST='atest'
RUN_SUITE='../../../third_party/autotest/files/site_utils/run_suite.py'

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

declare -i PREFLIGHT_POOL_VERSION=41

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 monroe panther leon wolf mccloud zako)

# marvell_88w8797_2x2 on kernel 3.8
list_4=(snow spring skate)

# marvell_88w8897_2x2 on kernel 3.8
list_5=(peach_pi peach_pit)

# marvell_88w8897_2x2 on kernel 3.10
list_6=(nyan_big nyan_blaze nyan_kitty)

# intel wilkins peak 2 on kernel 3.8
list_7=(falco_li tricky)

# intel wilkins peak 2 on kernel 3.10
list_8=(squawks expresso clapper glimmer quawks enguarde kip squawks gnawty
        swanky winky candy orco sumo ninja banjo heli)

# intel wilkins peak 2 on kernel 3.14
list_9=(samus auron_paine auron_yuna guado tidus rikku lulu gandof)

# Broadcom 4354 on kernel 3.14
list_10=(veyron_speedy veyron_minnie veyron_mickey)

# Marvell 8897 on kernel 3.14
list_11=(veyron_mighty veyron_jaq veyron_jerry)

# Intel Stonepeak2 on kernel 3.18
list_12=(cyan celes glados ultima reks chell lars terra sentry edgar banon umaro
         kefka cave sabin asuka)

# Marvell 8897 on kernel 3.18
list_13=(elm)

# Marvell 8897 on kernel 4.4.14
list_14=(kevin)


DESIRED_BOARDS=(list_1 list_2 list_3 list_4 list_5 list_6 list_7 list_8 list_9
                list_10 list_11 list_12 list_13 list_14)

# POOLS format: POOLS[<pool name>]=<suite name>
declare -A POOLS
POOLS[wificell]=wifi_release

return_item_exists_in_array() {
  for current_board in ${boards_to_run[@]}; do
    if [[ ${1} == ${current_board} ]] ; then
      echo 'True'
    fi
  done;
  echo 'False'
}

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

  boards=("${!1}")
  local pool=${2}

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

return_host_list() {
  local pool=${1}
  for sub_list in ${DESIRED_BOARDS[@]} ; do
    previous_count=${#boards_to_run[@]}

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

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

  done;
}

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

mkdir $results_folder
latest_results_folder='/tmp/connectivity_results_latest'
if [ -h ${latest_results_folder} ] ; then
  rm -rf ${latest_results_folder}
fi
ln -s ${results_folder} ${latest_results_folder}

for pool in "${!POOLS[@]}"; do
  boards_to_run=()
  return_host_list ${pool}

  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 == 'skate' ] ; then
      board='daisy_skate'
    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='$pool' --board='$board' --suite_name='${POOLS[$pool]}

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

    #TODO: Move or delete extra files created by run suite
    eval $run_command &> $results_file &
    disown %1

  done;
done;

echo 'All results are available in: '${results_folder}
