#!/usr/bin/env bash
set -e

# Copyright (C) Microsoft Corporation. All rights reserved.
# Modification copyright 2020 The Go Authors. All rights reserved.
# Licensed under the MIT License. See LICENSE in the project root for license information.

usage() {
  cat <<EOUSAGE
Usage: $0 [subcommand]
Available subcommands:
  help      - display this help message.
  test      - build and test locally. Some tests may fail if vscode is already in use.
  testlocal - build and test in a locally built container.
  ci        - build and test with headless vscode. Requires Xvfb.
EOUSAGE
}

# TODO(hyangah): commands for building docker container and running tests locally with docker run.
root_dir() {
  local script_name=$(readlink -f "${0}")
  local script_dir=$(dirname "${script_name}")
  local parent_dir=$(dirname "${script_dir}")
  echo "${parent_dir}"
}

setup_virtual_display() {
  echo "**** Set up virtual display ****"
  # Start xvfb (an in-memory display server for UNIX-like operating system)
  # so we can launch a headless vscode for testing.
  /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
  trap 'kill "$(jobs -p)"' EXIT
  export DISPLAY=:99
  sleep 3  # Wait for xvfb to be up.
}

go_binaries_info() {
  echo "**** Go version ****"
  go version
  df -h | grep shm
}

run_doc_test() {
  echo "**** Run settings generator ****"
  go run -C extension ./tools/generate.go -w=false -gopls=true
}

run_test() {
  pushd .
  cd "$(root_dir)/extension"
  echo "**** Test build ****"
  npm ci
  npm run compile

  echo "**** Run Go tests ****"
  go test ./...

  echo "**** Run test ****"
  npm run unit-test
  npm test --silent
  popd
}

run_lint() {
  pushd .
  cd "$(root_dir)/extension"
  echo "**** Run lint ****"
  npm run lint
  popd
}

run_test_in_docker() {
  echo "**** Building the docker image ***"
  docker build -t vscode-test-env ${GOVERSION:+ --build-arg GOVERSION="${GOVERSION}"} -f ./build/Dockerfile .

  # For debug tests, we need ptrace.
  docker run --cap-add SYS_PTRACE --shm-size=8G --workdir=/workspace -v "$(pwd):/workspace" vscode-test-env ci
}

main() {
  cd "$(root_dir)"  # always start to run from the extension source root.
  case "$1" in
    "help"|"-h"|"--help")
      usage
      exit 0
      ;;
    "test")
      go_binaries_info
      run_test
      ;;
    "testlocal")
      run_test_in_docker
      ;;
    "ci")
      go_binaries_info
      setup_virtual_display
	    run_doc_test
      run_test
	    run_lint
      ;;
    *)
      usage
      exit 2
  esac
}
main $@
