selftest: Add test for quota query on directory with SGID
[samba.git] / source3 / script / tests / test_dfree_quota.sh
1 #!/bin/sh
2 #
3 # Blackbox test for disk-free, quota, and their interaction
4 #
5
6 if [ $# -lt 6 ]; then
7 cat <<EOF
8 Usage: test_dfree_quota.sh SERVER DOMAIN USERNAME PASSWORD LOCAL_PATH SMBCLIENT SMBCQUOTAS SMBCACLS
9 EOF
10 exit 1;
11 fi
12
13 SERVER=$1
14 DOMAIN=$2
15 USERNAME=$3
16 PASSWORD=$4
17 ENVDIR=`dirname $5`
18 WORKDIR=$5/dfree
19 smbclient=$6
20 smbcquotas=$7
21 smbcacls=$8
22 shift 8
23 failed=0
24
25 CONFFILE=$ENVDIR/lib/dfq.conf
26
27 incdir=`dirname $0`/../../../testprogs/blackbox
28 . $incdir/subunit.sh
29
30 sighup_smbd() {
31     kill -HUP -`cat $ENVDIR/pid/smbd.pid`
32 }
33
34 conf_lines() {
35     local uid
36     local gid
37     uid=$(id -u $USERNAME)
38     gid=$(id -g $USERNAME)
39     uid1=$(id -u user1)
40     uid2=$(id -u user2)
41 cat <<ABC
42 conf1:df:block size = 512:disk free = 10:disk size = 20
43 conf2:df:block size = 1024:disk free = 10:disk size = 20
44 conf3:df:block size = 4096:disk free = 750:disk size = 281474976710656
45 confq1:u$uid:block size = 4096:hard limit = 750:soft limit = 1000:cur blocks = 10
46 confdfq1:df:block size = 4096:disk free = 10:disk size = 20
47 confdfq1:u$uid:block size = 4096:hard limit = 750:soft limit = 1000:cur blocks = 10
48 confdfq2:df:block size = 4096:disk free = 10:disk size = 20
49 confdfq2:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
50 confdfq3:df:block size = 4096:disk free = 10:disk size = 80
51 confdfq3:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 0
52 confdfq4:df:block size = 4096:disk free = 10:disk size = 80
53 confdfq4:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
54 slimit:df:block size = 4096:disk free = 10:disk size = 80
55 slimit:u$uid:block size = 4096:hard limit = 44:soft limit = 40:cur blocks = 42
56 hlimit:df:block size = 4096:disk free = 10:disk size = 80
57 hlimit:u$uid:block size = 4096:hard limit = 44:soft limit = 0:cur blocks = 45
58 islimit:df:block size = 4096:disk free = 10:disk size = 80
59 islimit:u$uid:block size = 4096:hard limit = 44:soft limit = 40:cur blocks = 37:inode soft limit = 30:inode hard limit = 35:cur inodes = 32
60 ihlimit:df:block size = 4096:disk free = 10:disk size = 80
61 ihlimit:u$uid:block size = 4096:hard limit = 44:soft limit = 40:cur blocks = 37:inode soft limit = 0:inode hard limit = 35:cur inodes = 36
62 trygrp1:df:block size = 4096:disk free = 10:disk size = 80
63 trygrp1:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 41:err = 1
64 trygrp1:g$gid:block size = 4096:hard limit = 60:soft limit = 60:cur blocks = 55
65 trygrp2:df:block size = 4096:disk free = 10:disk size = 80
66 trygrp2:u$uid:block size = 4096:hard limit = 0:soft limit = 0:cur blocks = 41
67 trygrp2:g$gid:block size = 4096:hard limit = 60:soft limit = 60:cur blocks = 56
68 blksize:df:block size = 512:disk free = 614400:disk size = 614400
69 blksize:u$uid:block size = 1024:hard limit = 512000:soft limit = 0:cur blocks = 0
70 notenforce:df:block size = 4096:disk free = 10:disk size = 80
71 notenforce:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
72 notenforce:udflt:block size = 4096:qflags = 0
73 nfs:df:block size = 4096:disk free = 10:disk size = 80
74 nfs:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
75 nfs:udflt:nosys = 1
76 confdfqp:df:block size = 4096:disk free = 10:disk size = 80
77 confdfqp:u$uid1:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 36
78 confdfqp:u$uid2:block size = 4096:hard limit = 41:soft limit = 41:cur blocks = 36
79 sgid:stat:sgid = 98765
80 sgid:u$uid:block size = 4096:hard limit = 0:soft limit = 0:cur blocks = 80
81 sgid:g98765:block size = 4096:hard limit = 50:soft limit = 50:cur blocks = 40
82 ABC
83 }
84
85 setup_1_conf() {
86     conf_name="$1"
87     subdir="$2"
88     absdir=`readlink -f $WORKDIR/$subdir`
89     conf_lines | sed -rn "s/^$conf_name:(.*)/\1/p" | tr ":" "\n" | \
90     awk  -F '=' -v atdir=$absdir 'NF==1 {section=$1} NF==2 {sub(/\s*$/, "", $1); printf "\tfake_dfq:%s/%s/%s =%s\n", section, $1, atdir, $2}'
91 }
92
93 setup_conf() {
94     rm $CONFFILE
95     touch $CONFFILE
96
97     until [ -z "$1" ]
98     do
99         setup_1_conf $1 $2 >> $CONFFILE
100         shift
101         shift
102     done
103     sighup_smbd
104     #let it load...
105     sleep .5
106 }
107
108
109 test_smbclient_dfree() {
110         name="$1"
111     share="$2"
112     dir="$3"
113     confs="$4"
114     expected="$5"
115     shift
116     shift
117     shift
118     shift
119     subunit_start_test "$name"
120     setup_conf $confs
121     output=$($VALGRIND $smbclient //$SERVER/$share -c "cd $dir; l" $@ 2>&1)
122     status=$?
123     if [ "$status" = "0" ]; then
124                 received=$(echo "$output" | awk '/blocks of size/ {print $1, $5, $6}')
125                 if [ "$expected" = "$received" ]; then
126                         subunit_pass_test "$name"
127                 else
128                         echo "$output" | subunit_fail_test "$name"
129                 fi
130         else
131                 echo "$output" | subunit_fail_test "$name"
132         fi
133         return $status
134 }
135
136 # Issue two queries to different directories in one session to test
137 # caching effects
138 test_smbclient_dfree_2() {
139         name="$1"
140         share="$2"
141         dir1="$3"
142         dir2="$4"
143         confs="$5"
144         expected="$6"
145         subunit_start_test "$name"
146         setup_conf $confs
147         output=$($VALGRIND $smbclient //$SERVER/$share \
148                            -c "cd $dir1; du; cd ..; cd $dir2 ; du" $@ 2>&1)
149         status=$?
150         if [ "$status" = "0" ]; then
151                 received=$(echo "$output" | \
152                                    awk '/blocks of size/ {print $1, $5, $6}' | \
153                                    tr '\n' ' ')
154                 if [ "$expected" = "$received" ]; then
155                         subunit_pass_test "$name"
156                 else
157                         echo "$output" | subunit_fail_test "$name"
158                 fi
159         else
160                 echo "$output" | subunit_fail_test "$name"
161         fi
162         return $status
163 }
164
165 test_smbcquotas() {
166         name="$1"
167     conf="$2"
168     user="$3"
169     expected="$4"
170     proto="$5"
171         shift
172     shift
173     shift
174     shift
175     shift
176         subunit_start_test "$name"
177     setup_conf "$conf" "."
178     if [ "$proto"  = "smb2" ]; then
179         mproto="-m SMB2"
180     else
181         mproto="-m SMB1"
182     fi
183
184         output=$($VALGRIND $smbcquotas $mproto //$SERVER/dfq $@ 2>/dev/null | tr '\\' '/')
185         status=$?
186         if [ "$status" = "0" ]; then
187                 received=$(echo "$output" | awk "/$SERVER\\/$user/ {printf \"%s%s%s\", \$3, \$4, \$5}")
188                 if [ "$expected" = "$received" ]; then
189                         subunit_pass_test "$name"
190                 else
191                         echo "$output" | subunit_fail_test "$name"
192                 fi
193         else
194                 echo "$output" | subunit_fail_test "$name"
195         fi
196         return $status
197 }
198
199 #basic disk-free tests
200 test_smbclient_dfree "Test dfree share root SMB3 no quota" dfq "." "conf1 ." "10 1024. 5" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
201 test_smbclient_dfree "Test dfree subdir SMB3 no quota" dfq "subdir1" "conf1 . conf2 subdir1" "20 1024. 10" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
202 test_smbclient_dfree "Test dfree subdir NT1 no quota" dfq "subdir1" "conf1 . conf2 subdir1" "10 1024. 5" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=NT1 || failed=`expr $failed + 1`
203 test_smbclient_dfree "Test large disk" dfq "." "conf3 ." "1125899906842624 1024. 3000" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
204 #basic quota test (SMB1 only)
205 test_smbcquotas "Test user quota" confq1 $USERNAME "40960/4096000/3072000" "smb1" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=NT1 || failed=`expr $failed + 1`
206 #basic quota test (SMB2 only)
207 test_smbcquotas "Test user quota" confq1 $USERNAME "40960/4096000/3072000" "smb2" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB2 || failed=`expr $failed + 1`
208
209 # Test dfree cache through queries in two different directories
210 test_smbclient_dfree_2 "Test dfree cache" dfq_cache "." "subdir1" \
211                        "conf1 . conf2 subdir1" "10 1024. 5 20 1024. 10 " \
212                        -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 \
213         || failed=`expr $failed + 1`
214
215 #quota limit > disk size, remaining quota > disk free
216 test_smbclient_dfree "Test dfree share root df vs quota case 1" dfq "." "confdfq1 ." "80 1024. 40" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
217 #quota limit > disk size, remaining quota < disk free
218 test_smbclient_dfree "Test dfree share root df vs quota case 2" dfq "." "confdfq2 ." "80 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
219 #quota limit < disk size, remaining quota > disk free
220 test_smbclient_dfree "Test dfree share root df vs quota case 3" dfq "." "confdfq3 ." "160 1024. 40" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
221 #quota limit < disk size, remaining quota < disk free
222 test_smbclient_dfree "Test dfree share root df vs quota case 4" dfq "." "confdfq4 ." "160 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
223 test_smbclient_dfree "Test dfree subdir df vs quota case 4" dfq "subdir1" "confdfq4 subdir1" "160 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
224
225 #quota-->disk free special cases
226 test_smbclient_dfree "Test quota->dfree soft limit" dfq "subdir1" "slimit subdir1" "168 1024. 0" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
227 test_smbclient_dfree "Test quota->dfree hard limit" dfq "subdir1" "hlimit subdir1" "180 1024. 0" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
228 test_smbclient_dfree "Test quota->dfree inode soft limit" dfq "subdir1" "islimit subdir1" "148 1024. 0" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
229 test_smbclient_dfree "Test quota->dfree inode hard limit" dfq "subdir1" "ihlimit subdir1" "148 1024. 0" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
230 test_smbclient_dfree "Test quota->dfree err try group" dfq "subdir1" "trygrp1 subdir1" "240 1024. 20" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
231 test_smbclient_dfree "Test quota->dfree no-quota try group" dfq "subdir1" "trygrp2 subdir1" "240 1024. 16" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
232
233 # sgid on directory
234 test_smbclient_dfree "Test quota on sgid directory" dfq "subdir1" \
235                      "sgid subdir1" "200 1024. 40" -U$USERNAME%$PASSWORD \
236                      --option=clientmaxprotocol=SMB3 \
237         || failed=`expr $failed + 1`
238
239 #block size different in quota and df systems
240 test_smbclient_dfree "Test quota->dfree different block size" dfq "subdir1" "blksize subdir1" "307200 1024. 307200" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
241
242 #quota configured but not enforced
243 test_smbclient_dfree "Test dfree share root quota not enforced" dfq "." "notenforce ." "320 1024. 40" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
244
245 #FS quota not implemented (NFS case)
246 test_smbclient_dfree "Test dfree share root FS quota not implemented" dfq "." "nfs ." "160 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
247
248 #test for dfree when owner is inherited
249 #setup two folders with different owners
250 rm -rf $WORKDIR/subdir3/*
251 for d in / subdir3
252 do
253     $VALGRIND $smbcacls -U$USERNAME%$PASSWORD -D "ACL:$SERVER\user1:ALLOWED/0x0/FULL" //$SERVER/dfq $d > /dev/null 2>&1
254     $VALGRIND $smbcacls -U$USERNAME%$PASSWORD -a "ACL:$SERVER\user1:ALLOWED/0x0/FULL" //$SERVER/dfq $d || failed=`expr $failed + 1`
255     $VALGRIND $smbcacls -U$USERNAME%$PASSWORD -D "ACL:$SERVER\user2:ALLOWED/0x0/FULL" //$SERVER/dfq $d > /dev/null 2>&1
256     $VALGRIND $smbcacls -U$USERNAME%$PASSWORD -a "ACL:$SERVER\user2:ALLOWED/0x0/FULL" //$SERVER/dfq $d || failed=`expr $failed + 1`
257 done
258
259 $VALGRIND $smbclient //$SERVER/dfq -c "cd subdir3; mkdir user1" -Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 > /dev/null 2>&1 || failed=`expr $failed + 1`
260 $VALGRIND $smbclient //$SERVER/dfq -c "cd subdir3; mkdir user2" -Uuser2%$PASSWORD --option=clientmaxprotocol=SMB3 > /dev/null 2>&1 || failed=`expr $failed + 1`
261 #test quotas
262 test_smbclient_dfree "Test dfree without inherit owner - user1 at user1" \
263     dfq "subdir3/user1" "confdfqp subdir3/user1 confdfqp subdir3/user2" "160 1024. 16" \
264     -Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
265 test_smbclient_dfree "Test dfree without inherit owner - user1 at user2" \
266     dfq "subdir3/user2" "confdfqp subdir3/user1 confdfqp subdir3/user2" "160 1024. 16" \
267     -Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
268 test_smbclient_dfree "Test dfree with inherit owner - user1 at user1" \
269     dfq_owner "subdir3/user1" "confdfqp subdir3/user1 confdfqp subdir3/user2" "160 1024. 16" \
270     -Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
271 test_smbclient_dfree "Test dfree with inherit owner - user1 at user2" \
272     dfq_owner "subdir3/user2" "confdfqp subdir3/user1 confdfqp subdir3/user2" "164 1024. 20" \
273     -Uuser1%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
274
275 setup_conf
276 exit $failed