Home | History | Annotate | Download | only in tests
      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