#!/usr/bin/env bash
#
# Copyright 2017 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.
#
# workspace_status_test.sh: integration tests for bazel workspace status.
# This tests shared functionality between Bazel/Blaze workspace status actions,
# as opposed to ../bazel/bazel_workspace_status_test.sh, which is Bazel-only
# functionality.

# --- begin runfiles.bash initialization ---
# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
set -euo pipefail
if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
  if [[ -f "$0.runfiles_manifest" ]]; then
    export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest"
  elif [[ -f "$0.runfiles/MANIFEST" ]]; then
    export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST"
  elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
    export RUNFILES_DIR="$0.runfiles"
  fi
fi
if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
  source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
  source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
            "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
else
  echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
  exit 1
fi
# --- end runfiles.bash initialization ---

source "$(rlocation "io_bazel/src/test/shell/integration_test_setup.sh")" \
  || { echo "integration_test_setup.sh not found!" >&2; exit 1; }

add_to_bazelrc "build --package_path=%workspace%"

BIN_DIR=/bin
if is_darwin; then
  BIN_DIR=/usr/bin
fi

#### TESTS #############################################################

function test_workspace_status_with_stderr() {
  local ok="$TEST_TMPDIR/ok.sh"
  cat > "$ok" <<EOF
#!/usr/bin/env bash
echo "This is stderr" >&2
exit 0
EOF
  chmod +x "$ok"

  bazel build --stamp --workspace_status_command="$ok" >& "$TEST_log" \
      || fail "Build failed"
  # Tolerate Bazel/Blaze differences in action description.
  expect_log "INFO: From .*.txt:"
  expect_log "This is stderr"
}

function test_workspace_status_invalidation() {
  bazel build --stamp --workspace_status_command=${BIN_DIR}/false >& "$TEST_log" \
    && fail "build succeeded"
  # Tolerate Bazel/Blaze differences in failure message.
  expect_log "Failed to determine"
  expect_not_log IllegalStateException # regtest for #806095
  bazel build --stamp --workspace_status_command=${BIN_DIR}/true >& "$TEST_log" \
    || fail "build failed"
}

# Regression test for bug 4095015.
function test_false_and_verbose_failures() {
    add_rules_cc MODULE.bazel
    mkdir -p x || fail "mkdir x failed"
    echo 'load("@rules_cc//cc:cc_library.bzl", "cc_library")' > x/BUILD
    echo "cc_library(name='x')" >> x/BUILD

    bazel build --workspace_status_command=${BIN_DIR}/false --verbose_failures //x \
        >& "$TEST_log" && fail "Expected build to fail".
    # Tolerate Bazel/Blaze differences in failure message.
    expect_log "Failed to determine"
    expect_not_log NullPointerException
    expect_not_log Crash
}

function test_that_script_is_run_from_workspace_directory() {
    add_rules_cc MODULE.bazel
    mkdir -p x || fail "mkdir x failed"
    echo 'load("@rules_cc//cc:cc_library.bzl", "cc_library")' > x/BUILD
    echo "cc_library(name='x')" >> x/BUILD

    local pwdfile="$TEST_TMPDIR/pwdfile"
    echo "pwd >$pwdfile" >myscript && chmod +x myscript
    # We'll even run Bazel from a subdirectory.
    (cd x && bazel build --workspace_status_command=myscript //x >& "$TEST_log")
    local exit_code="$?"
    [[ "$exit_code" -eq 0 ]] || fail "Build failed"
    cat "$pwdfile" > "$TEST_log"
    expect_log "^$(pwd)\$"
}

function test_errmsg() {
  bazel build --workspace_status_command="$TEST_TMPDIR/wscmissing.sh" --stamp \
       &> $TEST_log && fail "build succeeded"
  expect_log "wscmissing.sh: No such file or directory\|wscmissing.sh: not found"
}

function test_embed_label_must_be_single_line() {
  bazel build --embed_label="$(echo -e 'abc\nxyz')" >& "$TEST_log" \
    && fail "Expected failure"
  expect_log "Value must not contain multiple lines"
}

run_suite "${PRODUCT_NAME} workspace status command tests"
