forked from buildkite-plugins/bats-mock
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbinstub
executable file
·146 lines (120 loc) · 3.96 KB
/
binstub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/env bash
set -e
# If stdin comes from a pipe, save its content for later
if ! [ -t 0 ]; then
input="$(cat)"
fi
status=0
program="${0##*/}"
PROGRAM="$(echo "$program" | tr a-z- A-Z_)"
_STUB_PLAN="${PROGRAM}_STUB_PLAN"
_STUB_RUN="${PROGRAM}_STUB_RUN"
_STUB_INDEX="${PROGRAM}_STUB_INDEX"
_STUB_RESULT="${PROGRAM}_STUB_RESULT"
_STUB_END="${PROGRAM}_STUB_END"
_STUB_DEBUG="${PROGRAM}_STUB_DEBUG"
debug() {
if [ -n "${!_STUB_DEBUG}" ] ; then
echo "bats-mock($program): $*" >&${!_STUB_DEBUG}
fi
}
[ -e "${!_STUB_PLAN}" ] || exit 1
[ -n "${!_STUB_RUN}" ] || eval "${_STUB_RUN}"="${BATS_MOCK_TMPDIR}/${program}-stub-run"
# Initialize or load the stub run information.
eval "${_STUB_INDEX}"=1
eval "${_STUB_RESULT}"=0
[ ! -e "${!_STUB_RUN}" ] || source "${!_STUB_RUN}"
if [ -z "${!_STUB_END}" ] && [ -n "${!_STUB_DEBUG}" ]; then
debug "got $program $*" >&${!_STUB_DEBUG}
fi
# Loop over each line in the plan.
index=0
while IFS= read -r line; do
index=$((index + 1))
# if [ -n "${!_STUB_DEBUG}" ]; then
# echo "bats-mock: [idx $index, want ${!_STUB_INDEX}] $line" >&${!_STUB_DEBUG}
# fi
if [ -z "${!_STUB_END}" ] && [ $index -eq "${!_STUB_INDEX}" ]; then
# We found the plan line we're interested in.
# Start off by assuming success.
result=0
# Split the line into an array of arguments to
# match and a command to run to produce output.
command=" $line"
if [ "$command" != "${command/ : }" ]; then
patterns="${command%% : *}"
command="${command#* : }"
fi
arguments=("$@")
parsed_patterns=()
# Parse patterns into tokens using eval to respect quoted
# strings. This is less than ideal, but the pattern input
# is also already eval'd elsewhere. At least this handles
# things like newlines (which xargs doesn't)
eval "parsed_patterns=(${patterns})"
debug "patterns [${#parsed_patterns[@]}] = $(printf "'%q' " "${parsed_patterns[@]}")"
debug "arguments [${#arguments[@]}] = $(printf "'%q' " "${arguments[@]}")"
# Match the expected argument patterns to actual
# arguments.
for (( i=0; i<${#parsed_patterns[@]}; i++ )); do
pattern="${parsed_patterns[$i]}"
argument="${arguments[$i]}"
if [[ "$pattern" != "$argument" ]] && [[ "$pattern" != "*" ]] ; then
debug "$(printf "match failed at idx %d, expected '%q', got '%q'" $i "$pattern" "$argument")"
result=1
break
fi
done
# Check if there are unmatched arguments
if [[ ${#arguments[@]} -gt ${#parsed_patterns[@]} ]] ; then
idx="${#parsed_patterns[@]}"
argument="${arguments[$idx]}"
debug "$(printf "unexpected argument '%q' at idx %d" "$argument" "$idx")"
result=2
break
fi
# If the arguments matched, evaluate the command
# in a subshell. Otherwise, log the failure.
if [ $result -eq 0 ] ; then
debug "running $command"
debug "command input is $input"
set +e
( eval "$command" <<< "$input" )
status="$?"
debug "command result was $status"
set -e
else
eval "${_STUB_RESULT}"=1
fi
fi
done < "${!_STUB_PLAN}"
if [ -n "${!_STUB_END}" ]; then
echo "${_STUB_DEBUG}"
debug "unstubbing"
if [ ! -f "${!_STUB_RUN}" ] && [ -n "${!_STUB_DEBUG}" ] ; then
echo "The stub for ${program} wasn't run"
exit 1
fi
# Clean up the run file.
rm -f "${!_STUB_RUN}"
# If the number of lines in the plan is larger than
# the requested index, we failed.
if [ $index -ge "${!_STUB_INDEX}" ]; then
eval "${_STUB_RESULT}"=1
fi
# Return the result.
exit "${!_STUB_RESULT}"
else
# If the requested index is larger than the number
# of lines in the plan file, we failed.
if [ "${!_STUB_INDEX}" -gt $index ]; then
debug "no plan row found"
eval "${_STUB_RESULT}"=1
fi
# Write out the run information.
{ echo "${_STUB_INDEX}=$((${!_STUB_INDEX} + 1))"
echo "${_STUB_RESULT}=${!_STUB_RESULT}"
} > "${!_STUB_RUN}"
debug "result ${!_STUB_RESULT}"
exit "${!_STUB_RESULT}"
fi