#!/usr/bin/env bash
set -o errexit -o nounset -o pipefail

if [ "${DEBUG:=false}" = "true" ]; then
  set -o xtrace
fi

usage() {
  echo "usage: $(basename $0) BOX_NAME [vmware|virtualbox|parallels]"
  echo
  echo "Download BOX_NAME from Atlas and run automated tests against it"
}

args() {
  if [ $# -lt 2 ]; then
    usage
    exit 0
  fi

  if [[ ! $2 =~ ^(vmware|virtualbox|parallels)$ ]]; then
    echo "$(basename $0): illegal platform $2"
    echo "Valid platforms: vmware|virtualbox|parallels"
    usage
    exit 1
  fi

  box_path=$1
  box_provider=$2
  vagrant_provider=${3:-${box_provider}}
  if [ "$box_provider" = "vmware" ]; then
    box_provider=vmware_desktop
    if [[ $OSTYPE =~ darwin ]]; then
      vagrant_provider=vmware_fusion
    else
      vagrant_provider=vmware_workstation
    fi
  fi
  SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  test_src_path=${SCRIPT_DIR}/../test/*_spec.rb
}

create_vagrantfile_linux() {
vagrant plugin list | grep vagrant-serverspec && echo "vagrant-serverspec installed" || vagrant plugin install vagrant-serverspec
cat << EOF > $tmp_path/Vagrantfile
Vagrant.configure('2') do |config|
config.vm.box = '$box_path'

config.vm.provision :serverspec do |spec|
spec.pattern = '$test_src_path'
end
end
EOF
}

# main

args "$@"

box_filename=$(basename "${box_path}")
box_name=${box_filename%.*}
tmp_path=/tmp/vagrantcloudtest

rm -rf ${tmp_path}
rm -f ~/.ssh/known_hosts

vagrant box remove ${box_path} --provider ${box_provider} 2>/dev/null || true
vagrant box add ${box_path} --provider=${box_provider}
mkdir -p ${tmp_path}

pushd ${tmp_path}
create_vagrantfile_linux
VAGRANT_LOG=warn vagrant up --provider=${vagrant_provider}
sleep 10
vagrant destroy -f
popd

vagrant box remove ${box_path} --provider=${box_provider}
