#!/bin/bash # # Tests for wrapper.sh. set -euo pipefail # The location of the script under test. readonly WRAPPER="$(realpath "$(dirname "$0")/wrapper.sh")" # The name of the tests to run. Each test correspond to a function in this file # whose name is the name of the test prefixed by 'test'. readonly TEST_NAMES=( SuccessfulCase FailedCase FailedSignalCase ) # Fails with an error message. function fatal() { echo 1>&2 "FATAL: $@" exit 113 } function withTestFiles() { ( echo '1' echo '2' echo '3' echo '4' echo '5' echo '6' echo '7' ) >testfile ( echo 'module: 1' echo 'module: 2' echo 'module: 3' echo 'module: 4' echo 'module: 5' echo 'module: 6' echo 'module: 7' ) >testfileWithModule ( echo 'module: 3' echo 'module: 4' echo 'module: 5' echo 'module: 6' echo 'module: 7' ) >testfileWithModuleTruncated } function expectNoWrapOutput() { if [ "$(cat output-wrap)" != '' ]; then echo 'Wrap should not generate any output' diff testfile output || true return 1 fi } function expectSavedOutput() { if ! diff testfile output; then echo 'Should have saved the correct output' diff testfile output || true return 1 fi } function expectFullOutputWithModule() { if ! diff testfileWithModule output-eval; then echo 'Should have printed the full output' diff testfileWithModule output || true return 1 fi } function expectTruncatedOutputWithModule() { if ! diff testfileWithModuleTruncated output-eval; then echo 'Should have printed the truncated output' diff testfileWithModuleTruncated output || true return 1 fi } function whenWrap() { "$WRAPPER" module "$PWD/output" "$PWD/retval" 'wrap' "$@" \ 2>/dev/null \ >output-wrap } function whenEval() { "$WRAPPER" module "$PWD/output" "$PWD/retval" 'eval' "$@" \ >output-eval 2>&1 } function testSuccessfulCase() { withTestFiles ( echo '#!/bin/bash' echo echo 'cat testfile' ) >script.sh chmod 755 script.sh whenWrap "$PWD/script.sh" expectNoWrapOutput if ! whenEval; then echo 'Should have run successfully' return 1 fi expectSavedOutput expectTruncatedOutputWithModule } function testFailedCase() { withTestFiles ( echo '#!/bin/bash' echo echo 'cat testfile' echo 'exit 1' ) >script.sh chmod 755 script.sh whenWrap "$PWD/script.sh" expectNoWrapOutput if whenEval; then echo 'Should have failed to run' return 1 fi expectSavedOutput expectFullOutputWithModule } function testFailedSignalCase() { withTestFiles ( echo '#!/bin/bash' echo echo 'cat testfile' echo 'kill -TERM $$' echo 'echo Should not be printed' ) >script.sh chmod 755 script.sh whenWrap "$PWD/script.sh" expectNoWrapOutput if whenEval; then echo 'Should have failed to run' return 1 fi expectSavedOutput expectFullOutputWithModule } function main() { local result=0 local tmp="$(mktemp -d)" for test_name in "${TEST_NAMES[@]}"; do mkdir -p "$tmp/$test_name" cd "$tmp/$test_name" echo -n "Running $test_name..." test"$test_name" >log || { echo "FAILED"; sed -e "s/^/$test_name: /"