alpha_omega 1.1.1 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/VERSION +1 -1
  2. data/bin/alpha_omega +2 -10
  3. data/lib/alpha_omega/deploy.rb +2 -16
  4. data/libexec/ao +15 -0
  5. data/libexec/ao-activate +22 -0
  6. data/libexec/ao-build +22 -0
  7. data/libexec/ao-check +22 -0
  8. data/libexec/ao-compare +22 -0
  9. data/libexec/ao-cook +22 -0
  10. data/libexec/ao-deploy +22 -0
  11. data/libexec/ao-dist +22 -0
  12. data/libexec/ao-lock +31 -0
  13. data/libexec/ao-migrate +22 -0
  14. data/libexec/ao-plan +22 -0
  15. data/libexec/ao-release +22 -0
  16. data/libexec/ao-restart +22 -0
  17. data/libexec/ao-rollback +22 -0
  18. data/libexec/ao-shell +22 -0
  19. data/libexec/ao-stage +22 -0
  20. data/libexec/ao-task +23 -0
  21. data/libexec/ao-unlock +31 -0
  22. data/sbin/_bump +126 -0
  23. data/sbin/_jason +172 -0
  24. data/sbin/_log4sh +3840 -0
  25. data/sbin/_meat +172 -0
  26. data/sbin/_prime +8 -0
  27. data/sbin/_shflags +1012 -0
  28. data/sbin/_shunit +1048 -0
  29. data/sbin/_sub +37 -0
  30. data/sbin/_treadstone +8 -0
  31. data/sbin/_versions +174 -0
  32. data/sbin/ao +15 -0
  33. data/sbin/stub +15 -0
  34. metadata +31 -57
  35. data/libexec/activate +0 -199
  36. data/libexec/build +0 -30
  37. data/libexec/build.orig +0 -199
  38. data/libexec/bump.orig +0 -32
  39. data/libexec/check +0 -199
  40. data/libexec/compare +0 -199
  41. data/libexec/config +0 -199
  42. data/libexec/debug +0 -199
  43. data/libexec/deploy +0 -199
  44. data/libexec/dist +0 -199
  45. data/libexec/dna +0 -199
  46. data/libexec/hosts +0 -199
  47. data/libexec/invoke +0 -199
  48. data/libexec/lock +0 -199
  49. data/libexec/migrate +0 -199
  50. data/libexec/plan +0 -199
  51. data/libexec/release +0 -199
  52. data/libexec/repl +0 -199
  53. data/libexec/restart +0 -199
  54. data/libexec/rollback +0 -199
  55. data/libexec/shell +0 -199
  56. data/libexec/stage +0 -199
  57. data/libexec/task +0 -199
  58. data/libexec/unlock +0 -199
data/sbin/_shunit ADDED
@@ -0,0 +1,1048 @@
1
+ #! /bin/sh
2
+ # $Id: shunit2 335 2011-05-01 20:10:33Z kate.ward@forestent.com $
3
+ # vim:et:ft=sh:sts=2:sw=2
4
+ #
5
+ # Copyright 2008 Kate Ward. All Rights Reserved.
6
+ # Released under the LGPL (GNU Lesser General Public License)
7
+ #
8
+ # shUnit2 -- Unit testing framework for Unix shell scripts.
9
+ # http://code.google.com/p/shunit2/
10
+ #
11
+ # Author: kate.ward@forestent.com (Kate Ward)
12
+ #
13
+ # shUnit2 is a xUnit based unit test framework for Bourne shell scripts. It is
14
+ # based on the popular JUnit unit testing framework for Java.
15
+
16
+ # return if shunit already loaded
17
+ [ -n "${SHUNIT_VERSION:-}" ] && exit 0
18
+
19
+ SHUNIT_VERSION='2.1.6'
20
+
21
+ SHUNIT_TRUE=0
22
+ SHUNIT_FALSE=1
23
+ SHUNIT_ERROR=2
24
+
25
+ # enable strict mode by default
26
+ SHUNIT_STRICT=${SHUNIT_STRICT:-${SHUNIT_TRUE}}
27
+
28
+ _shunit_warn() { echo "shunit2:WARN $@" >&2; }
29
+ _shunit_error() { echo "shunit2:ERROR $@" >&2; }
30
+ _shunit_fatal() { echo "shunit2:FATAL $@" >&2; exit ${SHUNIT_ERROR}; }
31
+
32
+ # specific shell checks
33
+ if [ -n "${ZSH_VERSION:-}" ]; then
34
+ setopt |grep "^shwordsplit$" >/dev/null
35
+ if [ $? -ne ${SHUNIT_TRUE} ]; then
36
+ _shunit_fatal 'zsh shwordsplit option is required for proper operation'
37
+ fi
38
+ if [ -z "${SHUNIT_PARENT:-}" ]; then
39
+ _shunit_fatal "zsh does not pass \$0 through properly. please declare \
40
+ \"SHUNIT_PARENT=\$0\" before calling shUnit2"
41
+ fi
42
+ fi
43
+
44
+ #
45
+ # constants
46
+ #
47
+
48
+ __SHUNIT_ASSERT_MSG_PREFIX='ASSERT:'
49
+ __SHUNIT_MODE_SOURCED='sourced'
50
+ __SHUNIT_MODE_STANDALONE='standalone'
51
+ __SHUNIT_PARENT=${SHUNIT_PARENT:-$0}
52
+
53
+ # set the constants readonly
54
+ shunit_constants_=`set |grep '^__SHUNIT_' |cut -d= -f1`
55
+ echo "${shunit_constants_}" |grep '^Binary file' >/dev/null && \
56
+ shunit_constants_=`set |grep -a '^__SHUNIT_' |cut -d= -f1`
57
+ for shunit_constant_ in ${shunit_constants_}; do
58
+ shunit_ro_opts_=''
59
+ case ${ZSH_VERSION:-} in
60
+ '') ;; # this isn't zsh
61
+ [123].*) ;; # early versions (1.x, 2.x, 3.x)
62
+ *) shunit_ro_opts_='-g' ;; # all later versions. declare readonly globally
63
+ esac
64
+ readonly ${shunit_ro_opts_} ${shunit_constant_}
65
+ done
66
+ unset shunit_constant_ shunit_constants_ shunit_ro_opts_
67
+
68
+ # variables
69
+ __shunit_lineno='' # line number of executed test
70
+ __shunit_mode=${__SHUNIT_MODE_SOURCED} # operating mode
71
+ __shunit_reportGenerated=${SHUNIT_FALSE} # is report generated
72
+ __shunit_script='' # filename of unittest script (standalone mode)
73
+ __shunit_skip=${SHUNIT_FALSE} # is skipping enabled
74
+ __shunit_suite='' # suite of tests to execute
75
+
76
+ # counts of tests
77
+ __shunit_testSuccess=${SHUNIT_TRUE}
78
+ __shunit_testsTotal=0
79
+ __shunit_testsPassed=0
80
+ __shunit_testsFailed=0
81
+
82
+ # counts of asserts
83
+ __shunit_assertsTotal=0
84
+ __shunit_assertsPassed=0
85
+ __shunit_assertsFailed=0
86
+ __shunit_assertsSkipped=0
87
+
88
+ # macros
89
+ _SHUNIT_LINENO_='eval __shunit_lineno=""; if [ "${1:-}" = "--lineno" ]; then [ -n "$2" ] && __shunit_lineno="[$2] "; shift 2; fi'
90
+
91
+ #-----------------------------------------------------------------------------
92
+ # assert functions
93
+ #
94
+
95
+ # Assert that two values are equal to one another.
96
+ #
97
+ # Args:
98
+ # message: string: failure message [optional]
99
+ # expected: string: expected value
100
+ # actual: string: actual value
101
+ # Returns:
102
+ # integer: success (TRUE/FALSE/ERROR constant)
103
+ assertEquals()
104
+ {
105
+ ${_SHUNIT_LINENO_}
106
+ if [ $# -lt 2 -o $# -gt 3 ]; then
107
+ _shunit_error "assertEquals() requires two or three arguments; $# given"
108
+ _shunit_error "1: ${1:+$1} 2: ${2:+$2} 3: ${3:+$3}${4:+ 4: $4}"
109
+ return ${SHUNIT_ERROR}
110
+ fi
111
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
112
+
113
+ shunit_message_=${__shunit_lineno}
114
+ if [ $# -eq 3 ]; then
115
+ shunit_message_="${shunit_message_}$1"
116
+ shift
117
+ fi
118
+ shunit_expected_=$1
119
+ shunit_actual_=$2
120
+
121
+ shunit_return=${SHUNIT_TRUE}
122
+ if [ "${shunit_expected_}" = "${shunit_actual_}" ]; then
123
+ _shunit_assertPass
124
+ else
125
+ failNotEquals "${shunit_message_}" "${shunit_expected_}" "${shunit_actual_}"
126
+ shunit_return=${SHUNIT_FALSE}
127
+ fi
128
+
129
+ unset shunit_message_ shunit_expected_ shunit_actual_
130
+ return ${shunit_return}
131
+ }
132
+ _ASSERT_EQUALS_='eval assertEquals --lineno "${LINENO:-}"'
133
+
134
+ # Assert that two values are not equal to one another.
135
+ #
136
+ # Args:
137
+ # message: string: failure message [optional]
138
+ # expected: string: expected value
139
+ # actual: string: actual value
140
+ # Returns:
141
+ # integer: success (TRUE/FALSE/ERROR constant)
142
+ assertNotEquals()
143
+ {
144
+ ${_SHUNIT_LINENO_}
145
+ if [ $# -lt 2 -o $# -gt 3 ]; then
146
+ _shunit_error "assertNotEquals() requires two or three arguments; $# given"
147
+ return ${SHUNIT_ERROR}
148
+ fi
149
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
150
+
151
+ shunit_message_=${__shunit_lineno}
152
+ if [ $# -eq 3 ]; then
153
+ shunit_message_="${shunit_message_}$1"
154
+ shift
155
+ fi
156
+ shunit_expected_=$1
157
+ shunit_actual_=$2
158
+
159
+ shunit_return=${SHUNIT_TRUE}
160
+ if [ "${shunit_expected_}" != "${shunit_actual_}" ]; then
161
+ _shunit_assertPass
162
+ else
163
+ failSame "${shunit_message_}" "$@"
164
+ shunit_return=${SHUNIT_FALSE}
165
+ fi
166
+
167
+ unset shunit_message_ shunit_expected_ shunit_actual_
168
+ return ${shunit_return}
169
+ }
170
+ _ASSERT_NOT_EQUALS_='eval assertNotEquals --lineno "${LINENO:-}"'
171
+
172
+ # Assert that a value is null (i.e. an empty string)
173
+ #
174
+ # Args:
175
+ # message: string: failure message [optional]
176
+ # actual: string: actual value
177
+ # Returns:
178
+ # integer: success (TRUE/FALSE/ERROR constant)
179
+ assertNull()
180
+ {
181
+ ${_SHUNIT_LINENO_}
182
+ if [ $# -lt 1 -o $# -gt 2 ]; then
183
+ _shunit_error "assertNull() requires one or two arguments; $# given"
184
+ return ${SHUNIT_ERROR}
185
+ fi
186
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
187
+
188
+ shunit_message_=${__shunit_lineno}
189
+ if [ $# -eq 2 ]; then
190
+ shunit_message_="${shunit_message_}$1"
191
+ shift
192
+ fi
193
+ assertTrue "${shunit_message_}" "[ -z '$1' ]"
194
+ shunit_return=$?
195
+
196
+ unset shunit_message_
197
+ return ${shunit_return}
198
+ }
199
+ _ASSERT_NULL_='eval assertNull --lineno "${LINENO:-}"'
200
+
201
+ # Assert that a value is not null (i.e. a non-empty string)
202
+ #
203
+ # Args:
204
+ # message: string: failure message [optional]
205
+ # actual: string: actual value
206
+ # Returns:
207
+ # integer: success (TRUE/FALSE/ERROR constant)
208
+ assertNotNull()
209
+ {
210
+ ${_SHUNIT_LINENO_}
211
+ if [ $# -gt 2 ]; then # allowing 0 arguments as $1 might actually be null
212
+ _shunit_error "assertNotNull() requires one or two arguments; $# given"
213
+ return ${SHUNIT_ERROR}
214
+ fi
215
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
216
+
217
+ shunit_message_=${__shunit_lineno}
218
+ if [ $# -eq 2 ]; then
219
+ shunit_message_="${shunit_message_}$1"
220
+ shift
221
+ fi
222
+ shunit_actual_=`_shunit_escapeCharactersInString "${1:-}"`
223
+ test -n "${shunit_actual_}"
224
+ assertTrue "${shunit_message_}" $?
225
+ shunit_return=$?
226
+
227
+ unset shunit_actual_ shunit_message_
228
+ return ${shunit_return}
229
+ }
230
+ _ASSERT_NOT_NULL_='eval assertNotNull --lineno "${LINENO:-}"'
231
+
232
+ # Assert that two values are the same (i.e. equal to one another).
233
+ #
234
+ # Args:
235
+ # message: string: failure message [optional]
236
+ # expected: string: expected value
237
+ # actual: string: actual value
238
+ # Returns:
239
+ # integer: success (TRUE/FALSE/ERROR constant)
240
+ assertSame()
241
+ {
242
+ ${_SHUNIT_LINENO_}
243
+ if [ $# -lt 2 -o $# -gt 3 ]; then
244
+ _shunit_error "assertSame() requires two or three arguments; $# given"
245
+ return ${SHUNIT_ERROR}
246
+ fi
247
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
248
+
249
+ shunit_message_=${__shunit_lineno}
250
+ if [ $# -eq 3 ]; then
251
+ shunit_message_="${shunit_message_}$1"
252
+ shift
253
+ fi
254
+ assertEquals "${shunit_message_}" "$1" "$2"
255
+ shunit_return=$?
256
+
257
+ unset shunit_message_
258
+ return ${shunit_return}
259
+ }
260
+ _ASSERT_SAME_='eval assertSame --lineno "${LINENO:-}"'
261
+
262
+ # Assert that two values are not the same (i.e. not equal to one another).
263
+ #
264
+ # Args:
265
+ # message: string: failure message [optional]
266
+ # expected: string: expected value
267
+ # actual: string: actual value
268
+ # Returns:
269
+ # integer: success (TRUE/FALSE/ERROR constant)
270
+ assertNotSame()
271
+ {
272
+ ${_SHUNIT_LINENO_}
273
+ if [ $# -lt 2 -o $# -gt 3 ]; then
274
+ _shunit_error "assertNotSame() requires two or three arguments; $# given"
275
+ return ${SHUNIT_ERROR}
276
+ fi
277
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
278
+
279
+ shunit_message_=${__shunit_lineno}
280
+ if [ $# -eq 3 ]; then
281
+ shunit_message_="${shunit_message_:-}$1"
282
+ shift
283
+ fi
284
+ assertNotEquals "${shunit_message_}" "$1" "$2"
285
+ shunit_return=$?
286
+
287
+ unset shunit_message_
288
+ return ${shunit_return}
289
+ }
290
+ _ASSERT_NOT_SAME_='eval assertNotSame --lineno "${LINENO:-}"'
291
+
292
+ # Assert that a value or shell test condition is true.
293
+ #
294
+ # In shell, a value of 0 is true and a non-zero value is false. Any integer
295
+ # value passed can thereby be tested.
296
+ #
297
+ # Shell supports much more complicated tests though, and a means to support
298
+ # them was needed. As such, this function tests that conditions are true or
299
+ # false through evaluation rather than just looking for a true or false.
300
+ #
301
+ # The following test will succeed:
302
+ # assertTrue 0
303
+ # assertTrue "[ 34 -gt 23 ]"
304
+ # The folloing test will fail with a message:
305
+ # assertTrue 123
306
+ # assertTrue "test failed" "[ -r '/non/existant/file' ]"
307
+ #
308
+ # Args:
309
+ # message: string: failure message [optional]
310
+ # condition: string: integer value or shell conditional statement
311
+ # Returns:
312
+ # integer: success (TRUE/FALSE/ERROR constant)
313
+ assertTrue()
314
+ {
315
+ ${_SHUNIT_LINENO_}
316
+ if [ $# -gt 2 ]; then
317
+ _shunit_error "assertTrue() takes one two arguments; $# given"
318
+ return ${SHUNIT_ERROR}
319
+ fi
320
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
321
+
322
+ shunit_message_=${__shunit_lineno}
323
+ if [ $# -eq 2 ]; then
324
+ shunit_message_="${shunit_message_}$1"
325
+ shift
326
+ fi
327
+ shunit_condition_=$1
328
+
329
+ # see if condition is an integer, i.e. a return value
330
+ shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'`
331
+ shunit_return=${SHUNIT_TRUE}
332
+ if [ -z "${shunit_condition_}" ]; then
333
+ # null condition
334
+ shunit_return=${SHUNIT_FALSE}
335
+ elif [ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ]
336
+ then
337
+ # possible return value. treating 0 as true, and non-zero as false.
338
+ [ ${shunit_condition_} -ne 0 ] && shunit_return=${SHUNIT_FALSE}
339
+ else
340
+ # (hopefully) a condition
341
+ ( eval ${shunit_condition_} ) >/dev/null 2>&1
342
+ [ $? -ne 0 ] && shunit_return=${SHUNIT_FALSE}
343
+ fi
344
+
345
+ # record the test
346
+ if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then
347
+ _shunit_assertPass
348
+ else
349
+ _shunit_assertFail "${shunit_message_}"
350
+ fi
351
+
352
+ unset shunit_message_ shunit_condition_ shunit_match_
353
+ return ${shunit_return}
354
+ }
355
+ _ASSERT_TRUE_='eval assertTrue --lineno "${LINENO:-}"'
356
+
357
+ # Assert that a value or shell test condition is false.
358
+ #
359
+ # In shell, a value of 0 is true and a non-zero value is false. Any integer
360
+ # value passed can thereby be tested.
361
+ #
362
+ # Shell supports much more complicated tests though, and a means to support
363
+ # them was needed. As such, this function tests that conditions are true or
364
+ # false through evaluation rather than just looking for a true or false.
365
+ #
366
+ # The following test will succeed:
367
+ # assertFalse 1
368
+ # assertFalse "[ 'apples' = 'oranges' ]"
369
+ # The folloing test will fail with a message:
370
+ # assertFalse 0
371
+ # assertFalse "test failed" "[ 1 -eq 1 -a 2 -eq 2 ]"
372
+ #
373
+ # Args:
374
+ # message: string: failure message [optional]
375
+ # condition: string: integer value or shell conditional statement
376
+ # Returns:
377
+ # integer: success (TRUE/FALSE/ERROR constant)
378
+ assertFalse()
379
+ {
380
+ ${_SHUNIT_LINENO_}
381
+ if [ $# -lt 1 -o $# -gt 2 ]; then
382
+ _shunit_error "assertFalse() quires one or two arguments; $# given"
383
+ return ${SHUNIT_ERROR}
384
+ fi
385
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
386
+
387
+ shunit_message_=${__shunit_lineno}
388
+ if [ $# -eq 2 ]; then
389
+ shunit_message_="${shunit_message_}$1"
390
+ shift
391
+ fi
392
+ shunit_condition_=$1
393
+
394
+ # see if condition is an integer, i.e. a return value
395
+ shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'`
396
+ shunit_return=${SHUNIT_TRUE}
397
+ if [ -z "${shunit_condition_}" ]; then
398
+ # null condition
399
+ shunit_return=${SHUNIT_FALSE}
400
+ elif [ -n "${shunit_match_}" -a "${shunit_condition_}" = "${shunit_match_}" ]
401
+ then
402
+ # possible return value. treating 0 as true, and non-zero as false.
403
+ [ ${shunit_condition_} -eq 0 ] && shunit_return=${SHUNIT_FALSE}
404
+ else
405
+ # (hopefully) a condition
406
+ ( eval ${shunit_condition_} ) >/dev/null 2>&1
407
+ [ $? -eq 0 ] && shunit_return=${SHUNIT_FALSE}
408
+ fi
409
+
410
+ # record the test
411
+ if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then
412
+ _shunit_assertPass
413
+ else
414
+ _shunit_assertFail "${shunit_message_}"
415
+ fi
416
+
417
+ unset shunit_message_ shunit_condition_ shunit_match_
418
+ return ${shunit_return}
419
+ }
420
+ _ASSERT_FALSE_='eval assertFalse --lineno "${LINENO:-}"'
421
+
422
+ #-----------------------------------------------------------------------------
423
+ # failure functions
424
+ #
425
+
426
+ # Records a test failure.
427
+ #
428
+ # Args:
429
+ # message: string: failure message [optional]
430
+ # Returns:
431
+ # integer: success (TRUE/FALSE/ERROR constant)
432
+ fail()
433
+ {
434
+ ${_SHUNIT_LINENO_}
435
+ if [ $# -gt 1 ]; then
436
+ _shunit_error "fail() requires zero or one arguments; $# given"
437
+ return ${SHUNIT_ERROR}
438
+ fi
439
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
440
+
441
+ shunit_message_=${__shunit_lineno}
442
+ if [ $# -eq 1 ]; then
443
+ shunit_message_="${shunit_message_}$1"
444
+ shift
445
+ fi
446
+
447
+ _shunit_assertFail "${shunit_message_}"
448
+
449
+ unset shunit_message_
450
+ return ${SHUNIT_FALSE}
451
+ }
452
+ _FAIL_='eval fail --lineno "${LINENO:-}"'
453
+
454
+ # Records a test failure, stating two values were not equal.
455
+ #
456
+ # Args:
457
+ # message: string: failure message [optional]
458
+ # expected: string: expected value
459
+ # actual: string: actual value
460
+ # Returns:
461
+ # integer: success (TRUE/FALSE/ERROR constant)
462
+ failNotEquals()
463
+ {
464
+ ${_SHUNIT_LINENO_}
465
+ if [ $# -lt 2 -o $# -gt 3 ]; then
466
+ _shunit_error "failNotEquals() requires one or two arguments; $# given"
467
+ return ${SHUNIT_ERROR}
468
+ fi
469
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
470
+
471
+ shunit_message_=${__shunit_lineno}
472
+ if [ $# -eq 3 ]; then
473
+ shunit_message_="${shunit_message_}$1"
474
+ shift
475
+ fi
476
+ shunit_expected_=$1
477
+ shunit_actual_=$2
478
+
479
+ _shunit_assertFail "${shunit_message_:+${shunit_message_} }expected:<${shunit_expected_}> but was:<${shunit_actual_}>"
480
+
481
+ unset shunit_message_ shunit_expected_ shunit_actual_
482
+ return ${SHUNIT_FALSE}
483
+ }
484
+ _FAIL_NOT_EQUALS_='eval failNotEquals --lineno "${LINENO:-}"'
485
+
486
+ # Records a test failure, stating two values should have been the same.
487
+ #
488
+ # Args:
489
+ # message: string: failure message [optional]
490
+ # expected: string: expected value
491
+ # actual: string: actual value
492
+ # Returns:
493
+ # integer: success (TRUE/FALSE/ERROR constant)
494
+ failSame()
495
+ {
496
+ ${_SHUNIT_LINENO_}
497
+ if [ $# -lt 2 -o $# -gt 3 ]; then
498
+ _shunit_error "failSame() requires two or three arguments; $# given"
499
+ return ${SHUNIT_ERROR}
500
+ fi
501
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
502
+
503
+ shunit_message_=${__shunit_lineno}
504
+ if [ $# -eq 3 ]; then
505
+ shunit_message_="${shunit_message_}$1"
506
+ shift
507
+ fi
508
+
509
+ _shunit_assertFail "${shunit_message_:+${shunit_message_} }expected not same"
510
+
511
+ unset shunit_message_
512
+ return ${SHUNIT_FALSE}
513
+ }
514
+ _FAIL_SAME_='eval failSame --lineno "${LINENO:-}"'
515
+
516
+ # Records a test failure, stating two values were not equal.
517
+ #
518
+ # This is functionally equivalent to calling failNotEquals().
519
+ #
520
+ # Args:
521
+ # message: string: failure message [optional]
522
+ # expected: string: expected value
523
+ # actual: string: actual value
524
+ # Returns:
525
+ # integer: success (TRUE/FALSE/ERROR constant)
526
+ failNotSame()
527
+ {
528
+ ${_SHUNIT_LINENO_}
529
+ if [ $# -lt 2 -o $# -gt 3 ]; then
530
+ _shunit_error "failNotEquals() requires one or two arguments; $# given"
531
+ return ${SHUNIT_ERROR}
532
+ fi
533
+ _shunit_shouldSkip && return ${SHUNIT_TRUE}
534
+
535
+ shunit_message_=${__shunit_lineno}
536
+ if [ $# -eq 3 ]; then
537
+ shunit_message_="${shunit_message_}$1"
538
+ shift
539
+ fi
540
+ failNotEquals "${shunit_message_}" "$1" "$2"
541
+ shunit_return=$?
542
+
543
+ unset shunit_message_
544
+ return ${shunit_return}
545
+ }
546
+ _FAIL_NOT_SAME_='eval failNotSame --lineno "${LINENO:-}"'
547
+
548
+ #-----------------------------------------------------------------------------
549
+ # skipping functions
550
+ #
551
+
552
+ # Force remaining assert and fail functions to be "skipped".
553
+ #
554
+ # This function forces the remaining assert and fail functions to be "skipped",
555
+ # i.e. they will have no effect. Each function skipped will be recorded so that
556
+ # the total of asserts and fails will not be altered.
557
+ #
558
+ # Args:
559
+ # None
560
+ startSkipping()
561
+ {
562
+ __shunit_skip=${SHUNIT_TRUE}
563
+ }
564
+
565
+ # Resume the normal recording behavior of assert and fail calls.
566
+ #
567
+ # Args:
568
+ # None
569
+ endSkipping()
570
+ {
571
+ __shunit_skip=${SHUNIT_FALSE}
572
+ }
573
+
574
+ # Returns the state of assert and fail call skipping.
575
+ #
576
+ # Args:
577
+ # None
578
+ # Returns:
579
+ # boolean: (TRUE/FALSE constant)
580
+ isSkipping()
581
+ {
582
+ return ${__shunit_skip}
583
+ }
584
+
585
+ #-----------------------------------------------------------------------------
586
+ # suite functions
587
+ #
588
+
589
+ # Stub. This function should contains all unit test calls to be made.
590
+ #
591
+ # DEPRECATED (as of 2.1.0)
592
+ #
593
+ # This function can be optionally overridden by the user in their test suite.
594
+ #
595
+ # If this function exists, it will be called when shunit2 is sourced. If it
596
+ # does not exist, shunit2 will search the parent script for all functions
597
+ # beginning with the word 'test', and they will be added dynamically to the
598
+ # test suite.
599
+ #
600
+ # This function should be overridden by the user in their unit test suite.
601
+ # Note: see _shunit_mktempFunc() for actual implementation
602
+ #
603
+ # Args:
604
+ # None
605
+ #suite() { :; } # DO NOT UNCOMMENT THIS FUNCTION
606
+
607
+ # Adds a function name to the list of tests schedule for execution.
608
+ #
609
+ # This function should only be called from within the suite() function.
610
+ #
611
+ # Args:
612
+ # function: string: name of a function to add to current unit test suite
613
+ suite_addTest()
614
+ {
615
+ shunit_func_=${1:-}
616
+
617
+ __shunit_suite="${__shunit_suite:+${__shunit_suite} }${shunit_func_}"
618
+ __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1`
619
+
620
+ unset shunit_func_
621
+ }
622
+
623
+ # Stub. This function will be called once before any tests are run.
624
+ #
625
+ # Common one-time environment preparation tasks shared by all tests can be
626
+ # defined here.
627
+ #
628
+ # This function should be overridden by the user in their unit test suite.
629
+ # Note: see _shunit_mktempFunc() for actual implementation
630
+ #
631
+ # Args:
632
+ # None
633
+ #oneTimeSetUp() { :; } # DO NOT UNCOMMENT THIS FUNCTION
634
+
635
+ # Stub. This function will be called once after all tests are finished.
636
+ #
637
+ # Common one-time environment cleanup tasks shared by all tests can be defined
638
+ # here.
639
+ #
640
+ # This function should be overridden by the user in their unit test suite.
641
+ # Note: see _shunit_mktempFunc() for actual implementation
642
+ #
643
+ # Args:
644
+ # None
645
+ #oneTimeTearDown() { :; } # DO NOT UNCOMMENT THIS FUNCTION
646
+
647
+ # Stub. This function will be called before each test is run.
648
+ #
649
+ # Common environment preparation tasks shared by all tests can be defined here.
650
+ #
651
+ # This function should be overridden by the user in their unit test suite.
652
+ # Note: see _shunit_mktempFunc() for actual implementation
653
+ #
654
+ # Args:
655
+ # None
656
+ #setUp() { :; }
657
+
658
+ # Note: see _shunit_mktempFunc() for actual implementation
659
+ # Stub. This function will be called after each test is run.
660
+ #
661
+ # Common environment cleanup tasks shared by all tests can be defined here.
662
+ #
663
+ # This function should be overridden by the user in their unit test suite.
664
+ # Note: see _shunit_mktempFunc() for actual implementation
665
+ #
666
+ # Args:
667
+ # None
668
+ #tearDown() { :; } # DO NOT UNCOMMENT THIS FUNCTION
669
+
670
+ #------------------------------------------------------------------------------
671
+ # internal shUnit2 functions
672
+ #
673
+
674
+ # Create a temporary directory to store various run-time files in.
675
+ #
676
+ # This function is a cross-platform temporary directory creation tool. Not all
677
+ # OSes have the mktemp function, so one is included here.
678
+ #
679
+ # Args:
680
+ # None
681
+ # Outputs:
682
+ # string: the temporary directory that was created
683
+ _shunit_mktempDir()
684
+ {
685
+ # try the standard mktemp function
686
+ ( exec mktemp -dqt shunit.XXXXXX 2>/dev/null ) && return
687
+
688
+ # the standard mktemp didn't work. doing our own.
689
+ if [ -r '/dev/urandom' -a -x '/usr/bin/od' ]; then
690
+ _shunit_random_=`/usr/bin/od -vAn -N4 -tx4 </dev/urandom \
691
+ |sed 's/^[^0-9a-f]*//'`
692
+ elif [ -n "${RANDOM:-}" ]; then
693
+ # $RANDOM works
694
+ _shunit_random_=${RANDOM}${RANDOM}${RANDOM}$$
695
+ else
696
+ # $RANDOM doesn't work
697
+ _shunit_date_=`date '+%Y%m%d%H%M%S'`
698
+ _shunit_random_=`expr ${_shunit_date_} / $$`
699
+ fi
700
+
701
+ _shunit_tmpDir_="${TMPDIR:-/tmp}/shunit.${_shunit_random_}"
702
+ ( umask 077 && mkdir "${_shunit_tmpDir_}" ) || \
703
+ _shunit_fatal 'could not create temporary directory! exiting'
704
+
705
+ echo ${_shunit_tmpDir_}
706
+ unset _shunit_date_ _shunit_random_ _shunit_tmpDir_
707
+ }
708
+
709
+ # This function is here to work around issues in Cygwin.
710
+ #
711
+ # Args:
712
+ # None
713
+ _shunit_mktempFunc()
714
+ {
715
+ for _shunit_func_ in oneTimeSetUp oneTimeTearDown setUp tearDown suite noexec
716
+ do
717
+ _shunit_file_="${__shunit_tmpDir}/${_shunit_func_}"
718
+ cat <<EOF >"${_shunit_file_}"
719
+ #! /bin/sh
720
+ exit ${SHUNIT_TRUE}
721
+ EOF
722
+ chmod +x "${_shunit_file_}"
723
+ done
724
+
725
+ unset _shunit_file_
726
+ }
727
+
728
+ # Final cleanup function to leave things as we found them.
729
+ #
730
+ # Besides removing the temporary directory, this function is in charge of the
731
+ # final exit code of the unit test. The exit code is based on how the script
732
+ # was ended (e.g. normal exit, or via Ctrl-C).
733
+ #
734
+ # Args:
735
+ # name: string: name of the trap called (specified when trap defined)
736
+ _shunit_cleanup()
737
+ {
738
+ _shunit_name_=$1
739
+
740
+ case ${_shunit_name_} in
741
+ EXIT) _shunit_signal_=0 ;;
742
+ INT) _shunit_signal_=2 ;;
743
+ TERM) _shunit_signal_=15 ;;
744
+ *)
745
+ _shunit_warn "unrecognized trap value (${_shunit_name_})"
746
+ _shunit_signal_=0
747
+ ;;
748
+ esac
749
+
750
+ # do our work
751
+ rm -fr "${__shunit_tmpDir}"
752
+
753
+ # exit for all non-EXIT signals
754
+ if [ ${_shunit_name_} != 'EXIT' ]; then
755
+ _shunit_warn "trapped and now handling the (${_shunit_name_}) signal"
756
+ # disable EXIT trap
757
+ trap 0
758
+ # add 128 to signal and exit
759
+ exit `expr ${_shunit_signal_} + 128`
760
+ elif [ ${__shunit_reportGenerated} -eq ${SHUNIT_FALSE} ] ; then
761
+ _shunit_assertFail 'Unknown failure encountered running a test'
762
+ _shunit_generateReport
763
+ exit ${SHUNIT_ERROR}
764
+ fi
765
+
766
+ unset _shunit_name_ _shunit_signal_
767
+ }
768
+
769
+ # The actual running of the tests happens here.
770
+ #
771
+ # Args:
772
+ # None
773
+ _shunit_execSuite()
774
+ {
775
+ for _shunit_test_ in ${__shunit_suite}; do
776
+ __shunit_testSuccess=${SHUNIT_TRUE}
777
+
778
+ # disable skipping
779
+ endSkipping
780
+
781
+ # execute the per-test setup function
782
+ setUp
783
+
784
+ # execute the test
785
+ echo "${_shunit_test_}"
786
+ eval ${_shunit_test_}
787
+
788
+ # execute the per-test tear-down function
789
+ tearDown
790
+
791
+ # update stats
792
+ if [ ${__shunit_testSuccess} -eq ${SHUNIT_TRUE} ]; then
793
+ __shunit_testsPassed=`expr ${__shunit_testsPassed} + 1`
794
+ else
795
+ __shunit_testsFailed=`expr ${__shunit_testsFailed} + 1`
796
+ fi
797
+ done
798
+
799
+ unset _shunit_test_
800
+ }
801
+
802
+ # Generates the user friendly report with appropriate OK/FAILED message.
803
+ #
804
+ # Args:
805
+ # None
806
+ # Output:
807
+ # string: the report of successful and failed tests, as well as totals.
808
+ _shunit_generateReport()
809
+ {
810
+ _shunit_ok_=${SHUNIT_TRUE}
811
+
812
+ # if no exit code was provided one, determine an appropriate one
813
+ [ ${__shunit_testsFailed} -gt 0 \
814
+ -o ${__shunit_testSuccess} -eq ${SHUNIT_FALSE} ] \
815
+ && _shunit_ok_=${SHUNIT_FALSE}
816
+
817
+ echo
818
+ if [ ${__shunit_testsTotal} -eq 1 ]; then
819
+ echo "Ran ${__shunit_testsTotal} test."
820
+ else
821
+ echo "Ran ${__shunit_testsTotal} tests."
822
+ fi
823
+
824
+ _shunit_failures_=''
825
+ _shunit_skipped_=''
826
+ [ ${__shunit_assertsFailed} -gt 0 ] \
827
+ && _shunit_failures_="failures=${__shunit_assertsFailed}"
828
+ [ ${__shunit_assertsSkipped} -gt 0 ] \
829
+ && _shunit_skipped_="skipped=${__shunit_assertsSkipped}"
830
+
831
+ if [ ${_shunit_ok_} -eq ${SHUNIT_TRUE} ]; then
832
+ _shunit_msg_='OK'
833
+ [ -n "${_shunit_skipped_}" ] \
834
+ && _shunit_msg_="${_shunit_msg_} (${_shunit_skipped_})"
835
+ else
836
+ _shunit_msg_="FAILED (${_shunit_failures_}"
837
+ [ -n "${_shunit_skipped_}" ] \
838
+ && _shunit_msg_="${_shunit_msg_},${_shunit_skipped_}"
839
+ _shunit_msg_="${_shunit_msg_})"
840
+ fi
841
+
842
+ echo
843
+ echo ${_shunit_msg_}
844
+ __shunit_reportGenerated=${SHUNIT_TRUE}
845
+
846
+ unset _shunit_failures_ _shunit_msg_ _shunit_ok_ _shunit_skipped_
847
+ }
848
+
849
+ # Test for whether a function should be skipped.
850
+ #
851
+ # Args:
852
+ # None
853
+ # Returns:
854
+ # boolean: whether the test should be skipped (TRUE/FALSE constant)
855
+ _shunit_shouldSkip()
856
+ {
857
+ [ ${__shunit_skip} -eq ${SHUNIT_FALSE} ] && return ${SHUNIT_FALSE}
858
+ _shunit_assertSkip
859
+ }
860
+
861
+ # Records a successful test.
862
+ #
863
+ # Args:
864
+ # None
865
+ _shunit_assertPass()
866
+ {
867
+ __shunit_assertsPassed=`expr ${__shunit_assertsPassed} + 1`
868
+ __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1`
869
+ }
870
+
871
+ # Records a test failure.
872
+ #
873
+ # Args:
874
+ # message: string: failure message to provide user
875
+ _shunit_assertFail()
876
+ {
877
+ _shunit_msg_=$1
878
+
879
+ __shunit_testSuccess=${SHUNIT_FALSE}
880
+ __shunit_assertsFailed=`expr ${__shunit_assertsFailed} + 1`
881
+ __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1`
882
+ echo "${__SHUNIT_ASSERT_MSG_PREFIX}${_shunit_msg_}"
883
+
884
+ unset _shunit_msg_
885
+ }
886
+
887
+ # Records a skipped test.
888
+ #
889
+ # Args:
890
+ # None
891
+ _shunit_assertSkip()
892
+ {
893
+ __shunit_assertsSkipped=`expr ${__shunit_assertsSkipped} + 1`
894
+ __shunit_assertsTotal=`expr ${__shunit_assertsTotal} + 1`
895
+ }
896
+
897
+ # Prepare a script filename for sourcing.
898
+ #
899
+ # Args:
900
+ # script: string: path to a script to source
901
+ # Returns:
902
+ # string: filename prefixed with ./ (if necessary)
903
+ _shunit_prepForSourcing()
904
+ {
905
+ _shunit_script_=$1
906
+ case "${_shunit_script_}" in
907
+ /*|./*) echo "${_shunit_script_}" ;;
908
+ *) echo "./${_shunit_script_}" ;;
909
+ esac
910
+ unset _shunit_script_
911
+ }
912
+
913
+ # Escape a character in a string.
914
+ #
915
+ # Args:
916
+ # c: string: unescaped character
917
+ # s: string: to escape character in
918
+ # Returns:
919
+ # string: with escaped character(s)
920
+ _shunit_escapeCharInStr()
921
+ {
922
+ [ -n "$2" ] || return # no point in doing work on an empty string
923
+
924
+ # Note: using shorter variable names to prevent conflicts with
925
+ # _shunit_escapeCharactersInString().
926
+ _shunit_c_=$1
927
+ _shunit_s_=$2
928
+
929
+
930
+ # escape the character
931
+ echo ''${_shunit_s_}'' |sed 's/\'${_shunit_c_}'/\\\'${_shunit_c_}'/g'
932
+
933
+ unset _shunit_c_ _shunit_s_
934
+ }
935
+
936
+ # Escape a character in a string.
937
+ #
938
+ # Args:
939
+ # str: string: to escape characters in
940
+ # Returns:
941
+ # string: with escaped character(s)
942
+ _shunit_escapeCharactersInString()
943
+ {
944
+ [ -n "$1" ] || return # no point in doing work on an empty string
945
+
946
+ _shunit_str_=$1
947
+
948
+ # Note: using longer variable names to prevent conflicts with
949
+ # _shunit_escapeCharInStr().
950
+ for _shunit_char_ in '"' '$' "'" '`'; do
951
+ _shunit_str_=`_shunit_escapeCharInStr "${_shunit_char_}" "${_shunit_str_}"`
952
+ done
953
+
954
+ echo "${_shunit_str_}"
955
+ unset _shunit_char_ _shunit_str_
956
+ }
957
+
958
+ # Extract list of functions to run tests against.
959
+ #
960
+ # Args:
961
+ # script: string: name of script to extract functions from
962
+ # Returns:
963
+ # string: of function names
964
+ _shunit_extractTestFunctions()
965
+ {
966
+ _shunit_script_=$1
967
+
968
+ # extract the lines with test function names, strip of anything besides the
969
+ # function name, and output everything on a single line.
970
+ _shunit_regex_='^[ ]*(function )*test[A-Za-z0-9_]* *\(\)'
971
+ egrep "${_shunit_regex_}" "${_shunit_script_}" \
972
+ |sed 's/^[^A-Za-z0-9_]*//;s/^function //;s/\([A-Za-z0-9_]*\).*/\1/g' \
973
+ |xargs
974
+
975
+ unset _shunit_regex_ _shunit_script_
976
+ }
977
+
978
+ #------------------------------------------------------------------------------
979
+ # main
980
+ #
981
+
982
+ # determine the operating mode
983
+ if [ $# -eq 0 ]; then
984
+ __shunit_script=${__SHUNIT_PARENT}
985
+ __shunit_mode=${__SHUNIT_MODE_SOURCED}
986
+ else
987
+ __shunit_script=$1
988
+ [ -r "${__shunit_script}" ] || \
989
+ _shunit_fatal "unable to read from ${__shunit_script}"
990
+ __shunit_mode=${__SHUNIT_MODE_STANDALONE}
991
+ fi
992
+
993
+ # create a temporary storage location
994
+ __shunit_tmpDir=`_shunit_mktempDir`
995
+
996
+ # provide a public temporary directory for unit test scripts
997
+ # TODO(kward): document this
998
+ SHUNIT_TMPDIR="${__shunit_tmpDir}/tmp"
999
+ mkdir "${SHUNIT_TMPDIR}"
1000
+
1001
+ # setup traps to clean up after ourselves
1002
+ trap '_shunit_cleanup EXIT' 0
1003
+ trap '_shunit_cleanup INT' 2
1004
+ trap '_shunit_cleanup TERM' 15
1005
+
1006
+ # create phantom functions to work around issues with Cygwin
1007
+ _shunit_mktempFunc
1008
+ PATH="${__shunit_tmpDir}:${PATH}"
1009
+
1010
+ # make sure phantom functions are executable. this will bite if /tmp (or the
1011
+ # current $TMPDIR) points to a path on a partition that was mounted with the
1012
+ # 'noexec' option. the noexec command was created with _shunit_mktempFunc().
1013
+ noexec 2>/dev/null || _shunit_fatal \
1014
+ 'please declare TMPDIR with path on partition with exec permission'
1015
+
1016
+ # we must manually source the tests in standalone mode
1017
+ if [ "${__shunit_mode}" = "${__SHUNIT_MODE_STANDALONE}" ]; then
1018
+ . "`_shunit_prepForSourcing \"${__shunit_script}\"`"
1019
+ fi
1020
+
1021
+ # execute the oneTimeSetUp function (if it exists)
1022
+ oneTimeSetUp
1023
+
1024
+ # execute the suite function defined in the parent test script
1025
+ # deprecated as of 2.1.0
1026
+ suite
1027
+
1028
+ # if no suite function was defined, dynamically build a list of functions
1029
+ if [ -z "${__shunit_suite}" ]; then
1030
+ shunit_funcs_=`_shunit_extractTestFunctions "${__shunit_script}"`
1031
+ for shunit_func_ in ${shunit_funcs_}; do
1032
+ suite_addTest ${shunit_func_}
1033
+ done
1034
+ fi
1035
+ unset shunit_func_ shunit_funcs_
1036
+
1037
+ # execute the tests
1038
+ _shunit_execSuite
1039
+
1040
+ # execute the oneTimeTearDown function (if it exists)
1041
+ oneTimeTearDown
1042
+
1043
+ # generate the report
1044
+ _shunit_generateReport
1045
+
1046
+ # that's it folks
1047
+ [ ${__shunit_testsFailed} -eq 0 ]
1048
+ exit $?