#!/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. # Load the test setup defined in the parent directory CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${CURRENT_DIR}/../integration_test_setup.sh" \ || { echo "integration_test_setup.sh not found!" >&2; exit 1; } function test_workspace_status_invalidation() { create_new_workspace local ok=$TEST_TMPDIR/ok.sh local bad=$TEST_TMPDIR/bad.sh cat > $ok <$bad < a/BUILD <<'EOF' genrule(name="a", srcs=[], outs=["a.out"], stamp=1, cmd="touch $@") EOF bazel build --stamp //a --workspace_status_command=$bad \ && fail "build succeeded" bazel build --stamp //a --workspace_status_command=$ok \ || fail "build failed" } function test_workspace_status_parameters() { create_new_workspace local cmd=`mktemp $TEST_TMPDIR/wsc-XXXXXXXX` cat > $cmd < a/BUILD <<'EOF' genrule( name="a", srcs=[], outs=["a.out"], stamp=1, cmd="touch $@") EOF bazel build --stamp //a --workspace_status_command=$cmd || fail "build failed" grep -sq "BUILD_SCM_STATUS funky" bazel-out/volatile-status.txt \ || fail "BUILD_SCM_STATUS not found" } function test_workspace_status_cpp() { create_new_workspace local cmd=`mktemp $TEST_TMPDIR/wsc-XXXXXXXX` cat > $cmd < a/linkstamped_library.cc <<'EOF' #include ::std::string BuildScmStatus() { return BUILD_SCM_STATUS; } EOF cat > a/verify_scm_status.cc <<'EOF' #include #include ::std::string BuildScmStatus(); int main() { ::std::cout << "BUILD_SCM_STATUS is: " << BuildScmStatus(); return ("funky" == BuildScmStatus()) ? 0 : 1; } EOF cat > a/BUILD <<'EOF' cc_library( name="linkstamped_library", linkstamp="linkstamped_library.cc") cc_test( name="verify_scm_status", stamp=True, srcs=["verify_scm_status.cc"], deps=[":linkstamped_library"]) EOF bazel test --stamp //a:verify_scm_status --workspace_status_command=$cmd || fail "build failed" } function test_errmsg() { create_new_workspace cat > BUILD <<'EOF' genrule( name = "a", srcs = [], outs = ["ao"], cmd="echo whatever > $@", stamp=1, ) EOF bazel build --workspace_status_command=$TEST_TMPDIR/wscmissing.sh --stamp //:a &> $TEST_log \ && fail "build succeeded" expect_log "wscmissing.sh: No such file or directory\|wscmissing.sh: not found" } function test_stable_and_volatile_status() { create_new_workspace local wsc=`mktemp $TEST_TMPDIR/wsc-XXXXXXXX` cat >$wsc < BUILD <<'EOF' genrule( name = "a", srcs = [], outs = ["ao"], cmd="(echo volatile; cat bazel-out/volatile-status.txt; echo; echo stable; cat bazel-out/stable-status.txt; echo) > $@", stamp=1) EOF cat >$TEST_TMPDIR/status <$TEST_TMPDIR/status <$TEST_TMPDIR/status <$wsc <<'EOF' #!/bin/bash echo "STABLE_ENV" ${STABLE_VAR} echo "VOLATILE_ENV" ${VOLATILE_VAR} EOF chmod +x $wsc cat > BUILD <<'EOF' genrule( name = "a", srcs = [], outs = ["ao"], cmd="(echo volatile; cat bazel-out/volatile-status.txt; echo; echo stable; cat bazel-out/stable-status.txt; echo) > $@", stamp=1) EOF STABLE_VAR=alice VOLATILE_VAR=one bazel build --workspace_status_command=$wsc --stamp //:a || fail "build failed" assert_contains "STABLE_ENV alice" bazel-out/stable-status.txt assert_contains "VOLATILE_ENV one" bazel-out/volatile-status.txt assert_contains "STABLE_ENV alice" bazel-genfiles/ao assert_contains "VOLATILE_ENV one" bazel-genfiles/ao # Changes to the env var should be reflected into the stable-status file, and thus trigger a rebuild STABLE_VAR=bob VOLATILE_VAR=two bazel build --workspace_status_command=$wsc --stamp //:a || fail "build failed" assert_contains "STABLE_ENV bob" bazel-out/stable-status.txt assert_contains "VOLATILE_ENV two" bazel-out/volatile-status.txt assert_contains "STABLE_ENV bob" bazel-genfiles/ao assert_contains "VOLATILE_ENV two" bazel-genfiles/ao # Changes to volatile fields should not result in a rebuild (but should update the stable & volatile status files) STABLE_VAR=bob VOLATILE_VAR=three bazel build --workspace_status_command=$wsc --stamp //:a || fail "build failed" assert_contains "STABLE_ENV bob" bazel-out/stable-status.txt assert_contains "VOLATILE_ENV three" bazel-out/volatile-status.txt # We did not rebuild, so the output remains at the previous values assert_contains "STABLE_ENV bob" bazel-genfiles/ao assert_contains "VOLATILE_ENV two" bazel-genfiles/ao } run_suite "workspace status tests"