#!/bin/bash
#
# Copyright 2016 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Test of client/server SIGINT handling.  This test proves that the server
# gracefully handles SIGINT.

NO_SIGNAL_OVERRIDE=1
# Load the test setup defined in the parent directory
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CURRENT_DIR}/../integration_test_setup.sh" \
  || { echo "integration_test_setup.sh not found!" >&2; exit 1; }

# This function doesn't work well with the sandbox because testfifo and
# sleepyfifo are created outside the genrule.
# TODO(bazel-team): Make this test compliant with the behavior of the sandbox
function runbazel() {
  startup_opt=$1; shift

  local sleepyfifo=x/sleepyfifo
  local testfifo=x/testfifo
  mkdir -p x || fail "Can't create x"
  cat > x/BUILD << EOF
genrule(
  name = "sleepy",
  srcs = [],
  outs = ["sleepy.out"],
  local = 1,
  cmd = "echo 'hi test' > $testfifo; cat $sleepyfifo; sleep 9999"
)
EOF

  mkfifo $testfifo $sleepyfifo || fail "Couldn't create FIFOs under x"

  set -m
  # TODO(b/37617303): make test UI-independent
  bazel $startup_opt build --noexperimental_ui \
      --package_path . //x:sleepy >& $TEST_log &
  local pid=$!

  echo "${PRODUCT_NAME} running in background with pid $pid"
  local testfifocontents=$(cat $testfifo)
  echo "hi sleepy" > $sleepyfifo
  echo "Interrupting pid $pid"
  kill -INT $pid; sleep 3

  status=0
  # We expect the wait instruction to fail given that the build is interrupted.
  wait $pid || status=$?
  assert_equals 8 $status # Interruption exit code
  assert_equals "hi test" "$testfifocontents"
  set +m
}

function tear_down() {
  bazel shutdown
  rm -rf x
}

function assert_sigint_stops_build() {
  runbazel $1

  # Must have loaded package 'x':
  expect_log 'Loading package: x'
  expect_log 'Elapsed time'
  expect_log 'build interrupted'
}

function test_sigint_server_mode() {
  assert_sigint_stops_build "--nobatch"
}

function test_sigint_batch_mode() {
  assert_sigint_stops_build "--batch"
}

run_suite "Tests of SIGINT on ${PRODUCT_NAME}"
