173 lines
3.3 KiB
Bash
Executable File
173 lines
3.3 KiB
Bash
Executable File
#!/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: /" <log
|
|
rm log
|
|
result=1;
|
|
continue;
|
|
}
|
|
echo "PASSED"
|
|
rm log
|
|
done
|
|
return "$result"
|
|
}
|
|
|
|
|
|
main "$@"
|