#! /bin/bash
# FS QA Test No. 074
#
# fstest
#
#-----------------------------------------------------------------------
# Copyright (c) 2000-2003 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
#-----------------------------------------------------------------------
#
# creator
owner=nathans@sgi.com

seq=`basename $0`
echo "QA output created by $seq"

here=`pwd`
tmp=/tmp/$$
status=0	# success is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15

_cleanup()
{
    cd /
    rm -rf $testdir/fstest.$$.* $tmp.*
    _cleanup_testdir
}

# get standard environment, filters and checks
. ./common.rc
. ./common.filter

_do_test()
{
    _n="$1"
    _param="$2"

    out=$testdir/fstest.$$.$_n
    rm -rf $out
    if ! mkdir $out
    then
        echo "    failed to mkdir $out"
        status=1
        exit
    fi

    _filter_param=`echo "$_param" | sed\
	-e 's/-n [0-9][0-9]*/-n children/' \
	-e 's/-l [0-9][0-9]*/-l loops/' \
	-e 's/-f [0-9][0-9]*/-f files/'`
    
    echo ""
    echo "-----------------------------------------------"
    echo "fstest.$_n : $_filter_param"
    echo "-----------------------------------------------"
    if ! $here/src/fstest $_param -p $out >>$seq.full
    then
        echo "    fstest ($_param) returned $? - see $seq.full"
        status=1
	exit
    fi

    _check_test_fs
}

_usage()
{
    echo "$0: [-f files] [-l loops] [-n children]"
}

_process_args()
{
    while getopts "f:l:n:?" c $@
    do
        case $c
        in
            f)
                numfiles=$OPTARG
		param_type="$param_type, overidde -f"
                ;;
            l)
                numloops=$OPTARG
		param_type="$param_type, overidde -l"
                ;;
            n)
                numchildren=$OPTARG
		param_type="$param_type, overidde -n"
                ;;
	    ?)
		_usage
		exit	
		;;
	esac
    done
}


# real QA test starts here
rm -f $here/$seq.full

_supported_fs generic
_supported_os IRIX Linux

#
# set params
# These params can take a while on different CPUs/OSs
# so we set them differently for different machines
#
if [ $HOSTOS == "IRIX" ]; then 
    if uname -R | grep -iq debug; then 
        # e.g. getting around 37secs for 1,1,1 on IP30 debug
	numchildren=2
	numloops=1
	numfiles=2
        param_type="IRIX debug"
    else
        # getting around 1 sec 1,1,1 - 10secs 1,10,1 on IP30 nondebug
	numloops=2
	numfiles=3
	numchildren=3
        param_type="IRIX nondebug"
    fi
elif [ $HOSTOS == "Linux" ]; then
    if uname -a | grep -q SMP; then
        numloops=10
        numfiles=5
        numchildren=3
        param_type="Linux SMP"
    else
        numloops=2
        numfiles=3
        numchildren=3
        param_type="Linux UP"
    fi
else
    numloops=1
    numfiles=1
    numchildren=1
    param_type="Default"
fi

# can override the params here
_process_args "$@"

echo "Params are for $param_type" >>$seq.full
echo "Params: n = $numchildren l = $numloops f = $numfiles" >>$seq.full

_setup_testdir

_check_test_fs

# Options:
# -F                    generate files with holes  (default=no)
# -n num_children       set number of child processes (default=1)
# -f num_files          set number of files (default=1)
# -s file_size          set file sizes (default=1MiB)
# -b block_size         set block (IO) size (default=1024)
# -l loops              set loop count (default=100)
# -m                    use mmap (default=no)
# -S                    use synchronous IO (default=no)
# -P                    preallocate space (default=no)

size10=`expr 10 \* 1024 \* 1024`	# 10 megabytes
size30=`expr 30 \* 1024 \* 1024`	# 30 megabytes

_do_test 0 "-l $numloops"

_do_test 1 "-l $numloops -s $size10 -b 8192 -m"

_do_test 2 "-n $numchildren -F -l $numloops -f $numfiles -s $size30 -b 512"

_do_test 3 "-n $numchildren -F -l $numloops -f $numfiles -s $size30 -b 512 -m"

_do_test 4 "-n $numchildren -F -l $numloops -f $numfiles -s $size10 -b 512 -mS"
