blob: f22ae7edab878c2ee38a148f0106dada01508b21 [file] [log] [blame]
#!/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_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 -LO"
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."