blob: a22d1db88648185564151973c6fb16655d395098 [file] [log] [blame]
#!/bin/bash
# Copyright 2022 Google LLC
#
# 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.
################################################################################
# This script runs all the Bazel tests within a given workspace directory.
#
# Users must spcify the WORKSPACE directory. Optionally, the user can specify
# a set of additional manual targets to run.
#
# Note: -E extends the trap to shell functions, command substitutions, and
# commands executed in a subshell environment.
set -eEo pipefail
# Print some debug output on error before exiting.
trap print_debug_output ERR
usage() {
echo "Usage: $0 [-mh] [-b <build parameter> ...] [-t <test parameter> ...] \\"
echo " <workspace directory> [<manual target> <manual target> ...]"
echo " -m: Runs only the manual targets. If set, manual targets must be"
echo " provided."
echo " -b: Comma separated list of flags to pass to `bazel build`."
echo " -t: Comma separated list of flags to pass to `bazel test`."
echo " -h: Help. Print this usage information."
exit 1
}
readonly PLATFORM="$(uname | tr '[:upper:]' '[:lower:]')"
MANUAL_ONLY="false"
WORKSPACE_DIR=
MANUAL_TARGETS=
BAZEL_CMD="bazel"
BUILD_FLAGS=()
TEST_FLAGS=()
#######################################
# Process command line arguments.
#
# Globals:
# WORKSPACE_DIR
# MANUAL_TARGETS
#######################################
process_args() {
# Parse options.
while getopts "mhb:t:" opt; do
case "${opt}" in
m) MANUAL_ONLY="true" ;;
b) BUILD_FLAGS=($(echo "${OPTARG}" | tr ',' '\n')) ;;
t) TEST_FLAGS=($(echo "${OPTARG}" | tr ',' '\n')) ;;
*) usage ;;
esac
done
shift $((OPTIND - 1))
WORKSPACE_DIR="$1"
readonly WORKSPACE_DIR
if [[ -z "${WORKSPACE_DIR}" ]]; then
usage
fi
shift 1
MANUAL_TARGETS=("$@")
readonly MANUAL_TARGETS
if [[ "${MANUAL_ONLY}" == "true" ]] && (( ${#MANUAL_TARGETS[@]} == 0 )); then
usage
fi
# Use Bazelisk (https://github.com/bazelbuild/bazelisk) if available.
if command -v "bazelisk" &> /dev/null; then
BAZEL_CMD="bazelisk"
fi
readonly BAZEL_CMD
echo "Using: $(which ${BAZEL_CMD})"
}
#######################################
# Print some debugging output.
#######################################
print_debug_output() {
ls -l
df -h
}
main() {
process_args "$@"
TEST_FLAGS+=(
--strategy=TestRunner=standalone
--test_output=all
)
local -r workspace_dir="$(cd ${WORKSPACE_DIR} && pwd)"
if [[ "${PLATFORM}" == 'darwin' ]]; then
TEST_FLAGS+=( --jvmopt="-Djava.net.preferIPv6Addresses=true" )
if [[ "${workspace_dir}" =~ javascript ]]; then
BUILD_FLAGS+=( --experimental_inprocess_symlink_creation )
TEST_FLAGS+=( --experimental_inprocess_symlink_creation )
fi
fi
readonly BUILD_FLAGS
readonly TEST_FLAGS
(
set -x
cd "${workspace_dir}"
if [[ "${MANUAL_ONLY}" == "false" ]]; then
time "${BAZEL_CMD}" build "${BUILD_FLAGS[@]}" -- ...
# Exit code 4 means targets build correctly but no tests were found. See
# https://bazel.build/docs/scripts#exit-codes.
bazel_test_return=0
time "${BAZEL_CMD}" test "${TEST_FLAGS[@]}" -- ... || bazel_test_return="$?"
if (( $bazel_test_return != 0 && $bazel_test_return != 4 )); then
return "${bazel_test_return}"
fi
fi
# Run specific manual targets.
if (( ${#MANUAL_TARGETS[@]} > 0 )); then
time "${BAZEL_CMD}" build "${BUILD_FLAGS[@]}" -- "${MANUAL_TARGETS[@]}"
time "${BAZEL_CMD}" test "${TEST_FLAGS[@]}" -- "${MANUAL_TARGETS[@]}"
fi
)
}
main "$@"