blob: 5d54cc0410f90a3d011127ed1fd09a5d50c17c14 [file] [log] [blame]
#!/bin/bash
#
# Runner script for the test_on_env Bazel build rule.
CMDLINE_ARGS=$@
# These will be populated/overwritten from command-line flags.
TEST_BIN=
ENV_BIN=
READY_CHECK_TIMEOUT=5
printUsageAndDie() {
echo "Usage: $0 <flags>"
echo ""
echo "Required flags:"
echo " -t, --test-bin <path> path to the test bianry"
echo " -e, --env-bin <path> path to the environment binary"
echo ""
echo "Optional flags:"
echo " -r, --ready-check-timeout-secs <s> wait up to <s> seconds for the environment to be ready"
exit 1
}
parseFlags() {
options=$(getopt -u --name $0 \
--options t:e:r: \
--longoptions test-bin:,env-bin:,ready-check-timeout-secs: \
-- ""$CMDLINE_ARGS"")
if [ $? != "0" ]; then
printUsageAndDie
fi
set -- $options
while true; do
case "$1"
in
-t|--test-bin)
TEST_BIN="$2"; shift;;
-e|--env-bin)
ENV_BIN="$2"; shift;;
-r|--ready-check-timeout-secs)
READY_CHECK_TIMEOUT="$2"; shift;;
--)
shift; break;;
*)
printUsageAndDie;;
esac
shift
done
# Validate required flags.
if [[ -z "$TEST_BIN" || -z "$ENV_BIN" ]]; then
printUsageAndDie
fi
}
log() {
echo "[test_on_env] $1"
}
main() {
parseFlags
# Set shared environment variables. Both the environment and the test binaries will see this.
export ENV_DIR=$TEST_TMPDIR/envdir
export ENV_READY_FILE=$ENV_DIR/ready
mkdir $ENV_DIR
log "Starting test_on_env test..."
log " Path to environment binary = $ENV_BIN"
log " Path to test binary = $TEST_BIN"
log " Ready check timeout (secs) = $READY_CHECK_TIMEOUT"
log " TEST_TMPDIR = $TEST_TMPDIR"
log " ENV_DIR = $ENV_DIR"
log " ENV_READY_FILE = $ENV_READY_FILE"
# Start the environment.
$ENV_BIN &
local env_pid=$!
log "Environment started with PID $env_pid."
# Wait for the environment to be ready.
log "Waiting up to $READY_CHECK_TIMEOUT seconds for environment to be ready..."
local seconds_counter=1
until [[ -f "$ENV_READY_FILE" ]]; do
if [[ $seconds_counter -gt $READY_CHECK_TIMEOUT ]]; then
log "Timed out while waiting for environment to be ready."
kill -s SIGTERM $env_pid # Tear down environment.
exit 1 # Return a non-zero exit code in order for Bazel to report test failure.
fi
sleep 1
let "seconds_counter += 1"
done
# Run tests.
#
# For some unknown reason, Go tests fail with "fork/exec [...]: no such file or directory" when
# invoked from this script via $TEST_BIN, which holds the path to a symlink created by Bazel.
# Invoking the test binary via its real path, as opposed to a symlink, prevents this error.
"$(realpath $TEST_BIN)"
local test_exit_code=$?
log "Test exit code: $test_exit_code"
# Tear down environment.
kill -s SIGTERM $env_pid
# Forward the test exit code to Bazel.
exit $test_exit_code
}
main