summaryrefslogtreecommitdiff
path: root/020
blob: 56b9c3c3d9eda76b5760696e6b06ca04aacb081e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#! /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