#!/bin/sh end="\033[0m" red="\033[0;31m" green="\033[0;32m" yellow="\033[0;33m" N= OUT= ERR= STATUS= ERROR() { # shellcheck disable=2059 printf "${red}ERROR${end}" } print_debug_info() { # shellcheck disable=2016 printf 'LINENO: %s\n$OUT: %s\n$ERR: %s\n' \ "$N" "$OUT" "$ERR" >&2 } assert_status() { if [ "$STATUS" != "$1" ]; then printf '\n%s: Bad status.\n\nexpected: %s\ngot: %s\n' \ "$(ERROR)" "$1" "$STATUS" >&2 print_debug_info exit 1 fi } assert_usage() { if ! grep -Fq 'Usage' "$1"; then echo 'Expected to find "Usage" text, it was missing:' >&2 cat "$1" >&2 print_debug_info exit 1 fi } assert_empty_stream() { if [ -s "$2" ]; then FMT='\n%s: Expected %s (%s) to be empty, but has content:\n%s\n' # shellcheck disable=2059 printf "$FMT" \ "$(ERROR)" "$1" "$2" "$(cat "$2")" >&2 print_debug_info exit 1 fi } assert_empty_stdout() { assert_empty_stream STDOUT "$OUT" } assert_empty_stderr() { assert_empty_stream STDERR "$ERR" } assert_stream() { if [ "$(cat "$2")" != "$3" ]; then printf '\n%s: Bad %s (%s)\n\nexpected: %s\ngot: %s\n' \ "$(ERROR)" "$1" "$2" "$3" "$(cat "$2")" >&2 print_debug_info exit 1 fi } assert_stdout() { assert_stream STDOUT "$OUT" "$1" } assert_stderr() { assert_stream STDERR "$ERR" "$1" } assert_grep_stream() { if ! grep -qE "$3" "$2"; then printf '\n%s: Bad %s (%s)\n\ngrepping: %s\nin:\n%s\n' \ "$(ERROR)" "$1" "$2" "$3" "$(cat "$2")" >&2 print_debug_info exit 1 fi } assert_grep_stdout() { assert_grep_stream STDOUT "$OUT" "$1" } assert_grep_stderr() { assert_grep_stream STDERR "$ERR" "$1" } assert_fgrep_stream() { if ! grep -Fq -- "$3" "$2"; then printf '\n%s: Bad %s (%s)\n\ngrepping: %s\nin:\n%s\n' \ "$(ERROR)" "$1" "$2" "$3" "$(cat "$2")" >&2 print_debug_info exit 1 fi } assert_fgrep_stdout() { assert_fgrep_stream STDOUT "$OUT" "$1" } assert_fgrep_stderr() { assert_fgrep_stream STDERR "$ERR" "$1" } testing() { printf "${yellow}testing${end}: %s..." "$1" >&2 } test_ok() { # shellcheck disable=2059 printf " ${green}OK${end}.\n" >&2 } uuid() { od -xN20 /dev/urandom | head -n1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}' } tmpname() { printf '%s/uuid-tmpname with spaces.%s' "${TMPDIR:-/tmp}" "$(uuid)" } mkstemp() { name="$(tmpname)" touch -- "$name" printf '%s' "$name" } mkdtemp() { name="$(tmpname)" mkdir -- "$name" printf '%s' "$name" }