Merge of xfs-cmds-2.4.18:slinx:111140a by nathans.
[xfstests-dev.git] / 020
1 #! /bin/sh
2 # XFS QA Test No. 020
3 # $Id: 1.1 $
4 #
5 # extended attributes
6 #
7 #-----------------------------------------------------------------------
8 # Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
9
10 # This program is free software; you can redistribute it and/or modify it
11 # under the terms of version 2 of the GNU General Public License as
12 # published by the Free Software Foundation.
13
14 # This program is distributed in the hope that it would be useful, but
15 # WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
18 # Further, this software is distributed without any warranty that it is
19 # free of the rightful claim of any third person regarding infringement
20 # or the like.  Any license provided herein, whether implied or
21 # otherwise, applies only to this software file.  Patent licenses, if
22 # any, provided herein do not apply to combinations of this program with
23 # other software, or any other product whatsoever.
24
25 # You should have received a copy of the GNU General Public License along
26 # with this program; if not, write the Free Software Foundation, Inc., 59
27 # Temple Place - Suite 330, Boston MA 02111-1307, USA.
28
29 # Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
30 # Mountain View, CA  94043, or:
31
32 # http://www.sgi.com 
33
34 # For further information regarding this notice, see: 
35
36 # http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
37 #-----------------------------------------------------------------------
38 #
39 # creator
40 owner=dxm@sgi.com
41
42 seq=`basename $0`
43 echo "QA output created by $seq"
44
45 here=`pwd`
46 tmp=/tmp/$$
47 status=0        # success is the default!
48 trap "rm -f $tmp.* $testfile; exit \$status" 0 1 2 3 15
49
50 # get standard environment, filters and checks
51 . ./common.rc
52 . ./common.filter
53
54 _filter()
55 {
56     sed "s#$TEST_DIR[^ :]*#<TESTFILE>#g; 
57             s#$tmp[^ :]*#<TMPFILE>#g;
58             s#/proc[^ :]*#<PROCFILE>#g" $1
59 }
60
61 _attr()
62 {
63     attr $* 2>$tmp.err >$tmp.out
64     exit=$?
65     _filter $tmp.out
66     _filter $tmp.err 1>&2
67     return $exit
68 }
69
70 _getfattr()
71 {
72     getfattr $* 2>$tmp.err >$tmp.out
73     exit=$?
74     _filter $tmp.out
75     _filter $tmp.err 1>&2
76     return $exit
77 }
78
79 _attr_list()
80 {
81     file=$1
82     
83     echo "   *** print attributes"
84     if ! _getfattr -ad $file >$tmp.raw
85     then
86         echo "      !!! error return"
87         return 1
88     fi
89 }
90
91 [ -x /usr/bin/attr ] || _notrun "attr is not installed"
92 [ -x /usr/bin/getfattr ] || _notrun "getfattr is not installed"
93
94 # real QA test starts here
95
96 testfile=$TEST_DIR/attribute_$$
97
98 echo "*** list non-existant file"
99 _attr_list $testfile
100
101 echo "*** list non-xfs file (in /proc)"
102 _attr_list /proc/devices
103
104 echo "*** list empty file"
105 touch $testfile
106 _attr_list $testfile
107
108 echo "*** query non-existant attribute"
109 _attr -g "nonexistant" $testfile 2>&1
110
111 echo "*** one attribute"
112 echo "fish" | _attr -s fish $testfile
113 _attr_list $testfile
114
115 echo "*** replace attribute"
116 echo "fish3" | _attr -s fish $testfile
117 _attr_list $testfile
118
119 echo "*** add attribute"
120 echo "fish2" | _attr -s snrub $testfile
121 _attr_list $testfile
122
123 echo "*** remove attribute"
124 _attr -r fish $testfile
125 _attr_list $testfile
126
127 echo "*** add lots of attributes"
128 v=0
129 while [ $v -lt 1000 ]
130 do
131     echo "value_$v" | attr -s "attribute_$v" $testfile >/dev/null
132     if [ $? -ne 0 ]
133     then
134         echo "!!! failed to add \"attribute_$v\""
135         exit 1
136     fi
137     
138     let "v = v + 1"
139 done
140
141 echo "*** check"
142 # don't print it all out...
143 getfattr $testfile \
144     | $AWK_PROG '{ l++ } END {print "   *** " (l - 1) " attribute(s)" }'
145
146 echo "*** remove lots of attributes"
147 v=0
148 while [ $v -lt 1000 ]
149 do
150     if ! attr -r "attribute_$v" $testfile >/dev/null
151     then
152         echo "!!! failed to remove \"attribute_$v\""
153         exit 1
154     fi
155     
156     let "v = v + 1"
157 done
158
159 _attr_list $testfile
160
161 echo "*** really long value"
162 dd if=/dev/zero bs=1024 count=100 2>/dev/null \
163     | _attr -s "long_attr" $testfile >/dev/null
164     
165 _attr -g "long_attr" $testfile | tail -n +2 | od -t x1
166 _attr -r "long_attr" $testfile >/dev/null
167
168
169 echo "*** set/get/remove really long names (expect failure)"
170 short="XXXXXXXXXX"
171 long="$short$short$short$short$short$short$short$short$short$short"
172 vlong="$long$long$long"
173
174 _attr -s $vlong -V fish $testfile 2>&1 >/dev/null
175 _attr -g $vlong $testfile 2>&1 >/dev/null
176 _attr -r $vlong $testfile 2>&1 >/dev/null
177
178 echo "*** check final"
179
180 _attr_list $testfile
181
182 echo "*** delete"
183 rm -f $testfile
184
185 exit