-
Notifications
You must be signed in to change notification settings - Fork 66
Expand file tree
/
Copy pathplugins
More file actions
executable file
·391 lines (354 loc) · 9.95 KB
/
plugins
File metadata and controls
executable file
·391 lines (354 loc) · 9.95 KB
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
#!/bin/bash
set -u
PATH=$(pwd):${PATH}
WORKDIR=$(mktemp -d /tmp/shield.test.XXXXXXX)
# TEST HARNESS APPARATUS {{{
export PATH
cleanup () {
rm -rf ${WORKDIR}
if [[ -n "$(jobs -p)" ]]; then
kill $(jobs -p)
fi
}
trap "cleanup >&2" EXIT QUIT INT TERM
CONTEXT=""
context() {
CONTEXT=$1
}
pass() {
local msg=$1
echo -e "\033[1;32m[ OK ]\033[0m $msg" | tee -a $WORKDIR/summary
}
fail() {
local msg=$1
echo -e "\033[1;31m[FAIL]\033[0m $msg" | tee -a $WORKDIR/summary
}
nocolor() {
sed -e 's,'$(printf "\x1b")'\[[0-9;]*m,,g'
}
done_testing() {
echo
if [[ ! -f $WORKDIR/summary ]]; then
echo "NO TESTS RUN"
exit 2
fi
tests=$(wc -l $WORKDIR/summary | awk '{print $1}')
fails=$(nocolor <$WORKDIR/summary | grep '^\[FAIL\] ' | wc -l | awk '{print $1}')
if [[ $fails == 0 ]]; then
echo "ALL $tests TESTS PASS"
exit 0
else
echo "$fails/$tests TESTS FAILED"
echo
nocolor <$WORKDIR/summary | grep '^\[FAIL\] ' | sed -e 's/^/ /'
exit 1
fi
}
# }}}
# try "A Suite of Tests" {{{
try() {
CONTEXT=""
echo
echo ">> $*:"
}
# }}}
# (run some tests) 2>&1 | indent {{{
indent() {
sed -e 's/^/ /'
}
# }}}
# ok $? "what should have happened..." {{{
ok() {
local rc=$1
local msg=$2
if [[ $rc == 0 ]]; then
pass "$msg"
else
fail "$msg"
fi
}
# }}}
# notok $? "what should have happened..." {{{
notok() {
local rc=$1
local msg=$2
if [[ $rc == 0 ]]; then
fail "$msg"
else
pass "$msg"
fi
}
# }}}
# is $got $expected "why it should have been that way..." {{{
is() {
local got=$1
local want=$2
local msg=${3:-}
if [[ -z "$msg" ]]; then
msg="'${got}' should equal '${want}'"
fi
if [[ "$got" != "$want" ]]; then
fail "$msg"
echo " got '${got}'"
echo " wanted '${want}'"
echo
return
fi
pass "$msg"
}
# }}}
# isnt $got $expected "why it should not have been that way..." {{{
isnt(){
local got=$1
local want=$2
local msg=${3:-}
if [[ -z "$msg" ]]; then
msg="'${got}' should NOT equal '${want}'"
fi
if [[ "$got" == "$want" ]]; then
fail "$msg"
echo " got '${got}'"
echo " wanted pretty much anything else."
echo
return
fi
pass "$msg"
}
# }}}
# with $pattern $file "why it should have been that way..." {{{
with() {
local pat=$1
local file=${2:-out}
local msg=${3:-}
if [[ -z "$msg" ]]; then
msg="$file should contain '${pat}'"
fi
if ! grep -q -- "$pat" "$WORKDIR/$file"; then
fail "$msg"
echo " did not find '${pat}'"
echo " in file $file"
echo
cat "$WORKDIR/$file" | indent
echo
return
fi
pass "$msg"
}
# }}}
# with $pattern $file "why it should have been that way..." {{{
without() {
local pat=$1
local file=${2:-out}
local msg=${3:-}
if [[ -z "$msg" ]]; then
msg="$file should contain '${pat}'"
fi
if grep -q -- "$pat" "$WORKDIR/$file"; then
fail "$msg"
echo " found '${pat}'"
echo " in file $file"
echo
grep -n -- "$pat" "$WORKDIR/$file" | indent
echo
return
fi
pass "$msg"
}
# }}}
GOOD_ENDPOINT='{
"string1" : "set",
"float1" : 1.2,
"bool1" : true,
"list" : [],
"map" : {}
}'
####################################################################################
try "basic -h (short help) output"
(./mock -h &> $WORKDIR/out
ok $? "retrieved help from mock plugin"
with "Mock Plugin v0.0.1 - SHIELD Core Team"
with "USAGE: .*OPTIONS.*COMMAND.*OPTIONS"
with "-h, --help"
with "-D, --debug"
with "-v, --version"
with " info "
with " validate -e JSON "
with " backup -e JSON "
with " restore -e JSON "
with " store -e JSON \\[--text\\] "
with " retrieve -e JSON -k KEY "
with " purge -e JSON -k KEY "
with "EXAMPLE ENDPOINT CONFIGURATION"
with "DEFAULT ENDPOINT") 2>&1 | indent
####################################################################################
try "basic --help (long help) output"
(./mock --help &> $WORKDIR/out
ok $? "retrieved long help from mock plugin"
with "Mock Plugin v0.0.1 - SHIELD Core Team"
with "USAGE: .*OPTIONS.*COMMAND.*OPTIONS"
with "-h, --help"
with "-D, --debug"
with "-v, --version"
with "info$"
with "validate --endpoint ENDPOINT-JSON$"
with "backup --endpoint TARGET-ENDPOINT-JSON$"
with "restore --endpoint TARGET-ENDPOINT-JSON$"
with "store --endpoint STORE-ENDPOINT-JSON \\[--text\\]$"
with "retrieve --key STORAGE-HANDLE --endpoint STORE-ENDPOINT-JSON$"
with "purge --key STORAGE-HANDLE --endpoint STORE-ENDPOINT-JSON$") 2>&1 | indent
####################################################################################
try "validation failure"
(./mock validate &> $WORKDIR/out
notok $? "validate requires --endpoint flag"
with "Missing required --endpoint"
./mock validate -e "[]" &> $WORKDIR/out
notok $? "validate requires --endpoint to be a JSON map, not a list"
with "Error.*parse.*JSON"
./mock validate -e "true" &> $WORKDIR/out
notok $? "validate requires --endpoint to be a JSON map, not a scalar boolean"
with "Error.*parse.*JSON"
./mock validate -e "42" &> $WORKDIR/out
notok $? "validate requires --endpoint to be a JSON map, not a scalar integer"
with "Error.*parse.*JSON"
./mock validate -e '"text"' &> $WORKDIR/out
notok $? "validate requires --endpoint to be a JSON map, not a scalar string"
with "Error.*parse.*JSON"
./mock validate -e '{}' &> $WORKDIR/out
notok $? "validate requires specific keys to be set"
without "Error.*parse.*JSON"
with "✗ string1 * No 'string1' key"
with "✓ string2 * not set"
with "✗ float1 * No 'float1' key"
with "✓ float2 * 42"
with "✗ bool1 * No 'bool1' key"
with "✓ bool2 * true"
with "✗ list * No 'list' key"
with "✗ map * No 'map' key"
with "mock plugin: invalid configuration"
./mock validate -e '{
"string1": "string the first",
"string2": "string the second",
"float1" : 123.456,
"float2" : 456.78901,
"bool1" : true,
"bool2" : false,
"list" : [1,2,3],
"map" : {"a":1,"b":2}
}' &>$WORKDIR/out
ok $? "validate works without default values set"
with "✓ string1 * string the first"
with "✓ string2 * string the second"
with "✓ float1 * 123.456"
with "✓ float2 * 456.78901"
with "✓ bool1 * true"
with "✓ bool2 * false"
with "✓ list * \\[0] = 1"
with "✓ list * \\[1] = 2"
with "✓ list * \\[2] = 3"
with "✓ map * 'a' = 1"
with "✓ map * 'b' = 2"
./mock validate -e '{
"string1": "explicitly set",
"float1" : 12.6,
"bool1" : true,
"list" : [1],
"map" : {"a":1}
}' &>$WORKDIR/out
ok $? "validate works without default values set"
without "Error.*parse.*JSON"
with "✓ string1 * explicitly set"
with "✓ string2 * not set" # default
with "✓ float1 * 12.6"
with "✓ float2 * 42" # default
with "✓ bool1 * true"
with "✓ bool2 * true" # default
with "✓ list * \\[0] = 1"
with "✓ map * 'a' = 1") 2>&1 | indent
####################################################################################
try "retrieving info from the mock plugin"
(./mock info &>$WORKDIR/out
ok $? "\`mock info\` succeded"
is "$(cat $WORKDIR/out)" '{
"name": "Mock Plugin",
"author": "SHIELD Core Team",
"version": "0.0.1",
"features": {
"target": "yes",
"store": "yes"
},
"fields": []
}' "mock plugin information") 2>&1 | indent
####################################################################################
try "backup"
(./mock backup &>$WORKDIR/out
notok $? "backup command requires an --endpoint"
with "Missing required --endpoint flag"
./mock backup -e "$GOOD_ENDPOINT" &>$WORKDIR/out
ok $? "backup command is happy with the GOOD_ENDPOINT"
# the 'data' to be backed up...
with "mock data") 2>&1 | indent
####################################################################################
try "restore"
(echo "test" | ./mock restore &>$WORKDIR/out
notok $? "restore command requires an --endpoint"
with "Missing required --endpoint flag"
echo "test" | ./mock restore -e "$GOOD_ENDPOINT" &>$WORKDIR/out
ok $? "restore command is happy with the GOOD_ENDPOINT") 2>&1 | indent
####################################################################################
try "store"
(echo "test" | ./mock store &>$WORKDIR/out
notok $? "store command requires an --endpoint"
with "Missing required --endpoint flag"
echo "test" | ./mock store -e "$GOOD_ENDPOINT" &>$WORKDIR/out
ok $? "store command is happy with the GOOD_ENDPOINT"
with '{
"key":"fake-storage-key"
}' out "prints storage key after store op") 2>&1 | indent
####################################################################################
try "retrieve"
(./mock retrieve &>$WORKDIR/out
notok $? "retrieve command requires an --endpoint and a --key"
with "Missing required --endpoint flag"
./mock retrieve --key STORAGE-KEY &>$WORKDIR/out
notok $? "retrieve command requires an --endpoint"
with "Missing required --endpoint flag"
./mock retrieve --endpoint "$GOOD_ENDPOINT" &>$WORKDIR/out
notok $? "retrieve command requires a --key"
without "Missing required --endpoint flag"
with "Missing required --key flag") 2>&1 | indent
####################################################################################
try "purge"
(./mock purge &>$WORKDIR/out
notok $? "purge command requires an --endpoint and a --key"
with "Missing required --endpoint flag"
./mock purge --key STORAGE-KEY &>$WORKDIR/out
notok $? "purge command requires an --endpoint"
with "Missing required --endpoint flag"
./mock purge --endpoint "$GOOD_ENDPOINT" &>$WORKDIR/out
notok $? "purge command requires a --key"
without "Missing required --endpoint flag"
with "Missing required --key flag") 2>&1 | indent
####################################################################################
for x in s3 \
fs \
consul \
google \
postgres docker-postgres \
mongo \
mysql \
redis-broker \
rabbitmq-broker \
webdav \
xtrabackup
do
strip $x
try "$x help"
(./$x -h &>$WORKDIR/out
with "EXAMPLE ENDPOINT CONFIGURATION"
with "DEFAULT ENDPOINT") 2>&1 | indent
try "$x info"
(SHIELD_PEDANTIC_INFO=yes ./$x info >/dev/null
ok $? "$x info should not have bailed.") 2>&1 | indent
done
####################################################################################
done_testing