| #!/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 set_up() { |
| LOCAL=$(pwd) |
| REMOTE=$TEST_TMPDIR/remote |
| |
| # Set up empty remote repo. |
| mkdir -p $REMOTE |
| touch $REMOTE/WORKSPACE |
| cat > $REMOTE/BUILD <<EOF |
| genrule( |
| name = "get-input", |
| outs = ["an-input"], |
| srcs = ["input"], |
| cmd = "cat \$< > \$@", |
| visibility = ["//visibility:public"], |
| ) |
| EOF |
| |
| # Set up local repo that uses $REMOTE as an external repo. |
| cat > $LOCAL/WORKSPACE <<EOF |
| local_repository( |
| name = "a", |
| path = "$REMOTE", |
| ) |
| EOF |
| cat > $LOCAL/BUILD <<EOF |
| genrule( |
| name = "b", |
| srcs = ["@a//:get-input"], |
| outs = ["b.out"], |
| cmd = "cat \$< > \$@", |
| ) |
| EOF |
| } |
| |
| function test_build_file_changes_are_noticed() { |
| cat > $REMOTE/BUILD <<EOF |
| SYNTAX ERROR |
| EOF |
| bazel build //:b &> $TEST_log && fail "Build succeeded" |
| expect_log "syntax error at 'ERROR'" |
| |
| cat > $REMOTE/BUILD <<EOF |
| genrule( |
| name = "get-input", |
| outs = ["a.out"], |
| cmd = "echo 'I come from @a' > \$@", |
| visibility = ["//visibility:public"], |
| ) |
| EOF |
| |
| bazel build //:b &> $TEST_log || fail "Build failed" |
| assert_contains "I come from @a" bazel-genfiles/b.out |
| } |
| |
| function test_external_file_changes_are_noticed() { |
| version="1.0" |
| cat > $REMOTE/input <<EOF |
| $version |
| EOF |
| bazel build //:b &> $TEST_log || fail "Build failed" |
| assert_contains $version bazel-genfiles/b.out |
| |
| version="2.0" |
| cat > $REMOTE/input <<EOF |
| $version |
| EOF |
| bazel build //:b &> $TEST_log || fail "Build failed" |
| assert_contains $version bazel-genfiles/b.out |
| } |
| |
| function test_symlink_changes_are_noticed() { |
| cat > $REMOTE/version1 <<EOF |
| 1.0 |
| EOF |
| cat > $REMOTE/version2 <<EOF |
| 2.0 |
| EOF |
| rm $REMOTE/input |
| ln -s $REMOTE/version1 $REMOTE/input |
| bazel build //:b &> $TEST_log || fail "Build failed" |
| assert_contains 1.0 bazel-genfiles/b.out |
| |
| rm $REMOTE/input |
| ln -s $REMOTE/version2 $REMOTE/input |
| bazel build //:b &> $TEST_log || fail "Build failed" |
| assert_contains 2.0 bazel-genfiles/b.out |
| } |
| |
| function test_parent_symlink_change() { |
| REMOTE1=$TEST_TMPDIR/remote1 |
| REMOTE2=$TEST_TMPDIR/remote2 |
| mkdir -p $REMOTE1 $REMOTE2 |
| cp -R $REMOTE/* $REMOTE1 |
| cp -R $REMOTE/* $REMOTE2 |
| cat > $REMOTE1/input <<EOF |
| 1.0 |
| EOF |
| cat > $REMOTE2/input <<EOF |
| 2.0 |
| EOF |
| rm -rf $REMOTE |
| ln -s $REMOTE1 $REMOTE |
| |
| bazel build //:b &> $TEST_log || fail "Build failed" |
| assert_contains 1.0 bazel-genfiles/b.out |
| |
| rm $REMOTE |
| ln -s $REMOTE2 $REMOTE |
| bazel build //:b &> $TEST_log || fail "Build failed" |
| assert_contains 2.0 bazel-genfiles/b.out |
| } |
| |
| function test_genrule_d_correctness() { |
| subdir=$REMOTE/b/c |
| mkdir -p $subdir |
| cat > $subdir/BUILD <<EOF |
| genrule( |
| name = "echo-d", |
| outs = ["d"], |
| cmd = "echo \$(@D) > \$@", |
| ) |
| EOF |
| bazel build @a//b/c:echo-d &> $TEST_log || fail "Build failed" |
| assert_contains "bazel-out/.*-fastbuild/.*/external/a/b/c" \ |
| "bazel-genfiles/external/a/b/c/d" |
| } |
| |
| function test_package_group_in_external_repos() { |
| REMOTE=$TEST_TMPDIR/r |
| mkdir -p $REMOTE/v $REMOTE/a v a |
| touch $REMOTE/WORKSPACE |
| |
| echo 'filegroup(name="rv", srcs=["//:fg"])' > $REMOTE/v/BUILD |
| echo 'filegroup(name="ra", srcs=["//:fg"])' > $REMOTE/a/BUILD |
| echo 'filegroup(name="mv", srcs=["@r//:fg"])' > v/BUILD |
| echo 'filegroup(name="ma", srcs=["@r//:fg"])' > a/BUILD |
| cat > $REMOTE/BUILD <<EOF |
| package_group(name="pg", packages=["//v"]) |
| filegroup(name="fg", visibility=[":pg"]) |
| EOF |
| |
| echo "local_repository(name='r', path='$REMOTE')" > WORKSPACE |
| bazel build @r//v:rv >& $TEST_log || fail "Build failed" |
| bazel build @r//a:ra >& $TEST_log && fail "Build succeeded" |
| expect_log "target '@r//:fg' is not visible" |
| bazel build //a:ma >& $TEST_log && fail "Build succeeded" |
| expect_log "target '@r//:fg' is not visible" |
| bazel build //v:mv >& $TEST_log && fail "Build succeeded" |
| expect_log "target '@r//:fg' is not visible" |
| |
| } |
| |
| # Regression test for #517. |
| function test_refs_btwn_repos() { |
| REMOTE1=$TEST_TMPDIR/remote1 |
| REMOTE2=$TEST_TMPDIR/remote2 |
| mkdir -p $REMOTE1 $REMOTE2 |
| touch $REMOTE1/WORKSPACE $REMOTE2/WORKSPACE |
| cat > $REMOTE1/input <<EOF |
| 1.0 |
| EOF |
| cat > $REMOTE1/BUILD <<EOF |
| exports_files(['input']) |
| EOF |
| cat > $REMOTE2/BUILD <<EOF |
| genrule( |
| name = "x", |
| srcs = ["@remote1//:input"], |
| cmd = "cat \$< > \$@", |
| outs = ["x.out"], |
| ) |
| EOF |
| cat > WORKSPACE <<EOF |
| local_repository( |
| name = "remote1", |
| path = "$REMOTE1", |
| ) |
| local_repository( |
| name = "remote2", |
| path = "$REMOTE2", |
| ) |
| EOF |
| |
| bazel build @remote2//:x &> $TEST_log || fail "Build failed" |
| assert_contains 1.0 bazel-genfiles/external/remote2/x.out |
| } |
| |
| function test_visibility_attributes_in_external_repos() { |
| REMOTE=$TEST_TMPDIR/r |
| mkdir -p $REMOTE/v $REMOTE/r |
| touch $REMOTE/WORKSPACE |
| |
| cat > $REMOTE/r/BUILD <<EOF |
| package(default_visibility=["//v:v"]) |
| filegroup(name='fg1') # Inherits default visibility |
| filegroup(name='fg2', visibility=["//v:v"]) |
| EOF |
| |
| cat > $REMOTE/v/BUILD <<EOF |
| package_group(name="v", packages=["//"]) |
| EOF |
| |
| cat >$REMOTE/BUILD <<EOF |
| filegroup(name="fg", srcs=["//r:fg1", "//r:fg2"]) |
| EOF |
| |
| cat > WORKSPACE <<EOF |
| local_repository(name = "r", path = "$REMOTE") |
| EOF |
| |
| cat > BUILD <<EOF |
| filegroup(name="fg", srcs=["@r//r:fg1", "@r//r:fg2"]) |
| EOF |
| |
| bazel build @r//:fg || fail "Build failed" |
| bazel build //:fg >& $TEST_log && fail "Build succeeded" |
| expect_log "target '@r//r:fg1' is not visible" |
| |
| } |
| |
| function test_select_in_external_repo() { |
| REMOTE=$TEST_TMPDIR/r |
| mkdir -p $REMOTE/a $REMOTE/c d |
| touch $REMOTE/WORKSPACE |
| |
| cat > $REMOTE/a/BUILD <<'EOF' |
| genrule( |
| name = "gr", |
| srcs = [], |
| outs = ["gro"], |
| cmd = select({ |
| "//c:one": "echo one > $@", |
| ":two": "echo two > $@", |
| "@//d:three": "echo three > $@", |
| "@//:four": "echo four > $@", |
| "//conditions:default": "echo default > $@", |
| })) |
| |
| config_setting(name = "two", values = { "define": "ARG=two" }) |
| EOF |
| |
| cat > $REMOTE/c/BUILD <<EOF |
| package(default_visibility=["//visibility:public"]) |
| config_setting(name = "one", values = { "define": "ARG=one" }) |
| EOF |
| |
| cat > WORKSPACE <<EOF |
| local_repository(name="r", path="$REMOTE") |
| EOF |
| |
| cat > d/BUILD <<EOF |
| package(default_visibility=["//visibility:public"]) |
| config_setting(name = "three", values = { "define": "ARG=three" }) |
| EOF |
| |
| cat > BUILD <<EOF |
| package(default_visibility=["//visibility:public"]) |
| config_setting(name = "four", values = { "define": "ARG=four" }) |
| EOF |
| |
| bazel build @r//a:gr || fail "build failed" |
| assert_contains "default" bazel-genfiles/external/r/a/gro |
| bazel build @r//a:gr --define=ARG=one|| fail "build failed" |
| assert_contains "one" bazel-genfiles/external/r/a/gro |
| bazel build @r//a:gr --define=ARG=two || fail "build failed" |
| assert_contains "two" bazel-genfiles/external/r/a/gro |
| bazel build @r//a:gr --define=ARG=three || fail "build failed" |
| assert_contains "three" bazel-genfiles/external/r/a/gro |
| bazel build @r//a:gr --define=ARG=four || fail "build failed" |
| assert_contains "four" bazel-genfiles/external/r/a/gro |
| |
| } |
| |
| function top_level_dir_changes_helper() { |
| batch_flag="$1" |
| mkdir -p r/subdir m |
| touch r/one r/subdir/two |
| |
| cat > m/WORKSPACE <<'EOF' |
| new_local_repository( |
| name = "r", |
| path = "../r", |
| build_file_content = """ |
| genrule( |
| name = "fg", |
| cmd = "ls $(SRCS) > $@", |
| srcs=glob(["**"]), |
| outs = ["fg.out"], |
| )""", |
| ) |
| EOF |
| cd m |
| bazel "$batch_flag" build @r//:fg &> $TEST_log || \ |
| fail "Expected build to succeed" |
| touch ../r/three |
| bazel "$batch_flag" build @r//:fg &> $TEST_log || \ |
| fail "Expected build to succeed" |
| assert_contains "external/r/three" bazel-genfiles/external/r/fg.out |
| touch ../r/subdir/four |
| bazel "$batch_flag" build @r//:fg &> $TEST_log || \ |
| fail "Expected build to succeed" |
| assert_contains "external/r/subdir/four" bazel-genfiles/external/r/fg.out |
| } |
| |
| function test_top_level_dir_changes_batch() { |
| top_level_dir_changes_helper --batch |
| } |
| |
| function test_top_level_dir_changes_nobatch() { |
| top_level_dir_changes_helper --nobatch |
| } |
| |
| function test_non_extsietnt_repo_in_pattern() { |
| bazel build @non_existent_repo//... &> $TEST_log && fail "Expected build to fail" |
| expect_log "ERROR: No such repository '@non_existent_repo'" |
| } |
| |
| run_suite "//external correctness tests" |