busser-bats 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +32 -0
  3. data/.github/workflows/pr-title.yml +28 -0
  4. data/.github/workflows/publish.yml +67 -0
  5. data/.gitignore +0 -1
  6. data/.release-please-manifest.json +3 -0
  7. data/.rubocop.yml +2 -7
  8. data/.yamllint +6 -0
  9. data/CHANGELOG.md +23 -1
  10. data/CONTRIBUTING.md +86 -0
  11. data/Gemfile +9 -13
  12. data/README.md +100 -30
  13. data/Rakefile +43 -24
  14. data/busser-bats.gemspec +23 -15
  15. data/config/features/support/env.rb +0 -5
  16. data/features/support/env.rb +5 -14
  17. data/features/test_command.feature +31 -31
  18. data/lib/busser/bats/version.rb +3 -1
  19. data/lib/busser/runner_plugin/bats.rb +27 -3
  20. data/release-please-config.json +15 -0
  21. data/renovate.json +2 -2
  22. data/spec/busser/runner_plugin/bats_spec.rb +41 -0
  23. data/spec/spec_helper.rb +2 -0
  24. data/vendor/bats/LICENSE.md +53 -0
  25. data/vendor/bats/README.md +84 -242
  26. data/vendor/bats/VERSION.txt +1 -1
  27. data/vendor/bats/bin/bats +75 -0
  28. data/vendor/bats/install.sh +20 -28
  29. data/vendor/bats/lib/bats-core/common.bash +278 -0
  30. data/vendor/bats/lib/bats-core/formatter.bash +151 -0
  31. data/vendor/bats/lib/bats-core/preprocessing.bash +19 -0
  32. data/vendor/bats/lib/bats-core/semaphore.bash +113 -0
  33. data/vendor/bats/lib/bats-core/test_functions.bash +539 -0
  34. data/vendor/bats/lib/bats-core/tracing.bash +425 -0
  35. data/vendor/bats/lib/bats-core/validator.bash +37 -0
  36. data/vendor/bats/lib/bats-core/warnings.bash +44 -0
  37. data/vendor/bats/libexec/bats-core/bats +549 -0
  38. data/vendor/bats/libexec/bats-core/bats-exec-file +402 -0
  39. data/vendor/bats/libexec/bats-core/bats-exec-suite +342 -0
  40. data/vendor/bats/libexec/bats-core/bats-exec-test +383 -0
  41. data/vendor/bats/libexec/bats-core/bats-format-cat +6 -0
  42. data/vendor/bats/libexec/bats-core/bats-format-junit +293 -0
  43. data/vendor/bats/libexec/bats-core/bats-format-pretty +360 -0
  44. data/vendor/bats/libexec/bats-core/bats-format-tap +55 -0
  45. data/vendor/bats/libexec/bats-core/bats-format-tap13 +89 -0
  46. data/vendor/bats/libexec/bats-core/bats-gather-tests +402 -0
  47. data/vendor/bats/libexec/bats-core/bats-preprocess +118 -0
  48. data/vendor/bats/man/Makefile +16 -3
  49. data/vendor/bats/man/bats.1 +100 -58
  50. data/vendor/bats/man/bats.1.ronn +102 -12
  51. data/vendor/bats/man/bats.7 +205 -83
  52. data/vendor/bats/man/bats.7.ronn +262 -14
  53. data/vendor/bats/uninstall.sh +63 -0
  54. metadata +44 -22
  55. data/.github/dependabot.yml +0 -8
  56. data/.github/workflows/lint.yaml +0 -9
  57. data/.github/workflows/publish.yaml +0 -35
  58. data/.tool-versions +0 -1
  59. data/Guardfile +0 -26
  60. data/vendor/bats/.gitattributes +0 -3
  61. data/vendor/bats/.travis.yml +0 -5
  62. data/vendor/bats/LICENSE +0 -20
  63. data/vendor/bats/bin/bats +0 -1
  64. data/vendor/bats/package.json +0 -9
@@ -0,0 +1,342 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ count_only_flag=''
5
+ filter=''
6
+ nfilter=''
7
+ num_jobs=${BATS_NUMBER_OF_PARALLEL_JOBS:-1}
8
+ parallel_binary_name=${BATS_PARALLEL_BINARY_NAME:-"parallel"}
9
+ BATS_ABORT_ON_FAILURE=
10
+ bats_no_parallelize_across_files=${BATS_NO_PARALLELIZE_ACROSS_FILES-}
11
+ bats_no_parallelize_within_files=
12
+ filter_status=''
13
+ gather_tests_flags=('--dummy-flag')
14
+ flags=('--dummy-flag') # add a dummy flag to prevent unset variable errors on empty array expansion in old bash versions
15
+ setup_suite_file=''
16
+ BATS_TRACE_LEVEL="${BATS_TRACE_LEVEL:-0}"
17
+ BATS_SHOW_OUTPUT_OF_SUCCEEDING_TESTS=
18
+ BATS_EMPTY_SUITE_STATUS=1
19
+
20
+ abort() {
21
+ printf 'Error: %s\n' "$1" >&2
22
+ exit 1
23
+ }
24
+
25
+ # shellcheck source=lib/bats-core/common.bash disable=SC2153
26
+ source "$BATS_ROOT/$BATS_LIBDIR/bats-core/common.bash"
27
+
28
+ while [[ "$#" -ne 0 ]]; do
29
+ case "$1" in
30
+ -c)
31
+ count_only_flag=1
32
+ ;;
33
+ -f)
34
+ shift
35
+ filter="$1"
36
+ ;;
37
+ -j)
38
+ shift
39
+ num_jobs="$1"
40
+ flags+=('-j' "$num_jobs")
41
+ ;;
42
+ --parallel-binary-name)
43
+ shift
44
+ parallel_binary_name="$1"
45
+ ;;
46
+ -T)
47
+ flags+=('-T')
48
+ ;;
49
+ -x)
50
+ flags+=('-x')
51
+ ;;
52
+ --abort)
53
+ flags+=('--abort')
54
+ BATS_ABORT_ON_FAILURE=1
55
+ ;;
56
+ --no-parallelize-across-files)
57
+ bats_no_parallelize_across_files=1
58
+ ;;
59
+ --no-parallelize-within-files)
60
+ bats_no_parallelize_within_files=1
61
+ flags+=("--no-parallelize-within-files")
62
+ ;;
63
+ --filter-status)
64
+ shift
65
+ filter_status="$1"
66
+ ;;
67
+ --filter-tags)
68
+ shift
69
+ gather_tests_flags+=("--filter-tags" "$1")
70
+ ;;
71
+ --negative-filter)
72
+ shift
73
+ nfilter="$1"
74
+ ;;
75
+ --dummy-flag) ;;
76
+
77
+ --trace)
78
+ flags+=('--trace')
79
+ ((++BATS_TRACE_LEVEL)) # avoid returning 0
80
+ ;;
81
+ --print-output-on-failure)
82
+ flags+=(--print-output-on-failure)
83
+ ;;
84
+ --show-output-of-passing-tests)
85
+ flags+=(--show-output-of-passing-tests)
86
+ BATS_SHOW_OUTPUT_OF_SUCCEEDING_TESTS=1
87
+ ;;
88
+ --verbose-run)
89
+ flags+=(--verbose-run)
90
+ ;;
91
+ --gather-test-outputs-in)
92
+ shift
93
+ flags+=(--gather-test-outputs-in "$1")
94
+ ;;
95
+ --setup-suite-file)
96
+ shift
97
+ setup_suite_file="$1"
98
+ ;;
99
+ --allow-empty-suite)
100
+ BATS_EMPTY_SUITE_STATUS=0
101
+ ;;
102
+ *)
103
+ break
104
+ ;;
105
+ esac
106
+ shift
107
+ done
108
+
109
+ if [[ "$num_jobs" != 1 ]]; then
110
+ if ! type -p "${parallel_binary_name}" >/dev/null && "${parallel_binary_name}" --version &>/dev/null && [[ -z "$bats_no_parallelize_across_files" ]]; then
111
+ abort "Cannot execute \"${num_jobs}\" jobs without GNU parallel"
112
+ fi
113
+ # shellcheck source=lib/bats-core/semaphore.bash
114
+ source "${BATS_ROOT}/$BATS_LIBDIR/bats-core/semaphore.bash"
115
+ bats_semaphore_setup
116
+ fi
117
+
118
+ # create a file that contains all (filtered) tests to run from all files
119
+ TESTS_LIST_FILE="${BATS_RUN_TMPDIR}/test_list_file.txt"
120
+
121
+ TEST_ROOT=${1-}
122
+ TEST_ROOT=${TEST_ROOT%/*}
123
+ export BATS_RUN_LOGS_DIRECTORY="$TEST_ROOT/.bats/run-logs"
124
+ if [[ ! -d "$BATS_RUN_LOGS_DIRECTORY" ]]; then
125
+ if [[ -n "$filter_status" ]]; then
126
+ printf "Error: --filter-status needs '%s/' to save failed tests. Please create this folder, add it to .gitignore and try again.\n" "$BATS_RUN_LOGS_DIRECTORY"
127
+ exit 1
128
+ else
129
+ BATS_RUN_LOGS_DIRECTORY=
130
+ fi
131
+ # discard via sink instead of having a conditional later
132
+ export BATS_RUNLOG_FILE='/dev/null'
133
+ else
134
+ # use UTC (-u) to avoid problems with TZ changes
135
+ BATS_RUNLOG_DATE=$(date -u '+%Y-%m-%d %H:%M:%S UTC')
136
+ export BATS_RUNLOG_FILE="$BATS_RUN_LOGS_DIRECTORY/${BATS_RUNLOG_DATE}.log" BATS_RUNLOG_DATE
137
+ if [[ ! -w "$BATS_RUN_LOGS_DIRECTORY" ]]; then
138
+ printf "WARNING: Cannot write in %s. This run will not write a log!\n" "$BATS_RUN_LOGS_DIRECTORY" >&2
139
+ BATS_RUNLOG_FILE='/dev/null' # disable runlog file
140
+ fi
141
+ fi
142
+
143
+ # create file even if no tests are found so the `read` below won't fail
144
+ touch "$TESTS_LIST_FILE"
145
+
146
+ gather_tests_output=$(TESTS_LIST_FILE="$TESTS_LIST_FILE" filter="$filter" nfilter="$nfilter" filter_status="$filter_status" bats-gather-tests "${gather_tests_flags[@]}" -- "$@")
147
+ test_count=$(grep -c ^ "$TESTS_LIST_FILE" || true) # don't fail here when there are no tests
148
+ if [[ $gather_tests_output == focus_mode ]]; then
149
+ focus_mode=1
150
+ else
151
+ focus_mode=
152
+ fi
153
+
154
+ if [[ -n "$count_only_flag" ]]; then
155
+ printf '%d\n' "${test_count}"
156
+ # we don't want to pollute the runlog files, as no tests would have been run
157
+ [[ $BATS_RUNLOG_FILE != /dev/null ]] && rm "$BATS_RUNLOG_FILE"
158
+ exit 0
159
+ fi
160
+
161
+ if [[ -n "$bats_no_parallelize_across_files" ]] && [[ ! "$num_jobs" -gt 1 ]]; then
162
+ abort "The flag --no-parallelize-across-files requires at least --jobs 2"
163
+ fi
164
+
165
+ if [[ -n "$bats_no_parallelize_within_files" ]] && [[ ! "$num_jobs" -gt 1 ]]; then
166
+ abort "The flag --no-parallelize-across-files requires at least --jobs 2"
167
+ fi
168
+
169
+ # only abort on the lowest levels
170
+ trap 'BATS_INTERRUPTED=true' INT
171
+
172
+ if [[ -n "$focus_mode" ]]; then
173
+ printf "WARNING: This test run only contains tests tagged \`bats:focus\`!\n" >&2
174
+ fi
175
+
176
+ bats_exit_suite() {
177
+ if [[ "$focus_mode" == 1 && $bats_exec_suite_status -eq 0 ]]; then
178
+ if [[ ${BATS_NO_FAIL_FOCUS_RUN-} == 1 ]]; then
179
+ printf "WARNING: This test run only contains tests tagged \`bats:focus\`!\n" >&2
180
+ else
181
+ printf "Marking test run as failed due to \`bats:focus\` tag. (Set \`BATS_NO_FAIL_FOCUS_RUN=1\` to disable.)\n" >&2
182
+ bats_exec_suite_status=1
183
+ fi
184
+ fi
185
+
186
+ exit "$bats_exec_suite_status" # the actual exit code will be set by the exit trap using bats_exec_suite_status
187
+ }
188
+
189
+ bats_exec_suite_status=0
190
+ printf '1..%d\n' "${test_count}"
191
+
192
+ # No point on continuing if there's no tests.
193
+ if [[ "${test_count}" == 0 ]]; then
194
+ bats_exec_suite_status=$BATS_EMPTY_SUITE_STATUS
195
+ if (( bats_exec_suite_status != 0)); then
196
+ printf "ERROR: Found no tests. (Try \`--allow-empty-suite\`?)" >&2
197
+ fi
198
+ bats_exit_suite
199
+ fi
200
+
201
+ export BATS_SUITE_TMPDIR="${BATS_RUN_TMPDIR}/suite"
202
+ if ! mkdir "$BATS_SUITE_TMPDIR"; then
203
+ printf '%s\n' "Failed to create BATS_SUITE_TMPDIR" >&2
204
+ exit 1
205
+ fi
206
+
207
+ # Deduplicate filenames (without reordering) to avoid running duplicate tests n by n times.
208
+ # (see https://github.com/bats-core/bats-core/issues/329)
209
+ # If a file was specified multiple times, we already got it repeatedly in our TESTS_LIST_FILE.
210
+ # Thus, it suffices to bats-exec-file it once to run all repeated tests on it.
211
+ IFS=$'\n' read -d '' -r -a BATS_UNIQUE_TEST_FILENAMES < <(printf "%s\n" "$@" | nl | sort -k 2 | uniq -f 1 | sort -n | cut -f 2-) || true
212
+
213
+ # shellcheck source=lib/bats-core/tracing.bash
214
+ source "$BATS_ROOT/$BATS_LIBDIR/bats-core/tracing.bash"
215
+ bats_setup_tracing
216
+
217
+ trap bats_suite_exit_trap EXIT
218
+
219
+ exec 3<&1
220
+
221
+ # shellcheck disable=SC2317,SC2329
222
+ bats_suite_exit_trap() {
223
+ local print_bats_out="${BATS_SHOW_OUTPUT_OF_SUCCEEDING_TESTS}"
224
+ if [[ -z "${BATS_SETUP_SUITE_COMPLETED}" || -z "${BATS_TEARDOWN_SUITE_COMPLETED}" ]]; then
225
+ if [[ -z "${BATS_SETUP_SUITE_COMPLETED}" ]]; then
226
+ printf "not ok 1 setup_suite\n"
227
+ elif [[ -z "${BATS_TEARDOWN_SUITE_COMPLETED}" ]]; then
228
+ printf "not ok %d teardown_suite\n" $((test_count + 1))
229
+ fi
230
+ local stack_trace
231
+ bats_get_failure_stack_trace stack_trace
232
+ bats_print_stack_trace "${stack_trace[@]}"
233
+ bats_print_failed_command "${stack_trace[@]}"
234
+ print_bats_out=1
235
+ bats_exec_suite_status=1
236
+ fi
237
+
238
+ if [[ -n "$print_bats_out" ]]; then
239
+ bats_prefix_lines_for_tap_output <"$BATS_OUT"
240
+ fi
241
+
242
+ if [[ ${BATS_INTERRUPTED-NOTSET} != NOTSET ]]; then
243
+ printf "\n# Received SIGINT, aborting ...\n\n"
244
+ fi
245
+
246
+ if [[ -d "$BATS_RUN_LOGS_DIRECTORY" && -n "${BATS_INTERRUPTED:-}" ]]; then
247
+ # aborting a test run with CTRL+C does not save the runlog file
248
+ [[ "$BATS_RUNLOG_FILE" != /dev/null ]] && rm "$BATS_RUNLOG_FILE"
249
+ fi
250
+ exit "$bats_exec_suite_status"
251
+ } >&3
252
+
253
+ bats_run_teardown_suite() {
254
+ local bats_teardown_suite_status=0
255
+ # avoid being called twice, in case this is not called through bats_teardown_suite_trap
256
+ # but from the end of file
257
+ trap bats_suite_exit_trap EXIT
258
+
259
+ bats_set_stacktrace_limit
260
+
261
+ BATS_TEARDOWN_SUITE_COMPLETED=
262
+ teardown_suite >>"$BATS_OUT" 2>&1 || bats_teardown_suite_status=$?
263
+ if ((bats_teardown_suite_status == 0)); then
264
+ BATS_TEARDOWN_SUITE_COMPLETED=1
265
+ elif [[ -n "${BATS_SETUP_SUITE_COMPLETED:-}" ]]; then
266
+ # shellcheck disable=SC2034
267
+ BATS_DEBUG_LAST_STACK_TRACE_IS_VALID=1
268
+ BATS_ERROR_STATUS=$bats_teardown_suite_status
269
+ return $BATS_ERROR_STATUS
270
+ fi
271
+ }
272
+
273
+ # shellcheck disable=SC2317,SC2329
274
+ bats_teardown_suite_trap() {
275
+ bats_run_teardown_suite
276
+ bats_suite_exit_trap
277
+ }
278
+
279
+ teardown_suite() {
280
+ :
281
+ }
282
+
283
+ trap bats_teardown_suite_trap EXIT
284
+
285
+ BATS_OUT="$BATS_RUN_TMPDIR/suite.out"
286
+ if [[ -n "$setup_suite_file" ]]; then
287
+ setup_suite() {
288
+ printf "%s does not define \`setup_suite()\`\n" "$setup_suite_file" >&2
289
+ return 1
290
+ }
291
+
292
+ # shellcheck disable=SC2034 # will be used in the sourced file below
293
+ BATS_TEST_FILENAME="$setup_suite_file"
294
+ # shellcheck source=lib/bats-core/test_functions.bash
295
+ source "$BATS_ROOT/$BATS_LIBDIR/bats-core/test_functions.bash"
296
+ _bats_test_functions_setup -1 # invalid TEST_NUMBER, as this is not a test
297
+
298
+ # shellcheck disable=SC1090
299
+ source "$setup_suite_file"
300
+
301
+ bats_set_stacktrace_limit
302
+
303
+ set -eET
304
+ export BATS_SETUP_SUITE_COMPLETED=
305
+ setup_suite >>"$BATS_OUT" 2>&1
306
+ BATS_SETUP_SUITE_COMPLETED=1
307
+ set +ET
308
+ else
309
+ # prevent exit trap from printing an error because of incomplete setup_suite,
310
+ # when there was none to execute
311
+ BATS_SETUP_SUITE_COMPLETED=1
312
+ fi
313
+
314
+ if [[ "$num_jobs" -gt 1 ]] && [[ -z "$bats_no_parallelize_across_files" ]]; then
315
+ parallel_flags=(--keep-order --jobs "$num_jobs")
316
+ if (( BATS_ABORT_ON_FAILURE )); then
317
+ parallel_flags+=('--halt' 'now,fail=1')
318
+ fi
319
+ # run files in parallel to get the maximum pool of parallel tasks
320
+ # shellcheck disable=SC2086,SC2068
321
+ # we need to handle the quoting of ${flags[@]} ourselves,
322
+ # because parallel can only quote it as one
323
+ "${parallel_binary_name}" "${parallel_flags[@]}" -- "bats-exec-file" "$(printf "%q " "${flags[@]}")" "{#}" "{}" "$TESTS_LIST_FILE" <<< "$(printf "%s\n" "${BATS_UNIQUE_TEST_FILENAMES[@]}")" 2>&1 || bats_exec_suite_status=1
324
+ else
325
+ file_index=0
326
+ for filename in "${BATS_UNIQUE_TEST_FILENAMES[@]}"; do
327
+ (( ++file_index ))
328
+ if [[ "${BATS_INTERRUPTED-NOTSET}" != NOTSET ]]; then
329
+ bats_exec_suite_status=130 # bash's code for SIGINT exits
330
+ break
331
+ fi
332
+ bats-exec-file "${flags[@]}" "$file_index" "$filename" "${TESTS_LIST_FILE}" || bats_exec_suite_status=1
333
+ if (( BATS_ABORT_ON_FAILURE && bats_exec_suite_status > 0 )); then
334
+ break
335
+ fi
336
+ done
337
+ fi
338
+
339
+ set -eET
340
+ bats_run_teardown_suite
341
+
342
+ bats_exit_suite