diff options
author | 2016-09-13 10:20:04 +0000 | |
---|---|---|
committer | 2016-09-13 12:32:11 +0000 | |
commit | eaa5730fbc71fe142fd0c753dd056a2f3f16d5ee (patch) | |
tree | bce22c8a24cbbf4e1b1968e7230ad2a253bd93d7 | |
parent | 402dae7602e8e7db0915915637969440c70c01fc (diff) |
Open source bazel_query_test
--
MOS_MIGRATED_REVID=132980407
-rw-r--r-- | src/test/shell/integration/BUILD | 7 | ||||
-rwxr-xr-x | src/test/shell/integration/bazel_query_test.sh | 263 |
2 files changed, 270 insertions, 0 deletions
diff --git a/src/test/shell/integration/BUILD b/src/test/shell/integration/BUILD index 9654fb53b5..1b34fa4295 100644 --- a/src/test/shell/integration/BUILD +++ b/src/test/shell/integration/BUILD @@ -69,6 +69,13 @@ sh_test( ) sh_test( + name = "bazel_query_test", + size = "medium", + srcs = ["bazel_query_test.sh"], + data = [":test-deps"], +) + +sh_test( name = "ui_test", size = "medium", srcs = ["ui_test.sh"], diff --git a/src/test/shell/integration/bazel_query_test.sh b/src/test/shell/integration/bazel_query_test.sh new file mode 100755 index 0000000000..9138b683dc --- /dev/null +++ b/src/test/shell/integration/bazel_query_test.sh @@ -0,0 +1,263 @@ +#!/bin/bash +# +# Copyright 2016 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. +# +# bazel_query_test.sh: integration tests for bazel query + +# Load test environment +source $(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/testenv.sh \ + || { echo "testenv.sh not found!" >&2; exit 1; } + +put_bazel_on_path +create_and_cd_client +write_default_bazelrc + +add_to_bazelrc "build --package_path=%workspace%" + +#### TESTS ############################################################# + +function test_does_not_fail_horribly() { + mkdir -p peach + cat > peach/BUILD <<EOF +sh_library(name='brighton', deps=[':harken']) +sh_library(name='harken') +EOF + + bazel query 'deps(//peach:brighton)' > $TEST_log + + expect_log "//peach:brighton" + expect_log "//peach:harken" +} + +function test_visibility_affects_xml_output() { + mkdir -p kiwi + + cat > kiwi/BUILD <<EOF +sh_library(name='kiwi', visibility=['//visibility:private']) +EOF + bazel query --output=xml '//kiwi:kiwi' > output_private + + cat > kiwi/BUILD <<EOF +sh_library(name='kiwi', visibility=['//visibility:public']) +EOF + bazel query --output=xml '//kiwi:kiwi' > output_public + + cat > kiwi/BUILD <<EOF +sh_library(name='kiwi') +EOF + bazel query --output=xml '//kiwi:kiwi' > output_none + + cmp output_private output_public && fail "visibility does not affect XML output" + cmp output_none output_private && fail "visibility does not affect XML output" + cmp output_none output_public && fail "visibility does not affect XML output" + + assert_contains "//kiwi:kiwi" output_private + assert_contains "//kiwi:kiwi" output_public + assert_contains "//kiwi:kiwi" output_none + + assert_contains "//visibility:private" output_private + assert_contains "//visibility:public" output_public + assert_not_contains "//visibility:private" output_none + assert_not_contains "//visibility:public" output_none +} + +function test_visibility_affects_proto_output() { + mkdir -p kiwi + + cat > kiwi/BUILD <<EOF +sh_library(name='kiwi', visibility=['//visibility:private']) +EOF + bazel query --output=proto '//kiwi:kiwi' > output_private + + cat > kiwi/BUILD <<EOF +sh_library(name='kiwi', visibility=['//visibility:public']) +EOF + bazel query --output=proto '//kiwi:kiwi' > output_public + + # There is no check for unspecified visibility because proto output format + # adds every attribute to the output, regardless of whether they are specified + # or have the default value + + cmp output_private output_public && fail "visibility does not affect proto output" + + assert_contains "//kiwi:kiwi" output_private + assert_contains "//kiwi:kiwi" output_public + + assert_contains "//visibility:private" output_private + assert_contains "//visibility:public" output_public +} + +function make_depth_tests() { + mkdir -p depth depth2 || die "Could not create test directory" + cat > "depth/BUILD" <<EOF +sh_binary(name = 'one', srcs = ['one.sh'], deps = [':two']) +sh_library(name = 'two', srcs = ['two.sh'], + deps = [':div2', ':three', '//depth2:three']) +sh_library(name = 'three', srcs = ['three.sh'], deps = [':four']) +sh_library(name = 'four', srcs = ['four.sh'], deps = [':div2', ':five']) +sh_library(name = 'five', srcs = ['five.sh']) +sh_library(name = 'div2', srcs = ['two.sh']) +EOF + + echo "sh_library(name = 'three', srcs = ['three.sh'])" > depth2/BUILD + + touch depth/{one,two,three,four,five}.sh depth2/three.sh + chmod a+x depth/*.sh depth2/*.sh +} + +# Running a deps query twice should return results in the same order +# if output is sorted, otherwise just the same results. +function assert_depth_query_idempotence() { + order_results="$1" + if $order_results ; then + add_to_bazelrc "query --order_output=auto" + universe_arg="" + else + add_to_bazelrc "query --order_output=no" + universe_arg=--universe_scope=//depth:* + fi + make_depth_tests + last_log="$TEST_log.last" + for run in {1..5}; do + # Only compare the output stream with the query results. + mv -f $TEST_log $last_log + bazel query 'deps(//depth:one, 4)' $universe_arg > $TEST_log \ + || fail "Expected success" + if [ $run -gt 1 ]; then + if $order_results ; then + diff $TEST_log $last_log || \ + fail "Lines differed between query results: $last_log" + else + diff <(sort $TEST_log) <(sort $last_log) || \ + fail "Lines differed between sorted query results" + fi + fi + done + rm -f $last_log || die "Could not remove $last_log" +} + +function test_depth_query_idempotence_ordered() { + assert_depth_query_idempotence true +} + +function test_depth_query_idempotence_unordered() { + assert_depth_query_idempotence false +} + +function test_universe_scope_with_without_star() { + mkdir -p foo || fail "Couldn't mkdir" + echo "sh_library(name = 'foo')" > foo/BUILD || fail "Couldn't write BUILD" + bazel query --order_output=no \ + --universe_scope=//foo/... '//foo:BUILD' >& $TEST_log || + fail "Expected success" + # This is documenting current behavior, rather than enforcing a contract. For + # performance and code simplicity, we return targets if their package was + # loaded, so //foo:BUILD exists as a target (although its deps and rdeps are + # unknown). + expect_log "//foo:BUILD" + bazel query --order_output=no \ + --universe_scope=//foo/...:* '//foo:BUILD' >& $TEST_log || + fail "Expected success" + expect_log "//foo:BUILD" +} + +function test_outside_universe_ok() { + mkdir -p foo bar || fail "Couldn't mkdir" + echo "sh_library(name = 'foo', deps = ['//bar:bar'])" > foo/BUILD || + fail "Couldn't write BUILD" + cat <<'EOF' > bar/BUILD || fail "Couldn't write BUILD" +sh_library(name = 'bar') +sh_library(name = 'dep') +sh_library(name = 'top', deps = [':dep']) +EOF + bazel query --order_output=no \ + --universe_scope=//foo/...:* 'allrdeps(//bar:BUILD)' >& $TEST_log || + fail "Expected success" + # This is documenting current behavior, rather than enforcing a contract. See + # corresponding comment in test_universe_scope_with_without_star. + expect_log "//bar:BUILD" + bazel query --order_output=no \ + --universe_scope=//foo/...:* 'allrdeps(//bar:dep)' >& $TEST_log || + fail "Expected success" + # This is documenting current behavior, rather than enforcing a contract. See + # corresponding comment in test_universe_scope_with_without_star. In this + # case, even though we return //bar:dep, we do not see its rdep //bar:top. + expect_log "//bar:dep" + expect_not_log "//bar:top" +} + +# Since all targets in deps(..., n) are accessible n steps away, none should +# have a minrank greater than n. +function test_minrank_le_depth_bound() { + make_depth_tests + for depth in {5..0}; do + bazel query "deps(//depth:one, $depth)" --output=minrank > $TEST_log \ + || fail "Expected success" + for rank in $(cut -d' ' -f 1 $TEST_log); do + [ $rank -le $depth ] || fail "Expected max minrank of $depth, was $rank" + done + done +} + +function test_skylark_dep_in_sky_query() { + mkdir -p foo bar || fail "Couldn't make directories" + echo 'load("/bar/fakerule", "const")' > foo/BUILD || fail "Couldn't write" + touch bar/BUILD || fail "Couldn't touch bar/BUILD" + echo 'const = 2' > bar/fakerule.bzl || fail "Couldn't write fakerule" + bazel query --universe_scope=//foo/...:* --order_output=no \ + 'rbuildfiles(bar/fakerule.bzl)' >& $TEST_log || fail "Expected success" + expect_log_once "//foo:BUILD" + expect_not_log "//bar:BUILD" + expect_not_log "fakerule\.bzl" +} + +function test_skylark_subdir_dep_in_sky_query() { + mkdir -p foo bar/baz || fail "Couldn't make directories" + echo 'load("/bar/baz/fakerule", "const")' > foo/BUILD || fail "Couldn't write" + touch bar/BUILD || fail "Couldn't touch bar/BUILD" + echo 'const = 2' > bar/baz/fakerule.bzl || fail "Couldn't write fakerule" + bazel query --universe_scope=//foo/...:* --order_output=no \ + 'rbuildfiles(bar/baz/fakerule.bzl)' >& $TEST_log || fail "Expected success" + expect_log_once "//foo:BUILD" + expect_not_log "//bar:BUILD" + expect_not_log "fakerule\.bzl" +} + +function test_parent_independent_of_child() { + mkdir -p foo/subdir || fail "Couldn't make directories" + echo 'sh_library(name = "sh", data = glob(["**"]))' > foo/BUILD || + fail "Couldn't write" + touch foo/subdir/BUILD || fail "Couldn't touch foo/subdir/BUILD" + bazel query --universe_scope=//foo/...:* --order_output=no \ + 'rbuildfiles(foo/subdir/BUILD)' >& $TEST_log || fail "Expected success" + expect_log_once "//foo/subdir:BUILD" + expect_not_log "//foo:BUILD" +} + +function test_does_not_fail_horribly_with_file() { + mkdir -p peach + cat > peach/BUILD <<EOF +sh_library(name='brighton', deps=[':harken']) +sh_library(name='harken') +EOF + + echo "deps(//peach:brighton)" > query_file + bazel query --query_file=query_file > $TEST_log + + expect_log "//peach:brighton" + expect_log "//peach:harken" +} + +run_suite "bazel query tests" |