blob: 8747f191198ec11d4c55b90059af4453b21fc68d [file] [log] [blame] [edit]
#!/bin/bash
# Copyright 2018 Google Inc. 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.
set -euo pipefail
# --- 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 ---
BAZELISK_VERSION=$1
shift 1
# TODO: only the Python version reads bazelbuild-releases.json since it uses
# GitHub by default, whereas the Go version GCS (without this json file)
function setup() {
unset USE_BAZEL_VERSION
USER_HOME="$(mktemp -d $TEST_TMPDIR/user.XXXXXX)"
BAZELISK_HOME="$(mktemp -d $TEST_TMPDIR/home.XXXXXX)"
cp "$(rlocation _main/releases_for_tests.json)" "${BAZELISK_HOME}/bazelbuild-releases.json"
touch "${BAZELISK_HOME}/bazelbuild-releases.json"
ln -s "${BAZELISK_HOME}/bazelbuild-releases.json" "${BAZELISK_HOME}/releases.json"
cd "$(mktemp -d $TEST_TMPDIR/workspace.XXXXXX)"
touch WORKSPACE BUILD
}
function bazelisk() {
if [[ -n $(rlocation _main/bazelisk.py) ]]; then
if [[ $BAZELISK_VERSION == "PY3" ]]; then
echo "Running Bazelisk with $(python3 -V)..."
python3 "$(rlocation _main/bazelisk.py)" "$@"
else
echo "Running Bazelisk with $(python -V)..."
python "$(rlocation _main/bazelisk.py)" "$@"
fi
elif [[ -n $(rlocation _main/windows_amd64_debug/bazelisk.exe) ]]; then
"$(rlocation _main/windows_amd64_debug/bazelisk.exe)" "$@"
elif [[ -n $(rlocation _main/darwin_amd64_debug/bazelisk) ]]; then
"$(rlocation _main/darwin_amd64_debug/bazelisk)" "$@"
elif [[ -n $(rlocation _main/linux_amd64_debug/bazelisk) ]]; then
"$(rlocation _main/linux_amd64_debug/bazelisk)" "$@"
elif [[ -n $(rlocation _main/windows_amd64_stripped/bazelisk.exe) ]]; then
"$(rlocation _main/windows_amd64_stripped/bazelisk.exe)" "$@"
elif [[ -n $(rlocation _main/darwin_amd64_stripped/bazelisk) ]]; then
"$(rlocation _main/darwin_amd64_stripped/bazelisk)" "$@"
elif [[ -n $(rlocation _main/linux_amd64_stripped/bazelisk) ]]; then
"$(rlocation _main/linux_amd64_stripped/bazelisk)" "$@"
elif [[ -n $(rlocation _main/bazelisk_/bazelisk) ]]; then
"$(rlocation _main/bazelisk_/bazelisk)" "$@"
elif [[ -n $(rlocation _main/bazelisk_/bazelisk.exe) ]]; then
"$(rlocation _main/bazelisk_/bazelisk.exe)" "$@"
else
echo "Could not find the bazelisk executable, listing files:"
find .
exit 1
fi
}
function test_bazel_version_py() {
setup
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
# 7.1.0 is the latest release in releases_for_tests.json
grep "Build label: 7.1.0" log || \
(echo "FAIL: Expected to find 'Build label' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_go() {
setup
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: " log || \
(echo "FAIL: Expected to find 'Build label' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_from_environment() {
setup
USE_BAZEL_VERSION="7.0.0" \
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.0.0" log || \
(echo "FAIL: Expected to find 'Build label: 7.0.0' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_prefer_environment_to_bazeliskrc() {
setup
echo "USE_BAZEL_VERSION=7.2.1" > .bazeliskrc
USE_BAZEL_VERSION="7.0.0" \
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.0.0" log || \
(echo "FAIL: Expected to find 'Build label: 7.0.0' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_from_workspace_bazeliskrc() {
setup
echo "USE_BAZEL_VERSION=7.2.1" > .bazeliskrc
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.2.1" log || \
(echo "FAIL: Expected to find 'Build label: 7.2.1' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_from_user_home_bazeliskrc() {
setup
echo "USE_BAZEL_VERSION=7.2.1" > "${USER_HOME}/.bazeliskrc"
BAZELISK_HOME="$BAZELISK_HOME" \
HOME="$USER_HOME" \
USERPROFILE="$USER_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.2.1" log || \
(echo "FAIL: Expected to find 'Build label: 7.2.1' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_prefer_workspace_bazeliskrc_to_user_home_bazeliskrc() {
setup
echo "USE_BAZEL_VERSION=7.2.1" > .bazeliskrc
echo "USE_BAZEL_VERSION=7.0.0" > "${USER_HOME}/.bazeliskrc"
BAZELISK_HOME="$BAZELISK_HOME" \
HOME="$USER_HOME" \
USERPROFILE="$USER_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.2.1" log || \
(echo "FAIL: Expected to find 'Build label: 7.2.1' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_prefer_bazeliskrc_to_bazelversion_file() {
setup
echo "USE_BAZEL_VERSION=7.2.1" > .bazeliskrc
echo "7.0.0" > .bazelversion
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.2.1" log || \
(echo "FAIL: Expected to find 'Build label: 7.2.1' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_from_file() {
setup
echo "7.0.0" > .bazelversion
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.0.0" log || \
(echo "FAIL: Expected to find 'Build label: 7.0.0' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_from_format_url() {
setup
echo "7.2.1" > .bazelversion
BAZELISK_FORMAT_URL="https://github.com/bazelbuild/bazel/releases/download/%v/bazel-%v-%o-%m%e" \
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.2.1" log || \
(echo "FAIL: Expected to find 'Build label: 7.2.1' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_version_from_base_url() {
setup
echo "7.2.1" > .bazelversion
BAZELISK_BASE_URL="https://github.com/bazelbuild/bazel/releases/download" \
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.2.1" log || \
(echo "FAIL: Expected to find 'Build label: 7.2.1' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_latest_minus_3_py() {
setup
USE_BAZEL_VERSION="latest-3" \
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: 7.0.0" log || \
(echo "FAIL: Expected to find 'Build label: 7.0.0' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_latest_minus_3_go() {
setup
USE_BAZEL_VERSION="latest-3" \
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label: " log || \
(echo "FAIL: Expected to find 'Build label' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_last_green() {
setup
USE_BAZEL_VERSION="last_green" \
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
! grep "Build label:" log || \
(echo "FAIL: 'bazelisk version' of an unreleased binary must not print a build label."; exit 1)
}
function test_BAZELISK_NOJDK() {
setup
# Running the nojdk Bazel without a valid JAVA is expected to fail
set +e
BAZELISK_HOME="$BAZELISK_HOME" \
USE_BAZEL_VERSION="7.0.0" \
BAZELISK_NOJDK="1" \
bazelisk --noautodetect_server_javabase version 2>&1 | tee log
set -e
grep "FATAL: Could not find embedded or explicit server javabase, and --noautodetect_server_javabase is set." log || \
(echo "FAIL: nojdk Bazel should fail when no JDK is supplied."; exit 1)
# Theoretically there could be a cache collision in the Bazelisk cache between nojdk and regular Bazel.
#
# Ensure that isn't happening by running the regular Bazel right after nojdk Bazel, just in case. If there is a collision, it will fail.
BAZELISK_HOME="$BAZELISK_HOME" \
USE_BAZEL_VERSION="7.0.0" \
JAVA_HOME="does/not/exist" \
bazelisk --noautodetect_server_javabase version 2>&1 | tee log
grep "Build label: 7.0.0" log || \
(echo "FAIL: Expected to find 'Build label: 7.0.0' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_last_rc() {
setup
USE_BAZEL_VERSION="last_rc" \
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "Build label:" log || \
(echo "FAIL: Expected to find 'Build label' in the output of 'bazelisk version'"; exit 1)
}
function test_delegate_to_wrapper() {
setup
mkdir tools
cat > tools/bazel <<'EOF'
#!/bin/sh
echo HELLO_WRAPPER
env | grep BAZELISK_SKIP_WRAPPER
EOF
chmod +x tools/bazel
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
grep "HELLO_WRAPPER" log || \
(echo "FAIL: Expected to find 'HELLO_WRAPPER' in the output of 'bazelisk version'"; exit 1)
grep "BAZELISK_SKIP_WRAPPER=true" log || \
(echo "FAIL: Expected to find 'BAZELISK_SKIP_WRAPPER=true' in the output of 'bazelisk version'"; exit 1)
}
function test_path_is_consistent_regardless_of_base_url() {
setup
echo 8.3.0 > .bazelversion
cat >MODULE.bazel <<EOF
print_path = use_repo_rule("//:print_path.bzl", "print_path")
print_path(name = "print_path")
EOF
cat >print_path.bzl <<EOF
def _print_path_impl(rctx):
print("PATH is: {}".format(rctx.os.environ["PATH"]))
rctx.file("REPO.bazel", "")
rctx.file("BUILD", "")
rctx.file("defs.bzl", "def noop(): pass")
print_path = repository_rule(
implementation = _print_path_impl,
)
EOF
BAZELISK_HOME="$BAZELISK_HOME" bazelisk fetch --repo=@print_path 2>&1 | tee log1
BAZELISK_HOME="$BAZELISK_HOME" bazelisk clean --expunge 2>&1
# We need a separate mirror of bazel binaries, which has identical files.
# Ideally we wouldn't depend on sourceforge for test runtime, but hey, it exists and it works.
BAZELISK_HOME="$BAZELISK_HOME" BAZELISK_BASE_URL=https://downloads.sourceforge.net/project/bazel.mirror bazelisk fetch --repo=@print_path 2>&1 | tee log2
path1="$(grep "PATH is:" log1)"
path2="$(grep "PATH is:" log2)"
[[ -n "${path1}" && -n "${path2}" ]] || \
(echo "FAIL: Expected PATH to be non-empty, got path1=${path1}, path2=${path2}"; exit 1)
[[ "${path1}" == "${path2}" ]] || \
(echo "FAIL: Expected PATH to be the same regardless of which mirror was used, got path1=${path1}, path2=${path2}"; exit 1)
}
function test_skip_wrapper() {
setup
mkdir tools
cat > tools/bazel <<'EOF'
#!/bin/sh
echo HELLO_WRAPPER
env | grep BAZELISK_SKIP_WRAPPER
EOF
chmod +x tools/bazel
BAZELISK_HOME="$BAZELISK_HOME" \
BAZELISK_SKIP_WRAPPER="true" \
bazelisk version 2>&1 | tee log
grep "HELLO_WRAPPER" log && \
(echo "FAIL: Expected to not find 'HELLO_WRAPPER' in the output of 'bazelisk version'"; exit 1)
grep "Build label:" log || \
(echo "FAIL: Expected to find 'Build label' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_download_path_go() {
setup
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
find "$BAZELISK_HOME/downloads/metadata/bazelbuild" 2>&1 | tee log
grep "^$BAZELISK_HOME/downloads/metadata/bazelbuild/bazel-[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*-[a-z0-9_-]*$" log || \
(echo "FAIL: Expected to download bazel metadata in specific path."; exit 1)
}
function test_bazel_verify_sha256() {
setup
echo "7.1.1" > .bazelversion
# First try to download and expect an invalid hash (it doesn't matter what it is).
if BAZELISK_HOME="$BAZELISK_HOME" BAZELISK_VERIFY_SHA256="invalid-hash" \
bazelisk version 2>&1 | tee log; then
echo "FAIL: Command should have errored out"; exit 1
fi
grep "need sha256=invalid-hash" log || \
(echo "FAIL: Expected to find hash mismatch"; exit 1)
# IMPORTANT: The mixture of lowercase and uppercase letters in the hashes below is
# intentional to ensure the variable contents are normalized before comparison.
# If updating these values, re-introduce randomness.
local os="$(uname -s | tr A-Z a-z)"
case "${os}" in
darwin)
expected_sha256="dae351f491ead382bfc7c14d8957b9c8d735300c566c2161e34035eab994c1f2"
;;
linux)
expected_sha256="D93508529d41136065c7b1E5ff555fbfb9d18fd00e768886F2fc7dfb53b05B43"
;;
msys*|mingw*|cygwin*)
expected_sha256="9fb6f439e2eb646b9bae7bd2c0317165c0b08abc0bba25f6af53180fa1f86997"
;;
*)
echo "FAIL: Unknown OS ${os} in test"
exit 1
;;
esac
# Now try the same download as before but with the correct hash expectation. Note that the
# hash has a random uppercase / lowercase mixture to ensure this does not impact equality
# checks.
BAZELISK_HOME="$BAZELISK_HOME" BAZELISK_VERIFY_SHA256="${expected_sha256}" \
bazelisk version 2>&1 | tee log
grep "Build label:" log || \
(echo "FAIL: Expected to find 'Build label' in the output of 'bazelisk version'"; exit 1)
}
function test_bazel_download_path_py() {
setup
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk version 2>&1 | tee log
find "$BAZELISK_HOME/downloads/bazelbuild" 2>&1 | tee log
# 7.1.0 is the latest release in releases_for_tests.json
grep "^$BAZELISK_HOME/downloads/bazelbuild/bazel-7.1.0-[a-z0-9_-]*/bin/bazel\(.exe\)\?$" log || \
(echo "FAIL: Expected to download bazel binary into specific path."; exit 1)
}
function test_bazel_prepend_binary_directory_to_path_go() {
setup
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk --print_env 2>&1 | tee log
local os="$(uname -s | tr A-Z a-z)"
case "${os}" in
darwin|linux)
path_entry_delimiter=":"
path_delimiter="/"
extension=""
;;
msys*|mingw*|cygwin*)
path_entry_delimiter=";"
path_delimiter="\\"
extension=".exe"
;;
*)
echo "FAIL: Unknown OS ${os} in test"
exit 1
;;
esac
path_entry="$(grep "^PATH=" log | cut -d= -f2- | cut -d"${path_entry_delimiter}" -f1)"
[[ -x "${path_entry}${path_delimiter}bazel${extension}" ]] || \
(echo "FAIL: Expected PATH to contains bazel binary directory."; exit 1)
}
function test_bazel_prepend_binary_directory_to_path_py() {
setup
BAZELISK_HOME="$BAZELISK_HOME" \
bazelisk --print_env 2>&1 | tee log
# 7.1.0 is the latest release in releases_for_tests.json
PATTERN=$(echo "^PATH=$BAZELISK_HOME/downloads/bazelbuild/bazel-7.1.0-[a-z0-9_-]*/bin[:;]" | sed -e 's/\//\[\/\\\\\]/g')
grep "$PATTERN" log || \
(echo "FAIL: Expected PATH to contains bazel binary directory."; exit 1)
}
echo "# test_bazel_version_from_environment"
test_bazel_version_from_environment
echo
echo "# test_bazel_version_prefer_environment_to_bazeliskrc"
test_bazel_version_prefer_environment_to_bazeliskrc
echo
echo "# test_bazel_version_from_workspace_bazeliskrc"
test_bazel_version_from_workspace_bazeliskrc
echo
echo "# test_bazel_version_from_file"
test_bazel_version_from_file
echo
echo "# test_bazel_last_green"
test_bazel_last_green
echo
echo "# test_BAZELISK_NOJDK"
test_BAZELISK_NOJDK
echo
if [[ $BAZELISK_VERSION == "GO" ]]; then
echo "# test_bazel_version_go"
test_bazel_version_go
echo
echo "# test_bazel_latest_minus_3_go"
test_bazel_latest_minus_3_go
echo
echo "# test_bazel_last_rc"
test_bazel_last_rc
echo
echo "# test_bazel_version_from_format_url"
test_bazel_version_from_format_url
echo
echo "# test_bazel_version_from_base_url"
test_bazel_version_from_base_url
echo
echo "# test_bazel_version_from_user_home_bazeliskrc"
test_bazel_version_from_user_home_bazeliskrc
echo
echo "# test_bazel_version_prefer_workspace_bazeliskrc_to_user_home_bazeliskrc"
test_bazel_version_prefer_workspace_bazeliskrc_to_user_home_bazeliskrc
echo
echo "# test_bazel_version_prefer_bazeliskrc_to_bazelversion_file"
test_bazel_version_prefer_bazeliskrc_to_bazelversion_file
echo
echo '# test_bazel_download_path_go'
test_bazel_download_path_go
echo
echo '# test_bazel_verify_sha256'
test_bazel_verify_sha256
echo
echo "# test_bazel_prepend_binary_directory_to_path_go"
test_bazel_prepend_binary_directory_to_path_go
echo
echo "# test_path_is_consistent_regardless_of_base_url"
test_path_is_consistent_regardless_of_base_url
echo
case "$(uname -s)" in
MSYS*)
# The tests are currently not compatible with Windows.
;;
*)
echo "# test_delegate_to_wrapper"
test_delegate_to_wrapper
echo
echo "# test_skip_wrapper"
test_skip_wrapper
echo
;;
esac
else
echo "# test_bazel_version_py"
test_bazel_version_py
echo
echo "# test_bazel_latest_minus_3_py"
test_bazel_latest_minus_3_py
echo
echo '# test_bazel_download_path_py'
test_bazel_download_path_py
echo
echo "# test_bazel_prepend_binary_directory_to_path_py"
test_bazel_prepend_binary_directory_to_path_py
echo
fi