1 #!/bin/sh 2 3 ME_="${0##*/}" 4 5 warn_() { printf >&2 '%s\n' "$*"; } 6 fail_() { warn_ "$ME_: failed test: $*"; exit 1; } 7 skip_() { warn_ "$ME_: skipped test: $*"; exit 77; } 8 framework_failure_() { warn_ "$ME_: framework failure: $*"; exit 99; } 9 framework_skip_() { warn_ "$ME_: framework skip: $*"; exit 77; } 10 11 check_prog() 12 { 13 type "$@" > /dev/null 2>&1 || 14 framework_skip_ "$* is not available" 15 } 16 17 dump_log_and_fail_with() 18 { 19 cat < "$LOG" 20 fail_ "$*" 21 } 22 23 run_prog() 24 { 25 if [ $# -eq 0 ]; then 26 set -- "./${ME_%.test}" 27 fi 28 args="$*" 29 "$@" || { 30 if [ $? -eq 77 ]; then 31 skip_ "$args exited with code 77" 32 else 33 fail_ "$args failed" 34 fi 35 } 36 } 37 38 39 run_prog_skip_if_failed() 40 { 41 args="$*" 42 "$@" || framework_skip_ "$args failed" 43 } 44 45 run_strace() 46 { 47 > "$LOG" || fail_ "failed to write $LOG" 48 args="$*" 49 $STRACE -o "$LOG" "$@" || 50 dump_log_and_fail_with "$STRACE $args failed" 51 } 52 53 run_strace_merge() 54 { 55 rm -f -- "$LOG".[0-9]* 56 run_strace -ff -tt "$@" 57 "$srcdir"/../strace-log-merge "$LOG" > "$LOG" || 58 dump_log_and_fail_with 'strace-log-merge failed' 59 rm -f -- "$LOG".[0-9]* 60 } 61 62 check_gawk() 63 { 64 check_prog gawk 65 check_prog grep 66 67 local program="$1"; shift 68 if grep '^@include[[:space:]]' < "$program" > /dev/null; then 69 gawk '@include "/dev/null"' < /dev/null || 70 framework_skip_ 'gawk does not support @include' 71 fi 72 } 73 74 # Usage: [FILE_TO_CHECK [AWK_PROGRAM [ERROR_MESSAGE [EXTRA_AWK_OPTIONS...]]]] 75 # Check whether all patterns listed in AWK_PROGRAM 76 # match FILE_TO_CHECK using egrep. 77 # If at least one of these patterns does not match, 78 # dump both files and fail with ERROR_MESSAGE. 79 match_awk() 80 { 81 local output program error 82 if [ $# -eq 0 ]; then 83 output="$LOG" 84 else 85 output="$1"; shift 86 fi 87 if [ $# -eq 0 ]; then 88 program="$srcdir/${ME_%.test}.awk" 89 else 90 program="$1"; shift 91 fi 92 if [ $# -eq 0 ]; then 93 error="$STRACE $args output mismatch" 94 else 95 error="$1"; shift 96 fi 97 98 check_gawk "$program" 99 100 AWKPATH="$srcdir" gawk -f "$program" "$@" < "$output" || { 101 cat < "$output" 102 fail_ "$error" 103 } 104 } 105 106 # Usage: [FILE_TO_CHECK [FILE_TO_COMPATE_WITH [ERROR_MESSAGE]]] 107 # Check whether FILE_TO_CHECK differs from FILE_TO_COMPATE_WITH. 108 # If it does, dump the difference and fail with ERROR_MESSAGE. 109 match_diff() 110 { 111 local output expected error 112 if [ $# -eq 0 ]; then 113 output="$LOG" 114 else 115 output="$1"; shift 116 fi 117 if [ $# -eq 0 ]; then 118 expected="$srcdir/${ME_%.test}.expected" 119 else 120 expected="$1"; shift 121 fi 122 if [ $# -eq 0 ]; then 123 error="$STRACE $args output mismatch" 124 else 125 error="$1"; shift 126 fi 127 128 check_prog diff 129 130 diff -- "$expected" "$output" || 131 fail_ "$error" 132 } 133 134 # Usage: [FILE_TO_CHECK [FILE_WITH_PATTERNS [ERROR_MESSAGE]]] 135 # Check whether all patterns listed in FILE_WITH_PATTERNS 136 # match FILE_TO_CHECK using egrep. 137 # If at least one of these patterns does not match, 138 # dump both files and fail with ERROR_MESSAGE. 139 match_grep() 140 { 141 local output patterns error expected matched 142 if [ $# -eq 0 ]; then 143 output="$LOG" 144 else 145 output="$1"; shift 146 fi 147 if [ $# -eq 0 ]; then 148 patterns="$srcdir/${ME_%.test}.expected" 149 else 150 patterns="$1"; shift 151 fi 152 if [ $# -eq 0 ]; then 153 error="$STRACE $args output mismatch" 154 else 155 error="$1"; shift 156 fi 157 158 check_prog wc 159 check_prog grep 160 161 expected=$(wc -l < "$patterns") && 162 matched=$(LC_ALL=C grep -c -E -x -f "$patterns" < "$output") && 163 test "$expected" -eq "$matched" || { 164 echo 'Patterns of expected output:' 165 cat < "$patterns" 166 echo 'Actual output:' 167 cat < "$output" 168 fail_ "$error" 169 } 170 } 171 172 check_prog cat 173 check_prog rm 174 175 LOG="$ME_.tmp" 176 rm -f "$LOG" 177 178 : "${STRACE:=../strace}" 179 : "${TIMEOUT_DURATION:=60}" 180 : "${SLEEP_A_BIT:=sleep 1}" 181