blob: b663acc544ad56afcf67875aa8d791c8b8d9cf1d [file] [log] [blame]
#!/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"