#!/bin/bash -p

# Copyright (c) 2012 The Chromium 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 -eu

# Environment sanitization. Set a known-safe PATH. Clear environment variables
# that might impact the interpreter's operation. The |bash -p| invocation
# on the #! line takes the bite out of BASH_ENV, ENV, and SHELLOPTS (among
# other features), but clearing them here ensures that they won't impact any
# shell scripts used as utility programs. SHELLOPTS is read-only and can't be
# unset, only unexported.
export PATH="/usr/bin:/bin:/usr/sbin:/sbin"
unset BASH_ENV CDPATH ENV GLOBIGNORE IFS POSIXLY_CORRECT
export -n SHELLOPTS

readonly ScriptDir=$(dirname "$(echo ${0} | sed -e "s,^\([^/]\),$(pwd)/\1,")")
readonly ScriptName=$(basename "${0}")
readonly ThisScript="${ScriptDir}/${ScriptName}"
readonly SimExecutable="${BUILD_DIR}/${CONFIGURATION}/iossim"

# Helper to print a line formatted for Xcodes build output parser.
XcodeNote() {
  echo "${ThisScript}:${1}: note: ${2}"
}

# Helper to print a divider to make things stick out in a busy output window.
XcodeHeader() {
  echo "note: _________________________________________________________________"
  echo "note: _________________________________________________________________"
  echo "note: _________________________________________________________________"
  XcodeNote "$1" ">>>>>     $2"
  echo "note: _________________________________________________________________"
  echo "note: _________________________________________________________________"
  echo "note: _________________________________________________________________"
}

# Kills the iPhone Simulator if it is running.
KillSimulator() {
  /usr/bin/killall "iPhone Simulator" 2> /dev/null || true
}

# Runs tests via the iPhone Simulator for multiple devices.
RunTests() {
  local -r appPath="${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app"

  if [[ ! -x "${SimExecutable}" ]]; then
    echo "Unable to run tests: ${SimExecutable} was not found/executable."
    exit 1
  fi

  for device in 'iPhone' 'iPad'; do
    iosVersion="5.1"
    KillSimulator
    local command=(
      "${SimExecutable}" "-d${device}" "-s${iosVersion}" "${appPath}"
    )
    # Pass along any command line flags
    if [[ "$#" -gt 0 ]]; then
      command+=( "--" "${@}" )
    fi
    XcodeHeader ${LINENO} "Launching tests for ${device} (iOS ${iosVersion})"
    "${command[@]}"

    # If the command didn't exit successfully, abort.
    if [[ $? -ne 0 ]]; then
      exit $?;
    fi
  done
}

# Time to get to work.

if [[ "${PLATFORM_NAME}" != "iphonesimulator" ]]; then
  XcodeNote ${LINENO} "Skipping running of unittests for device build."
else
  if [[ "$#" -gt 0 ]]; then
    RunTests "${@}"
  else
    RunTests
  fi
  KillSimulator
fi

exit 0
