#! /bin/bash
# FS QA Test No. 020
#
# extended attributes
#
#-----------------------------------------------------------------------
# Copyright (c) 2000-2002 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=dxm@sgi.com

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

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

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

_cleanup()
{
    _cleanup_testdir
}

_filter()
{
    sed "s#$testdir[^ :]*#<TESTFILE>#g; 
            s#$tmp[^ :]*#<TMPFILE>#g" $1
}

_attr()
{
    $ATTR_PROG $* 2>$tmp.err >$tmp.out
    exit=$?
    _filter $tmp.out
    _filter $tmp.err 1>&2
    return $exit
}

_getfattr()
{
    $GETFATTR_PROG $* 2>$tmp.err >$tmp.out
    exit=$?
    _filter $tmp.out
    _filter $tmp.err 1>&2
    return $exit
}

_attr_list()
{
    file=$1
    
    echo "   *** print attributes"
    if ! _getfattr -d -e text --absolute-names $file
    then
        echo "      !!! error return"
        return 1
    fi
}


# real QA test starts here
_supported_fs xfs udf
_supported_os Linux

_require_attrs

_setup_testdir

rm -f $seq.full

testfile=$testdir/attribute_$$

echo "*** list non-existant file"
_attr_list $testfile

echo "*** list empty file"
touch $testfile
_attr_list $testfile

echo "*** query non-existant attribute"
_attr -g "nonexistant" $testfile 2>&1

echo "*** one attribute"
echo "fish" | _attr -s fish $testfile
_attr_list $testfile

echo "*** replace attribute"
echo "fish3" | _attr -s fish $testfile
_attr_list $testfile

echo "*** add attribute"
echo "fish2" | _attr -s snrub $testfile
_attr_list $testfile

echo "*** remove attribute"
_attr -r fish $testfile
_attr_list $testfile

echo "*** add lots of attributes"
v=0
while [ $v -lt 1000 ]
do
    echo "value_$v" | attr -s "attribute_$v" $testfile >>$seq.full
    if [ $? -ne 0 ]
    then
        echo "!!! failed to add \"attribute_$v\""
        exit 1
    fi
    
    let "v = v + 1"
done

echo "*** check"
# don't print it all out...
getfattr --absolute-names $testfile \
    | tee -a $seq.full \
    | $AWK_PROG '
    	/^#/ { next }
	/^[ 	]*$/ { next }
        { l++ } 
	END {print "   *** " (l - 1) " attribute(s)" }'

echo "*** remove lots of attributes"
v=0
while [ $v -lt 1000 ]
do
    if ! $ATTR_PROG -r "attribute_$v" $testfile >>$seq.full
    then
        echo "!!! failed to remove \"attribute_$v\""
        exit 1
    fi
    
    let "v = v + 1"
done

_attr_list $testfile

echo "*** really long value"
dd if=/dev/zero bs=1024 count=100 2>/dev/null \
    | _attr -s "long_attr" $testfile >/dev/null
    
_attr -g "long_attr" $testfile | tail -n +2 | od -t x1
_attr -r "long_attr" $testfile >/dev/null


echo "*** set/get/remove really long names (expect failure)"
short="XXXXXXXXXX"
long="$short$short$short$short$short$short$short$short$short$short"
vlong="$long$long$long"

_attr -s $vlong -V fish $testfile 2>&1 >/dev/null
_attr -g $vlong $testfile 2>&1 >/dev/null
_attr -r $vlong $testfile 2>&1 >/dev/null

echo "*** check final"

_attr_list $testfile

echo "*** delete"
rm -f $testfile

exit
