OILS / spec / builtin-umask.test.sh View on Github | oils.pub

528 lines, 322 significant
1## compare_shells: dash bash mksh zsh
2## oils_failures_allowed: 2
3
4#### usage: too many args
5
6# most shells don't verify this
7umask 1 2
8if test $? -ne 0; then
9 echo fail
10fi
11## STDOUT:
12fail
13## END
14## BUG dash/bash/mksh STDOUT:
15## END
16
17#### usage: empty input, space input
18umask ''
19case $? in
20 1) echo error ;;
21 2) echo error ;;
22 *) echo status=$? ;;
23esac
24
25umask ' '
26case $? in
27 1) echo error too ;;
28 2) echo error too ;;
29 *) echo status=$? ;;
30esac
31
32## STDOUT:
33error
34error too
35## END
36## BUG dash/mksh STDOUT:
37status=0
38error too
39## END
40
41#### symbolic syntax error: b=rwx
42umask 0124
43
44umask b=rwx
45case $? in
46 1) echo error ;;
47 2) echo error ;;
48 *) echo status=$? ;;
49esac
50
51umask # make sure it hasn't changed
52## STDOUT:
53error
540124
55## END
56
57#### symbolic syntax error: start with -
58umask 0124
59umask -rwx
60if test $? -ne 0; then echo 'error'; fi
61umask | tail -c 4
62
63umask 0124
64umask -wx
65if test $? -ne 0; then echo 'error'; fi
66umask | tail -c 4
67
68umask 0124
69umask -=+
70if test $? -ne 0; then echo 'error'; fi
71umask | tail -c 4
72## status: 0
73## STDOUT:
74error
75124
76error
77124
78error
79124
80## END
81
82#### symbolic syntax error: empty clause u-r,,u-r
83umask 0124
84umask 'u-r,u-r'
85echo status=$?
86umask
87
88# syntax error
89umask 'u+r,,u-r'
90if test $? -ne 0; then echo 'error'; fi
91umask
92## STDOUT:
93status=0
940524
95error
960524
97## END
98
99#### usage: invalid octal digits
100umask 089
101case $? in
102 1) echo error ;;
103 2) echo error ;;
104esac
105## STDOUT:
106error
107## END
108
109#### usage: large octal number
110umask 0022
111
112# osh and other shells treat truncate 0o1234567 as 0o0567
113umask 1234567
114echo status=$?
115
116umask
117
118## status: 0
119## STDOUT:
120status=0
1210567
122## END
123## OK bash STDOUT:
124status=1
1250022
126## END
127
128#### 'umask' without args prints the umask
129umask | tail --bytes 4 # 0022 versus 022
130echo status=$?
131
132## STDOUT:
133022
134status=0
135## END
136
137#### 'umask -S' prints symbolic umask
138umask -S | grep 'u=[rwx]*,g=[rwx]*,o=[rwx]*'
139echo status=$?
140
141## STDOUT:
142u=rwx,g=rx,o=rx
143status=0
144## END
145
146#### 'umask -p' prints a form that can be eval'd
147umask -p
148echo status=$?
149
150## STDOUT:
151umask 0022
152status=0
153## END
154## N-I mksh/zsh STDOUT:
155status=1
156## END
157## N-I dash STDOUT:
158status=2
159## END
160
161#### 'umask 0002' sets the umask
162umask 0002
163echo one > $TMP/umask-one
164
165umask 0022
166echo two > $TMP/umask-two
167
168stat -c '%a' $TMP/umask-one $TMP/umask-two
169
170## status: 0
171## STDOUT:
172664
173644
174## END
175## stderr-json: ""
176
177#### set umask with symbolic mode: g-w,o-w
178
179umask 0002 # begin in a known state for the test
180# open()s 'umask-one' with mask 0666, then subtracts 0002 -> 0664
181echo one > $TMP/umask-one
182
183umask g-w,o-w
184echo two > $TMP/umask-two
185
186stat -c '%a' $TMP/umask-one $TMP/umask-two
187
188## status: 0
189## STDOUT:
190664
191644
192## END
193## stderr-json: ""
194
195#### set umask with symbolic mode: u-rw ... u=,g+,o- ...
196
197umask 0000
198umask u-rw
199echo status0=$?
200umask | tail -c 4
201
202umask 0700
203umask u=r
204echo status1=$?
205umask | tail -c 4
206
207umask 0000
208umask u=r,g=w,o=x
209echo status2=$?
210umask | tail -c 4
211
212umask 0777
213umask u+r,g+w,o+x
214echo status3=$?
215umask | tail -c 4
216
217umask 0000
218umask u-r,g-w,o-x
219echo status4=$?
220umask | tail -c 4
221
222umask 0137
223umask u=,g+,o-
224echo status5=$?
225umask | tail -c 4
226
227## status: 0
228## STDOUT:
229status0=0
230600
231status1=0
232300
233status2=0
234356
235status3=0
236356
237status4=0
238421
239status5=0
240737
241## END
242
243#### umask with too many arguments (i.e. extra spaces)
244umask 0111
245# spaces are an error in bash
246# dash & mksh only interpret the first one
247umask u=, g+, o-
248if test $? -ne 0; then
249 echo ok
250fi
251umask | tail -c 4
252## status: 0
253## STDOUT:
254ok
255111
256## END
257## BUG dash/mksh STDOUT:
258711
259## END
260
261#### umask allow overwriting and duplicates
262umask 0111
263umask u=rwx,u=rw,u=r,u=,g=rwx
264umask | tail -c 4
265## status: 0
266## STDOUT:
267701
268## END
269
270#### umask a is valid who
271umask 0732
272umask a=rwx
273umask | tail -c 4
274
275umask 0124
276umask a+r
277umask | tail -c 4
278
279umask 0124
280umask a-r
281umask | tail -c 4
282## status: 0
283## STDOUT:
284000
285120
286564
287## END
288
289#### umask X perm
290umask 0124
291umask a=X
292echo ret0 = $?
293umask | tail -c 4
294
295umask 0246
296umask a=X
297echo ret1 = $?
298umask | tail -c 4
299
300umask 0246
301umask a-X
302echo ret2 = $?
303umask | tail -c 4
304## status: 0
305## STDOUT:
306ret0 = 0
307666
308ret1 = 0
309777
310ret2 = 0
311246
312## END
313## BUG dash/mksh STDOUT:
314ret0 = 0
315666
316ret1 = 0
317666
318ret2 = 0
319357
320## END
321## N-I bash/zsh STDOUT:
322ret0 = 1
323124
324ret1 = 1
325246
326ret2 = 1
327246
328## END
329
330#### umask s perm
331umask 0124
332umask a-s
333echo ret0 = $?
334umask | tail -c 4
335
336umask 0124
337umask a+s
338echo ret1 = $?
339umask | tail -c 4
340
341umask 0124
342umask a=s
343echo ret2 = $?
344umask | tail -c 4
345## status: 0
346## STDOUT:
347ret0 = 0
348124
349ret1 = 0
350124
351ret2 = 0
352777
353## END
354## N-I bash/zsh STDOUT:
355ret0 = 1
356124
357ret1 = 1
358124
359ret2 = 1
360124
361## END
362
363#### umask t perm
364umask 0124
365umask a-t
366echo ret0 = $?
367umask | tail -c 4
368
369umask 0124
370umask a+t
371echo ret1 = $?
372umask | tail -c 4
373
374umask 0124
375umask a=t
376echo ret2 = $?
377umask | tail -c 4
378## status: 0
379## STDOUT:
380ret0 = 0
381124
382ret1 = 0
383124
384ret2 = 0
385777
386## END
387## N-I bash/zsh/mksh STDOUT:
388ret0 = 1
389124
390ret1 = 1
391124
392ret2 = 1
393124
394## END
395## N-I dash STDOUT:
396ret0 = 2
397124
398ret1 = 2
399124
400ret2 = 2
401124
402## END
403
404#### umask default who
405umask 0124
406umask =
407umask | tail -c 4
408
409umask 0124
410umask =rx
411echo ret = $?
412umask | tail -c 4
413
414umask 0124
415umask +
416umask | tail -c 4
417
418umask 0124
419# zsh ALSO treats this as just `umask`
420umask - >/dev/null
421umask | tail -c 4
422## status: 0
423## BUG zsh status: 1
424## STDOUT:
425777
426ret = 0
427222
428124
429124
430## END
431## BUG zsh STDOUT:
432777
433## END
434
435#### umask bare op
436umask 0124
437umask =+=
438umask | tail -c 4
439
440umask 0124
441umask +=
442umask | tail -c 4
443
444umask 0124
445umask =+rwx+rx
446umask | tail -c 4
447## status: 0
448## BUG zsh status: 1
449## STDOUT:
450777
451777
452000
453## END
454## N-I bash STDOUT:
455124
456124
457124
458## END
459## BUG zsh STDOUT:
460## END
461
462#### umask permcopy
463umask 0124
464umask a=u
465umask | tail -c 4
466
467umask 0365
468umask a=g
469umask | tail -c 4
470
471umask 0124
472umask a=o
473umask | tail -c 4
474## status: 0
475## STDOUT:
476111
477666
478444
479## END
480## N-I bash/zsh STDOUT:
481124
482365
483124
484## END
485
486#### umask permcopy running value
487umask 0124
488umask a=,a=u
489umask | tail -c 4
490
491umask 0124
492umask a=
493umask a=u
494umask | tail -c 4
495## status: 0
496## STDOUT:
497111
498777
499## END
500## N-I bash/zsh STDOUT:
501124
502777
503## END
504
505#### umask sequential actions
506umask 0124
507umask u+r+w+x
508umask | tail -c 4
509
510umask 0124
511umask a+r+w+x,o-w
512umask | tail -c 4
513
514umask 0124
515umask a+x+wr-r
516umask | tail -c 4
517## status: 0
518## STDOUT:
519024
520002
521444
522## END
523## N-I bash/zsh STDOUT:
524124
525124
526124
527## END
528