1#!/bin/bash 2# 3# Tests for wrapper.sh. 4 5set -euo pipefail 6 7# The location of the script under test. 8readonly WRAPPER="$(realpath "$(dirname "$0")/wrapper.sh")" 9# The name of the tests to run. Each test correspond to a function in this file 10# whose name is the name of the test prefixed by 'test'. 11readonly TEST_NAMES=( 12 SuccessfulCase 13 FailedCase 14 FailedSignalCase 15) 16 17# Fails with an error message. 18function fatal() { 19 echo 1>&2 "FATAL: $@" 20 exit 113 21} 22 23function withTestFiles() { 24 ( 25 echo '1' 26 echo '2' 27 echo '3' 28 echo '4' 29 echo '5' 30 echo '6' 31 echo '7' 32 ) >testfile 33 ( 34 echo 'module: 1' 35 echo 'module: 2' 36 echo 'module: 3' 37 echo 'module: 4' 38 echo 'module: 5' 39 echo 'module: 6' 40 echo 'module: 7' 41 ) >testfileWithModule 42 ( 43 echo 'module: 3' 44 echo 'module: 4' 45 echo 'module: 5' 46 echo 'module: 6' 47 echo 'module: 7' 48 ) >testfileWithModuleTruncated 49} 50 51function expectNoWrapOutput() { 52 if [ "$(cat output-wrap)" != '' ]; then 53 echo 'Wrap should not generate any output' 54 diff testfile output || true 55 return 1 56 fi 57} 58 59function expectSavedOutput() { 60 if ! diff testfile output; then 61 echo 'Should have saved the correct output' 62 diff testfile output || true 63 return 1 64 fi 65} 66 67function expectFullOutputWithModule() { 68 if ! diff testfileWithModule output-eval; then 69 echo 'Should have printed the full output' 70 diff testfileWithModule output || true 71 return 1 72 fi 73} 74 75function expectTruncatedOutputWithModule() { 76 if ! diff testfileWithModuleTruncated output-eval; then 77 echo 'Should have printed the truncated output' 78 diff testfileWithModuleTruncated output || true 79 return 1 80 fi 81} 82 83function whenWrap() { 84 "$WRAPPER" module "$PWD/output" "$PWD/retval" 'wrap' "$@" \ 85 2>/dev/null \ 86 >output-wrap 87} 88 89function whenEval() { 90 "$WRAPPER" module "$PWD/output" "$PWD/retval" 'eval' "$@" \ 91 >output-eval 2>&1 92} 93 94function testSuccessfulCase() { 95 withTestFiles 96 ( 97 echo '#!/bin/bash' 98 echo 99 echo 'cat testfile' 100 ) >script.sh 101 chmod 755 script.sh 102 whenWrap "$PWD/script.sh" 103 expectNoWrapOutput 104 if ! whenEval; then 105 echo 'Should have run successfully' 106 return 1 107 fi 108 expectSavedOutput 109 expectTruncatedOutputWithModule 110} 111 112function testFailedCase() { 113 withTestFiles 114 ( 115 echo '#!/bin/bash' 116 echo 117 echo 'cat testfile' 118 echo 'exit 1' 119 ) >script.sh 120 chmod 755 script.sh 121 whenWrap "$PWD/script.sh" 122 expectNoWrapOutput 123 if whenEval; then 124 echo 'Should have failed to run' 125 return 1 126 fi 127 expectSavedOutput 128 expectFullOutputWithModule 129} 130 131function testFailedSignalCase() { 132 withTestFiles 133 ( 134 echo '#!/bin/bash' 135 echo 136 echo 'cat testfile' 137 echo 'kill -TERM $$' 138 echo 'echo Should not be printed' 139 ) >script.sh 140 chmod 755 script.sh 141 whenWrap "$PWD/script.sh" 142 expectNoWrapOutput 143 if whenEval; then 144 echo 'Should have failed to run' 145 return 1 146 fi 147 expectSavedOutput 148 expectFullOutputWithModule 149} 150 151function main() { 152 local result=0 153 local tmp="$(mktemp -d)" 154 for test_name in "${TEST_NAMES[@]}"; do 155 mkdir -p "$tmp/$test_name" 156 cd "$tmp/$test_name" 157 echo -n "Running $test_name..." 158 test"$test_name" >log || { 159 echo "FAILED"; 160 sed -e "s/^/$test_name: /" <log 161 rm log 162 result=1; 163 continue; 164 } 165 echo "PASSED" 166 rm log 167 done 168 return "$result" 169} 170 171 172main "$@" 173