blob: 41bc3773d7e1449b0a2a69a7704dd7b190ca1f19 [file] [log] [blame]
#!/bin/bash
#
# Copyright 2020 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.
# End-to-end test for builtins injection and the various values of
# --experimental_builtins_bzl_path.
# --- 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; }
# `uname` returns the current platform, e.g "MSYS_NT-10.0" or "Linux".
# `tr` converts all upper case letters to lower case.
# `case` matches the result if the `uname | tr` expression to string prefixes
# that use the same wildcards as names do in Bash, i.e. "msys*" matches strings
# starting with "msys", and "*" matches everything (it's the default case).
case "$(uname -s | tr [:upper:] [:lower:])" in
msys*)
# As of 2018-08-14, Bazel on Windows only supports MSYS Bash.
declare -r is_windows=true
;;
*)
declare -r is_windows=false
;;
esac
if "$is_windows"; then
# Disable MSYS path conversion that converts path-looking command arguments to
# Windows paths (even if they arguments are not in fact paths).
export MSYS_NO_PATHCONV=1
export MSYS2_ARG_CONV_EXCL="*"
fi
# override rules_java in bazel otherwise no build succeeds without injection
[[ $(type -t mock_rules_java_to_avoid_downloading) == function ]] && mock_rules_java_to_avoid_downloading
function test_injection() {
# //pkg prints _builtins_dummy when loaded.
mkdir pkg
cat > pkg/BUILD <<'EOF'
load(":foo.bzl", "foo")
foo()
EOF
cat > pkg/foo.bzl <<'EOF'
def foo():
print("dummy :: " + str(_builtins_dummy))
EOF
# Provide a different value for the dummy at the path where builtins_bzl is
# expected to be in a Bazel source tree.
mkdir -p "$BUILTINS_PACKAGE_PATH_IN_SOURCE"
cat > "$BUILTINS_PACKAGE_PATH_IN_SOURCE/exports.bzl" <<'EOF'
exported_toplevels = {"_builtins_dummy": "workspace value"}
exported_rules = {}
exported_to_java = {}
EOF
# Provide yet another value at a different arbitrary path.
mkdir alternate
cat > alternate/exports.bzl <<'EOF'
exported_toplevels = {"_builtins_dummy": "alternate value"}
exported_rules = {}
exported_to_java = {}
EOF
# Override the default exec transition (which is in builtins) to avoid
# interfering with builtins injection.
mkdir exec
cat > exec/BUILD <<'EOF'
EOF
cat > exec/dummy_exec_platforms.bzl <<'EOF'
noop = transition(
implementation = lambda settings, attr: { '//command_line_option:is exec configuration': True },
inputs = [],
outputs = ['//command_line_option:is exec configuration']
)
EOF
# With injection disabled.
#
# TODO(#11437): Remove this case once builtins injection can no longer be
# disabled. Note that eventually, rule migration to Starlark will cause
# implicit dependencies/tools to rely on injection, so even a trivial build
# without injection may break. (That may also mean we have to update this test
# at some point, so that the other builtins roots are based on the one in the
# install base, instead of being virtually empty.)
bazel build --nobuild //pkg:BUILD --experimental_builtins_dummy=true \
--experimental_builtins_bzl_path= \
--experimental_exec_config=//exec:dummy_exec_platforms.bzl%noop \
&>"$TEST_log" || fail "bazel build failed"
expect_log "dummy :: original value"
# Using the builtins root that's bundled with bazel.
bazel build --nobuild //pkg:BUILD --experimental_builtins_dummy=true \
--experimental_builtins_bzl_path=%bundled% \
--experimental_exec_config=//exec:dummy_exec_platforms.bzl%noop \
&>"$TEST_log" || fail "bazel build failed"
# "overridden value" comes from the exports.bzl in production Bazel.
expect_log "dummy :: overridden value"
# Using the builtins root located within the client workspace, as if we're
# running Bazel in its own source tree.
bazel build --nobuild //pkg:BUILD --experimental_builtins_dummy=true \
--experimental_builtins_bzl_path=%workspace% \
--experimental_exec_config=//exec:dummy_exec_platforms.bzl%noop \
&>"$TEST_log" || fail "bazel build failed"
expect_log "dummy :: workspace value"
# Using the builtins root at the path given to the flag. (Need not be within
# workspace, though this one is.)
bazel build --nobuild //pkg:BUILD --experimental_builtins_dummy=true \
--experimental_builtins_bzl_path=alternate \
--experimental_exec_config=//exec:dummy_exec_platforms.bzl%noop \
&>"$TEST_log" || fail "bazel build failed"
expect_log "dummy :: alternate value"
# Try an incremental updates to the builtins .bzl files.
cat > alternate/exports.bzl <<'EOF'
exported_toplevels = {"_builtins_dummy": "second alternate value"}
exported_rules = {}
exported_to_java = {}
EOF
bazel build --nobuild //pkg:BUILD --experimental_builtins_dummy=true \
--experimental_builtins_bzl_path=alternate \
--experimental_exec_config=//exec:dummy_exec_platforms.bzl%noop \
&>"$TEST_log" || fail "bazel build failed"
expect_log "dummy :: second alternate value"
# Ensure builtins .bzl files aren't visible to bazel query the way normal .bzl
# files are.
bazel query 'buildfiles(//pkg:BUILD)' --experimental_builtins_dummy=true \
--experimental_builtins_bzl_path=alternate \
&>"$TEST_log" || fail "bazel query failed"
expect_not_log "exports.bzl"
}
run_suite "builtins_injection_test"