#!/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}" <&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 <hello/hello.cc < 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"