#!/bin/sh
#
# Check that fault injection works properly.
#
# Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
# Copyright (c) 2016-2017 The strace developers.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
#    derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

. "${srcdir=.}/scno_tampering.sh"

#
# F
# F+
# F+S

N=100

check_fault_injection()
{
	local trace fault err first step procs extra
	trace=$1; shift
	fault=$1; shift
	err=$1; shift
	first=$1; shift
	step=$1; shift
	procs=$1; shift
	extra="$*"

	local when=
	if [ -z "$first$step" ]; then
		first=1
		step=1
	else
		case "$step" in
			'') when=":when=$first"; step=0 ;;
			+) when=":when=$first+"; step=1 ;;
			*) when=":when=$first+$step" ;;
		esac
	fi

	local error=
	local raw=reg
	set --
	case "$err" in
		'') ;;
		[123456789]*)
			error=":error=$err"
			raw=raw
			set -- -e raw=all
			;;
		*) error=":error=$err" ;;
	esac

	outexp="$NAME.out.exp"
	outgot="$NAME.out.got"
	outout="$NAME.out.out"
	outpid="$NAME.pid"

	run_strace -a11 -ff -e trace=$trace \
		"$@" -e fault=$fault$when$error $extra \
		../$NAME $raw "$err" "$first" "$step" $N \
		"$procs" "$outexp" "$outgot" "$outout" "$outpid"

	for i in $(seq 0 $((procs - 1)) )
	do
		pid=$(cat "$outpid.$i")

		match_diff "$outout.$i" "$LOG.$pid"
		match_diff "$outexp.$i" "$outgot.$i"
	done
}

for err in '' ENOSYS 22 einval; do
	for fault in writev desc,51; do
		check_fault_injection \
			writev $fault "$err" '' '' 1 -efault=chdir
		check_fault_injection \
			writev $fault "$err" '' '' 1 -efault=chdir -efault=none
		for F in 1 2 3 5 7 11; do
			check_fault_injection \
				writev $fault "$err" $F '' 1
			check_fault_injection \
				writev $fault "$err" $F + 1
			for S in 1 2 3 5 7 11; do
				check_fault_injection \
					writev $fault "$err" $F $S 1
				check_fault_injection \
					writev $fault "$err" $F $S 4
			done
		done
	done
done
