#!/usr/bin/env bash # Copyright 2021 gRPC authors. # # 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. # Test structure borrowed with gratitude from # https://github.com/grpc/grpc-go/tree/master/examples/features set -eux # execute in root dir SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 pwd -P )" cd ${SCRIPTPATH}/../../.. SERVER_PORT=50051 export TMPDIR=$(mktemp -d) trap "rm -rf ${TMPDIR}" EXIT clean() { # loop a handful of times in case job shutdown is not immediate for i in {1..5}; do # kill all jobs jobs -p | xargs kill &>/dev/null || true # wait for all jobs to exit sleep 0.3 if ! jobs | read; then return fi done echo "ERROR: clean failed to kill tests" jobs exit 1 } fail() { echo "$@" >&2 clean exit 1 } pass() { echo "SUCCESS: $1" } wait_for_server() { feature=$1 wait_command=${SERVER_WAIT_COMMAND[$feature]:-${SERVER_WAIT_COMMAND["default"]}} echo "INFO: waiting for server to start" declare -i i=0 while ! eval "$wait_command"; do ((++i < 10)) || fail "cannot determine if server started" lsof -U sleep 1 done pass "server started" } FEATURES=( "unix_abstract" ) declare -A SERVER_WAIT_COMMAND=( ["unix_abstract"]="lsof -U | grep '@grpc@abstract'" ["default"]="lsof -i :$SERVER_PORT | grep $SERVER_PORT" ) declare -A EXPECTED_SERVER_OUTPUT=( ["unix_abstract"]="Server listening on unix-abstract:grpc%00abstract ... Echoing: arst" ) declare -A EXPECTED_CLIENT_OUTPUT=( ["unix_abstract"]="Sending 'arst' to unix-abstract:grpc%00abstract ... Received: arst" ) for feature in ${FEATURES[@]}; do echo "TESTING: $feature" bazel build --define=use_strict_warning=true //examples/cpp/features/${feature}:all || fail "failed to build $feature" SERVER_LOG="$(mktemp)" ./bazel-bin/examples/cpp/features/$feature/server &>$SERVER_LOG & wait_for_server $feature # TODO(hork): add a timeout to abort client? CLIENT_LOG="$(mktemp)" ./bazel-bin/examples/cpp/features/$feature/client &>$CLIENT_LOG if [ -n "${EXPECTED_SERVER_OUTPUT[$feature]}" ]; then if ! grep -q "${EXPECTED_SERVER_OUTPUT[$feature]}" $SERVER_LOG; then fail "server log missing output: ${EXPECTED_SERVER_OUTPUT[$feature]} got server log: $(cat $SERVER_LOG) got client log: $(cat $CLIENT_LOG) " else pass "server log contains expected output: ${EXPECTED_SERVER_OUTPUT[$feature]}" fi fi if [ -n "${EXPECTED_CLIENT_OUTPUT[$feature]}" ]; then if ! grep -q "${EXPECTED_CLIENT_OUTPUT[$feature]}" $CLIENT_LOG; then fail "client log missing output: ${EXPECTED_CLIENT_OUTPUT[$feature]} got server log: $(cat $SERVER_LOG) got client log: $(cat $CLIENT_LOG) " else pass "client log contains expected output: ${EXPECTED_CLIENT_OUTPUT[$feature]}" fi fi clean done