| #!/bin/bash | |
| # Copyright 2018 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. | |
| 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; } | |
| # Bazel build arguments to disable the use of the sandbox. We have tests below | |
| # that configure a fake sandboxfs and they would fail if they were to use it. | |
| DISABLE_SANDBOX_ARGS=( | |
| --genrule_strategy=local | |
| --spawn_strategy=local | |
| ) | |
| function create_fake_sandboxfs() { | |
| local path="${1}"; shift | |
| cat >"${path}" <<EOF | |
| #! /bin/sh | |
| echo "ARGS: \${*}" 1>&2 | |
| while read line; do | |
| echo "Received: \${line}" 1>&2 | |
| if [ -z "\${line}" ]; then | |
| echo "Done" | |
| fi | |
| done | |
| EOF | |
| chmod +x "${path}" | |
| } | |
| function create_hello_package() { | |
| mkdir -p hello | |
| cat >hello/BUILD <<EOF | |
| cc_binary(name = "hello", srcs = ["hello.cc"]) | |
| EOF | |
| cat >hello/hello.cc <<EOF | |
| #include <stdio.h> | |
| int main(void) { printf("Hello, world!\n"); return 0; } | |
| EOF | |
| } | |
| function test_default_sandboxfs_from_path() { | |
| mkdir -p fake-tools | |
| create_fake_sandboxfs fake-tools/sandboxfs | |
| PATH="$(pwd)/fake-tools:${PATH}"; export PATH | |
| create_hello_package | |
| local output_base="$(bazel info output_base)" | |
| local sandbox_base="${output_base}/sandbox" | |
| # This test relies on a PATH change that is only recognized when the server | |
| # first starts up, so ensure there are no Bazel servers left behind. | |
| # | |
| # TODO(philwo): This is awful. The testing infrastructure should ensure | |
| # that tests cannot pollute each other's state, but at the moment that's not | |
| # the case. | |
| bazel shutdown | |
| bazel build \ | |
| "${DISABLE_SANDBOX_ARGS[@]}" \ | |
| --experimental_use_sandboxfs \ | |
| //hello >"${TEST_log}" 2>&1 || fail "Build should have succeeded" | |
| expect_log "Mounting sandboxfs instance" | |
| } | |
| function test_explicit_sandboxfs_not_found() { | |
| create_hello_package | |
| bazel build \ | |
| --experimental_use_sandboxfs \ | |
| --experimental_sandboxfs_path="/non-existent/sandboxfs" \ | |
| //hello >"${TEST_log}" 2>&1 && fail "Build succeeded but should have failed" | |
| expect_log "Failed to initialize sandbox: .*Cannot run .*/non-existent/" | |
| } | |
| function test_mount_unmount() { | |
| create_fake_sandboxfs fake-sandboxfs.sh | |
| create_hello_package | |
| local output_base="$(bazel info output_base)" | |
| local sandbox_base="${output_base}/sandbox" | |
| bazel build \ | |
| "${DISABLE_SANDBOX_ARGS[@]}" \ | |
| --experimental_use_sandboxfs \ | |
| --experimental_sandboxfs_path="$(pwd)/fake-sandboxfs.sh" \ | |
| --sandbox_debug \ | |
| //hello >"${TEST_log}" 2>&1 || fail "Build should have succeeded" | |
| expect_log "Mounting sandboxfs instance" | |
| expect_log "unmounting sandboxfs" | |
| # Dump fake sandboxfs' log for debugging. | |
| sed -e 's,^,SANDBOXFS: ,' "${sandbox_base}/sandboxfs.log" >>"${TEST_log}" | |
| grep -q "ARGS: .*${sandbox_base}/sandboxfs" "${sandbox_base}/sandboxfs.log" \ | |
| || fail "Cannot find expected mount point in sandboxfs mount call" | |
| } | |
| run_suite "sandboxfs-based sandboxing tests" |