#!/usr/bin/env bash

set -euxo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE:-$0}")"; pwd)"
RAY_DIR="${ROOT_DIR}/../.."

asan_install() {
  echo "installing"
  (cd "${RAY_DIR}"/python && pip install -e . --verbose)
}

asan_setup() {
  echo "Setting up the environment"
  pip uninstall -y ray || true
  conda uninstall -y wrapt || true
  pip install wrapt || true
  pip install -r ray-project/requirements.txt
  pip install -U pytest==5.4.3

  echo "Installing cython example"
  (cd "${RAY_DIR}"/doc/examples/cython && python setup.py install --user)

  echo "Settting up the shell"
  echo "build --config=asan" >> ~/.bazelrc  # Setup cache
  echo "LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/9/libasan.so" >> ~/.bashrc
  echo "ASAN_OPTIONS=detect_leaks=0" >> ~/.bashrc

  echo "Compiling ray"
  cd "${RAY_DIR}"
  asan_install || true
}

asan_run() {
  (
    export LD_PRELOAD="/usr/lib/gcc/x86_64-linux-gnu/9/libasan.so"
    export ASAN_OPTIONS="detect_leaks=0"

    cd "${RAY_DIR}"

    # Ray tests
    bazel test --test_output=streamed python/ray/serve/...
    bazel test --test_output=streamed python/ray/dashboard/...
    bazel test --test_output=streamed python/ray/tests/...
    bazel test --test_output=streamed python/ray/tune/...
  )
}

asan_recompile() {
  git fetch
  git checkout "${GIT_SHA:-$1}"
  asan_install || true
}

if [ 0 -lt "$#" ]; then
  "asan_$1" "${@:2}"
else
  echo "Available commands: setup, run, recompile"
fi
