#!/bin/bash -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 ****"
  which go
  go version
  echo "**** Gopls version ****"
  go version -m "$(which gopls)"
}

run_test() {
  echo "**** Run test ****"
  df -h | grep shm
  npm ci
  npm run compile
  npm run unit-test
  npm test --silent
  npm run lint

  echo "**** Run settings generator ****"
  go run tools/generate.go -w=false -gopls=true

  echo "**** Check if vsce works ****"
  vsce package

  echo "**** Run Go tests ****"
  go test ./...
  # TODO(hyangah): see if go clean -modcache makes kokoro builder happy
  go clean -modcache
}

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
}

prepare_nightly() {
  # Version format: YYYY.MM.DDHH based on the latest commit timestamp.
  # e.g. 2020.1.510 is the version built based on a commit that was made
  #      on 2020/01/05 10:00
  local VER=`git log -1 --format=%cd --date="format:%Y.%-m.%-d%H"`
  local COMMIT=`git log -1 --format=%H`
  echo "**** Preparing nightly release : $VER ***"

  # Update package.json
  (cat package.json | jq --arg VER "${VER}" '
.version=$VER |
.preview=true |
.name="go-nightly" |
.displayName="Go Nightly" |
.publisher="golang" |
.description="Rich Go language support for Visual Studio Code (Nightly)" |
.contributes.configuration.properties."go.delveConfig".properties.hideSystemGoroutines.default=true
') > /tmp/package.json && mv /tmp/package.json package.json

  # Replace CHANGELOG.md with CHANGELOG.md + Release commit info.
  printf "**Release ${VER} @ ${COMMIT}** \n\n" | cat - CHANGELOG.md > /tmp/CHANGELOG.md.new && mv /tmp/CHANGELOG.md.new CHANGELOG.md
  # Replace the heading of README.md with the heading for Go Nightly.
  sed '/^# Go for Visual Studio Code$/d' README.md | cat build/nightly/README.md - > /tmp/README.md.new && mv /tmp/README.md.new README.md
  # Replace src/const.ts with build/nightly/const.ts.
  cp build/nightly/const.ts src/const.ts
}

main() {
  cd "$(root_dir)"  # always run from the script 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_test
      ;;
    "prepare_nightly")
      prepare_nightly
      ;;
    *)
      usage
      exit 2
  esac
}
main $@
