| #!/bin/bash |
| # |
| # Copyright 2019 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. |
| |
| # An end-to-end test for the wrapper used by our installer and distro packages. |
| |
| # --- begin runfiles.bash initialization --- |
| 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; } |
| |
| set -e |
| |
| wrapper=$(rlocation io_bazel/scripts/packages/bazel.sh) |
| |
| mock_bazel() { |
| { |
| cat <<'EOF' |
| #!/bin/bash |
| set -euo pipefail |
| if [[ ${1:-""} == "--version" ]]; then |
| echo "bazel BAZEL_VERSION" |
| else |
| echo "Hello from $(basename $0)!" |
| echo "My args: $@" |
| fi |
| exit 0 |
| EOF |
| } | sed "s/BAZEL_VERSION/$2/" > "$1" |
| chmod +x "$1" |
| } |
| |
| setup_mock() { |
| # Setup a mock workspace. |
| mkdir ws ws/subdir |
| touch ws/{BUILD,WORKSPACE} |
| touch ws/subdir/BUILD |
| |
| # Setup a mock "/usr/bin" folder with the wrapper and some "Bazel" binaries. |
| mkdir bin |
| cp "$wrapper" "bin/bazel" |
| chmod +x "bin/bazel" |
| mock_bazel "bin/bazel-0.29.1" "0.29.1" |
| mock_bazel "bin/bazel-1.0.1" "1.0.1" |
| mock_bazel "bin/bazel-real" "1.1.0" |
| |
| # We don't want USE_BAZEL_VERSION passed by --test_env to affect this test. |
| unset USE_BAZEL_VERSION |
| cd ws |
| } |
| |
| test_use_bazel_version_envvar() { |
| setup_mock |
| |
| USE_BAZEL_VERSION="0.29.1" ../bin/bazel build &> "$TEST_log" |
| expect_log "Hello from bazel-0.29.1" |
| expect_log "My args: build" |
| } |
| |
| test_bazelversion_file() { |
| setup_mock |
| |
| echo "1.0.1" > .bazelversion |
| |
| ../bin/bazel info &> "$TEST_log" |
| expect_log "Hello from bazel-1.0.1" |
| expect_log "My args: info" |
| |
| cd subdir |
| ../../bin/bazel build //src:bazel &> "$TEST_log" |
| expect_log "Hello from bazel-1.0.1" |
| expect_log "My args: build //src:bazel" |
| } |
| |
| test_workspace_with_extension() { |
| setup_mock |
| mv WORKSPACE WORKSPACE.bazel |
| |
| echo "1.0.1" > .bazelversion |
| |
| ../bin/bazel info &> "$TEST_log" |
| expect_log "Hello from bazel-1.0.1" |
| expect_log "My args: info" |
| |
| cd subdir |
| ../../bin/bazel build //src:bazel &> "$TEST_log" |
| expect_log "Hello from bazel-1.0.1" |
| expect_log "My args: build //src:bazel" |
| } |
| |
| |
| test_empty_bazelversion_file() { |
| setup_mock |
| |
| touch .bazelversion |
| ../bin/bazel info &> "$TEST_log" |
| expect_log "Hello from bazel-real" |
| |
| echo "" > .bazelversion |
| ../bin/bazel info &> "$TEST_log" |
| expect_log "Hello from bazel-real" |
| } |
| |
| test_explicit_latest_bazel() { |
| setup_mock |
| |
| echo "latest" > .bazelversion |
| ../bin/bazel info &> "$TEST_log" |
| expect_log "Hello from bazel-real" |
| } |
| |
| test_uses_bazelreal() { |
| setup_mock |
| |
| ../bin/bazel &> "$TEST_log" |
| expect_log "Hello from bazel-real" |
| expect_log "My args:" |
| } |
| |
| test_uses_latest_version() { |
| setup_mock |
| |
| rm ../bin/bazel-real |
| ../bin/bazel &> "$TEST_log" |
| expect_log "Hello from bazel-1.0.1" |
| |
| rm ../bin/bazel-1.0.1 |
| ../bin/bazel &> "$TEST_log" |
| expect_log "Hello from bazel-0.29.1" |
| } |
| |
| test_error_message_for_no_available_bazel_version() { |
| setup_mock |
| |
| rm ../bin/bazel-* |
| if ../bin/bazel &> "$TEST_log"; then |
| fail "Bazel wrapper should have failed" |
| fi |
| expect_log "No installed Bazel version found, cannot continue" |
| } |
| |
| test_error_message_for_required_bazel_not_found() { |
| setup_mock |
| |
| if USE_BAZEL_VERSION="foobar" ../bin/bazel &> "$TEST_log"; then |
| fail "Bazel wrapper should have failed" |
| fi |
| expect_log "ERROR: The project you're trying to build requires Bazel foobar (specified in \$USE_BAZEL_VERSION)" |
| } |
| |
| test_recommends_curl() { |
| setup_mock |
| |
| mkdir mockpath |
| for bin in uname readlink dirname tr; do |
| ln -s "$(command -v $bin)" mockpath |
| done |
| touch mockpath/curl |
| chmod +x mockpath/curl |
| |
| if PATH="$(pwd)/mockpath" USE_BAZEL_VERSION="foobar" ../bin/bazel &> "$TEST_log"; then |
| fail "Bazel wrapper should have failed" |
| fi |
| expect_log "curl -fLO" |
| expect_not_log "wget" |
| } |
| |
| test_recommends_wget() { |
| setup_mock |
| |
| mkdir mockpath |
| for bin in uname readlink dirname tr; do |
| ln -s "$(command -v $bin)" mockpath |
| done |
| touch mockpath/wget |
| chmod +x mockpath/wget |
| |
| if PATH="$(pwd)/mockpath" USE_BAZEL_VERSION="foobar" ../bin/bazel &> "$TEST_log"; then |
| fail "Bazel wrapper should have failed" |
| fi |
| expect_log "wget" |
| expect_not_log "curl" |
| } |
| |
| test_recommends_manual_download() { |
| setup_mock |
| |
| mkdir mockpath |
| for bin in uname readlink dirname tr; do |
| ln -s "$(command -v $bin)" mockpath |
| done |
| |
| if PATH="$(pwd)/mockpath" USE_BAZEL_VERSION="foobar" ../bin/bazel &> "$TEST_log"; then |
| fail "Bazel wrapper should have failed" |
| fi |
| expect_log "Please put the downloaded Bazel binary into this location" |
| expect_not_log "curl" |
| expect_not_log "wget" |
| } |
| |
| test_delegates_to_wrapper_if_present() { |
| setup_mock |
| |
| mkdir tools |
| cat > tools/bazel <<'EOF' |
| #!/bin/bash |
| set -euo pipefail |
| echo "Hello from the wrapper tools/bazel!" |
| echo "BAZEL_REAL = ${BAZEL_REAL}" |
| echo "My args: $@" |
| exit 0 |
| EOF |
| chmod +x tools/bazel |
| |
| # Due to https://github.com/bazelbuild/bazel/issues/10356, we have to ignore |
| # the .bazelversion file in case a tools/bazel executable is present. |
| # Even if the requested Bazel version doesn't exist, the wrapper still has to |
| # add the $BAZEL_REAL environment variable, so this will point to a |
| # non-existing file in that case. It's up to the owner of the repo to decide |
| # what to make of it - e.g. print an error message, fallback to something else |
| # or completely ignore the $BAZEL_REAL variable. |
| USE_BAZEL_VERSION="3.0.0" ../bin/bazel build //src:bazel &> "$TEST_log" |
| expect_log "Hello from the wrapper tools/bazel!" |
| expect_log "BAZEL_REAL = .*/bin/bazel-3.0.0" |
| expect_log "My args: build //src:bazel" |
| } |
| |
| test_gracefully_handles_bogus_bazelversion() { |
| setup_mock |
| |
| mkdir tools |
| cat > tools/bazel <<'EOF' |
| #!/bin/bash |
| set -euo pipefail |
| echo "Hello from the wrapper tools/bazel!" |
| echo "My args: $@" |
| exit 0 |
| EOF |
| chmod +x tools/bazel |
| |
| # Create a .bazelversion file that looks completely different than what we |
| # actually support. The wrapper is supposed to not crash and still call the |
| # tools/bazel executable. The content of the $BAZEL_REAL variable can be |
| # completely bogus, of course. |
| cat > .bazelversion <<'EOF' |
| mirrors: [http://mirror.example/bazel-5.0.0, http://github.com/example/] |
| # The above is our internal mirror. The syntax is only supported since |
| # Bazelisk 42.0. |
| EOF |
| ../bin/bazel build //src:bazel &> "$TEST_log" |
| expect_log "Hello from the wrapper tools/bazel!" |
| expect_log "My args: build //src:bazel" |
| } |
| |
| test_wrapper_detects_version_of_bazel_real() { |
| setup_mock |
| |
| echo "1.1.0" > .bazelversion |
| ../bin/bazel &> "$TEST_log" |
| expect_log "Hello from bazel-real" |
| expect_log "My args:" |
| } |
| |
| # Regression test for https://github.com/bazelbuild/bazel/issues/10459 |
| test_bazelversion_without_newline() { |
| setup_mock |
| |
| echo -n "1.0.1" > .bazelversion |
| |
| ../bin/bazel info &> "$TEST_log" |
| expect_log "Hello from bazel-1.0.1" |
| expect_log "My args: info" |
| } |
| |
| run_suite "Integration tests for scripts/packages/bazel.sh." |