blob: f6215f545dcc2be00fe4608140f64dd2a2fadc5a [file] [log] [blame]
James Lemieux2a2559e2018-01-28 02:56:27 -08001#!/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 "$@"