Home | History | Annotate | Download | only in tests
      1 #!/bin/sh
      2 #
      3 # Check that fault injection works properly.
      4 #
      5 # Copyright (c) 2016 Dmitry V. Levin <ldv (at] altlinux.org>
      6 # Copyright (c) 2016-2017 The strace developers.
      7 # All rights reserved.
      8 #
      9 # Redistribution and use in source and binary forms, with or without
     10 # modification, are permitted provided that the following conditions
     11 # are met:
     12 # 1. Redistributions of source code must retain the above copyright
     13 #    notice, this list of conditions and the following disclaimer.
     14 # 2. Redistributions in binary form must reproduce the above copyright
     15 #    notice, this list of conditions and the following disclaimer in the
     16 #    documentation and/or other materials provided with the distribution.
     17 # 3. The name of the author may not be used to endorse or promote products
     18 #    derived from this software without specific prior written permission.
     19 #
     20 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     21 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     22 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     23 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     24 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     25 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     29 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 . "${srcdir=.}/scno_tampering.sh"
     32 
     33 #
     34 # F
     35 # F+
     36 # F+S
     37 
     38 N=100
     39 
     40 check_fault_injection()
     41 {
     42 	local trace fault err first step procs extra
     43 	trace=$1; shift
     44 	fault=$1; shift
     45 	err=$1; shift
     46 	first=$1; shift
     47 	step=$1; shift
     48 	procs=$1; shift
     49 	extra="$*"
     50 
     51 	local when=
     52 	if [ -z "$first$step" ]; then
     53 		first=1
     54 		step=1
     55 	else
     56 		case "$step" in
     57 			'') when=":when=$first"; step=0 ;;
     58 			+) when=":when=$first+"; step=1 ;;
     59 			*) when=":when=$first+$step" ;;
     60 		esac
     61 	fi
     62 
     63 	local error=
     64 	local raw=reg
     65 	set --
     66 	case "$err" in
     67 		'') ;;
     68 		[123456789]*)
     69 			error=":error=$err"
     70 			raw=raw
     71 			set -- -e raw=all
     72 			;;
     73 		*) error=":error=$err" ;;
     74 	esac
     75 
     76 	outexp="$NAME.out.exp"
     77 	outgot="$NAME.out.got"
     78 	outout="$NAME.out.out"
     79 	outpid="$NAME.pid"
     80 
     81 	run_strace -a11 -ff -e trace=$trace \
     82 		"$@" -e fault=$fault$when$error $extra \
     83 		../$NAME $raw "$err" "$first" "$step" $N \
     84 		"$procs" "$outexp" "$outgot" "$outout" "$outpid"
     85 
     86 	for i in $(seq 0 $((procs - 1)) )
     87 	do
     88 		pid=$(cat "$outpid.$i")
     89 
     90 		match_diff "$outout.$i" "$LOG.$pid"
     91 		match_diff "$outexp.$i" "$outgot.$i"
     92 	done
     93 }
     94 
     95 for err in '' ENOSYS 22 einval; do
     96 	for fault in writev desc,51; do
     97 		check_fault_injection \
     98 			writev $fault "$err" '' '' 1 -efault=chdir
     99 		check_fault_injection \
    100 			writev $fault "$err" '' '' 1 -efault=chdir -efault=none
    101 		for F in 1 2 3 5 7 11; do
    102 			check_fault_injection \
    103 				writev $fault "$err" $F '' 1
    104 			check_fault_injection \
    105 				writev $fault "$err" $F + 1
    106 			for S in 1 2 3 5 7 11; do
    107 				check_fault_injection \
    108 					writev $fault "$err" $F $S 1
    109 				check_fault_injection \
    110 					writev $fault "$err" $F $S 4
    111 			done
    112 		done
    113 	done
    114 done
    115