#!/bin/sh
#
# Check -e inject= syntax.
#
# Copyright (c) 2016-2018 Dmitry V. Levin <ldv@altlinux.org>
# 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=.}/init.sh"

#
# F
# F+
# F+S

fail_with()
{
	dump_log_and_fail_with \
		"strace -e inject=$* failed to handle an argument error properly"
}

for arg in 42 chdir \
	   chdir:42 \!chdir:42 \
	   chdir:42:when=7 \
	   chdir:invalid \
	   chdir:invalid:when=8 \
	   chdir:error= \
	   chdir:error=:when=10 \
	   chdir:error=invalid_error_name \
	   chdir:error=invalid_error_name:when=11 \
	   chdir:error=-1 \
	   chdir:error=-1:when=12 \
	   chdir:error=-2 \
	   chdir:error=-2:when=13 \
	   chdir:error=3+ \
	   chdir:error=3+:when=14 \
	   chdir:error=4096 \
	   chdir:error=4096:when=15 \
	   chdir:when=7:error=invalid_error_name \
	   chdir:when= \
	   chdir:when=:error=19 \
	   chdir:when=0 \
	   chdir:when=0:error=20 \
	   chdir:when=-1 \
	   chdir:when=-1:error=21 \
	   chdir:when=-2+ \
	   chdir:when=-2+:error=22 \
	   chdir:when=-3+0 \
	   chdir:when=-3+0:error=23 \
	   chdir:when=4- \
	   chdir:when=4-:error=24 \
	   chdir:when=5+- \
	   chdir:when=5+-:error=25 \
	   chdir:when=6++ \
	   chdir:when=6++:error=26 \
	   chdir:when=7+0 \
	   chdir:when=7+0:error=27 \
	   chdir:when=8+-1 \
	   chdir:when=8+-1:error=28 \
	   chdir:when=9+1+ \
	   chdir:when=9+1+:error=29 \
	   chdir:when=65536 \
	   chdir:when=65536:error=30 \
	   chdir:when=1+65536 \
	   chdir:when=1+65536:error=31 \
	   chdir:retval=-1 \
	   chdir:signal=0 \
	   chdir:signal=129 \
	   chdir:signal=1:signal=2 \
	   chdir:signal=1:retval=0:signal=2 \
	   chdir:retval=0:retval=1 \
	   chdir:error=1:error=2 \
	   chdir:retval=0:error=1 \
	   chdir:error=1:retval=0 \
	   chdir:retval=0:signal=1:error=1 \
	   ; do
	$STRACE -e inject="$arg" true 2> "$LOG" &&
		fail_with "$arg"
	LC_ALL=C grep -F 'invalid inject argument' < "$LOG" > /dev/null ||
		fail_with "$arg"
done

exit 0
