1#!/bin/sh 2 3set -e 4 5# Strip leading spaces and trailing comment from $1. 6strip() { 7 echo "$1" | sed -e 's/^ *//' -e 's/ *#.*$//' 8} 9 10run_test() { 11 local _cause= _diff=$stdout 12 13 env $env "$1" -b "$PICK" -k $input -- $args <$stdin >$out 2>&1; e=$? 14 15 if [ -s "$stdout" ] && ! cmp -s "$stdout" "$out"; then 16 _cause="wrong output" 17 elif [ "${exit:-0}" -ne "$e" ]; then 18 _cause="want exit code ${exit}, got ${e}" 19 _diff="/dev/null" 20 fi 21 22 if [ -n "$_cause" ]; then 23 printf 'FAIL:\t%s\n' "$description" 1>&2 24 printf 'CAUSE:\t%s\n' "$_cause" 1>&2 25 diff -u -L stdout-want -L stdout-got "$_diff" "$out" 26 return 1 27 fi 28 29 return 0 30} 31 32usage() { 33 echo "usage: sh pick-test.sh -b binary file ..." 1>&2 34 exit 1 35} 36 37picktest="" 38 39while getopts "b:" opt; do 40 case "$opt" in 41 b) picktest="$OPTARG";; 42 *) usage;; 43 esac 44done 45shift $((OPTIND - 1)) 46{ [ $# -eq 0 ] || [ -z "$picktest" ]; } && usage 47 48nerr=0 49 50in=$(mktemp -t pick-test.XXXXXX) 51out=$(mktemp -t pick-test.XXXXXX) 52stdin=$(mktemp -t pick-test.XXXXXX) 53stdout=$(mktemp -t pick-test.XXXXXX) 54input=$(mktemp -t pick-test.XXXXXX) 55trap "rm -f $in $out $stdin $stdout $input" EXIT 56 57for f; do 58 (cat "$f"; echo) >$in 59 while IFS=: read -r key val; do 60 if [ -z "$key" ]; then 61 env="${defenv} ${env}" 62 run_test "$picktest" || nerr=$((nerr + 1)) 63 64 # Reset environment. 65 args= description= env= exit= keys= 66 >$out; >$stdin; >$stdout; >$input 67 elif [ "$key" = "keys" ]; then 68 printf "${val%%#*}" >$input 69 elif [ -n "$val" ]; then 70 eval "${key}='$(strip "$val")'" 71 else 72 case "$key" in 73 stdin) tmpfile=$stdin;; 74 stdout) tmpfile=$stdout;; 75 *) printf "${key}\n" >>$tmpfile;; 76 esac 77 fi 78 done <$in 79done 80 81exit $((nerr > 0)) 82