#!/bin/bash # # Copyright 2015 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. # # Test rules provided in Bazel not tested by examples # 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 --- source "$(rlocation "io_bazel/src/test/shell/integration_test_setup.sh")" \ || { echo "integration_test_setup.sh not found!" >&2; exit 1; } export MSYS_NO_PATHCONV=1 export MSYS2_ARG_CONV_EXCL="*" function test_sh_test() { mkdir -p a cat > a/BUILD < a/success_test.sh < a/fail_test.sh < mypkg/echoer.sh <<'EOF' #!/bin/bash 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 --- if [[ ! -e "$(rlocation __main__/mypkg/runfile)" ]]; then echo "ERROR: Runfile not found" >&2 exit 1 fi echo EXTRA ACTION FILE: \$1 EOF chmod +x mypkg/echoer.sh cat > mypkg/Hello.java < mypkg/BUILD <& $TEST_log \ || fail "Building with action listener failed" expect_log "EXTRA ACTION FILE" } function test_with_arguments() { mkdir -p mypkg cat > mypkg/BUILD < mypkg/check_expected_argument.sh < BUILD < true.sh <pkg/BUILD cc_library( name = "a", srcs = ["a.cc"], ) cc_library( name = "b", srcs = ["b.cc"], deps = [":a"], ) cc_binary( name = "main", srcs = ["main.cc"], deps = [":b"], ) EOF cat <<'EOF' >pkg/a.cc #include std::string get_hello(std::string world) { return "Hello, " + world + "!"; } EOF cat <<'EOF' >pkg/b.cc #include #include std::string get_hello(std::string); void print_hello(std::string world) { std::cout << get_hello(world) << std::endl; } EOF cat <<'EOF' >pkg/main.cc #include void print_hello(std::string); int main() { print_hello(std::string("World")); } EOF bazel build //pkg:a >& $TEST_log \ || fail "Failed to build //pkg:a" bazel build //pkg:b >& $TEST_log \ || fail "Failed to build //pkg:b" bazel run //pkg:main >& $TEST_log \ || fail "Failed to run //pkg:main" expect_log "Hello, World!" ./bazel-bin/pkg/main >& $TEST_log \ || fail "Failed to run //pkg:main" expect_log "Hello, World!" } function test_genrule_default_env() { mkdir -p pkg cat <<'EOF' >pkg/BUILD genrule( name = "test", outs = ["test.out"], cmd = select({ "@bazel_tools//src/conditions:windows": "(echo \"PATH=$$PATH\"; echo \"TMPDIR=$$TMP\") > $@", "//conditions:default": "(echo \"PATH=$$PATH\"; echo \"TMPDIR=$$TMPDIR\") > $@", }), ) EOF local old_path="${PATH}" local new_tmpdir="$(mktemp -d "${TEST_TMPDIR}/newfancytmpdirXXXXXX")" [ -d "${new_tmpdir}" ] || \ fail "Could not create new temporary directory ${new_tmpdir}" export PATH="$PATH_TO_BAZEL_WRAPPER:/bin:/usr/bin:/random/path" if is_windows; then local old_tmpdir="${TMP:-}" export TMP="${new_tmpdir}" else local old_tmpdir="${TMPDIR:-}" export TMPDIR="${new_tmpdir}" fi # shut down to force reload of the environment bazel shutdown bazel build //pkg:test --spawn_strategy=standalone \ || fail "Failed to build //pkg:test" if is_windows; then # As of 2018-07-10, Bazel on Windows sets the PATH to # "/usr/bin:/bin:" + $PATH of the Bazel server process. # # MSYS appears to convert path entries in PATH to Windows style when running # a native Windows process such as Bazel, but "cygpath -w /bin" returns # MSYS_ROOT + "\usr\bin". # The point is, the PATH will be quite different from what we expect on # Linux. Therefore only assert that the PATH contains # "$PATH_TO_BAZEL_WRAPPER" and "/random/path", ignore the rest. local -r EXPECTED_PATH=".*:$PATH_TO_BAZEL_WRAPPER:.*:/random/path" # new_tmpdir is based on $TEST_TMPDIR which is not Unix-style -- convert it. local -r EXPECTED_TMP="$(cygpath -u "$new_tmpdir")" else local -r EXPECTED_PATH="$PATH_TO_BAZEL_WRAPPER:/bin:/usr/bin:/random/path" local -r EXPECTED_TMP="$new_tmpdir" fi assert_contains "PATH=$EXPECTED_PATH" bazel-genfiles/pkg/test.out # Bazel respectes the client environment's TMPDIR. assert_contains "TMPDIR=${EXPECTED_TMP}$" bazel-genfiles/pkg/test.out if is_windows; then export TMP="${old_tmpdir}" else export TMPDIR="${old_tmpdir}" fi export PATH="${old_path}" } function test_genrule_remote() { cat > WORKSPACE < package/BUILD < package/in.sh << EOF #!/bin/sh echo "Hi" EOF chmod +x package/in.sh bazel build @r//package:abs_dep >$TEST_log 2>&1 || fail "Should build" } function test_genrule_remote_d() { cat > WORKSPACE < package/BUILD <<'EOF' genrule( name = "hi", outs = [ "a/b", "c/d" ], cmd = "echo 'hi' | tee $(@D)/a/b $(@D)/c/d", ) EOF bazel build @r//package:hi >$TEST_log 2>&1 || fail "Should build" expect_log "bazel-.*genfiles/external/r/package/a/b" expect_log "bazel-.*genfiles/external/r/package/c/d" } function test_genrule_toolchain_dependency { mkdir -p t cat > t/BUILD <$TEST_log 2>&1 || fail "Should build" expect_log "bazel-.*genfiles/t/version" expect_not_log "ls: cannot access" } function test_python_with_workspace_name() { create_new_workspace cd ${new_workspace_dir} mkdir -p {module_a,module_b} local remote_path="${new_workspace_dir}" cat > module_a/BUILD < module_b/BUILD < module_a/foo.py < module_b/bar.py < module_b/bar2.py < WORKSPACE < module1/BUILD < module2/BUILD < module1/fib.py < module2/bez.py <$TEST_log expect_log "The number is 42" expect_log "Print the number 42" expect_log "Fib(10) is 89" bazel run @remote//module_b:bar2 >$TEST_log expect_log "The number is 42" } function test_build_python_zip_with_middleman() { mkdir py touch py/data.txt cat > py/BUILD < py/bin.py < py/bin2.py < a/BUILD < visibility/BUILD < $TEST_log && fail "Expected failure" || true expect_log "Public or private visibility labels (e.g. //visibility:public or //visibility:private) cannot be used in combination with other labels" } run_suite "rules test"