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

511 lines, 311 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#### usage: invalid octal digits
83umask 089
84case $? in
85 1) echo error ;;
86 2) echo error ;;
87esac
88## STDOUT:
89error
90## END
91
92#### usage: large octal number
93umask 0022
94
95# osh and other shells treat truncate 0o1234567 as 0o0567
96umask 1234567
97echo status=$?
98
99umask
100
101## status: 0
102## STDOUT:
103status=0
1040567
105## END
106## OK bash STDOUT:
107status=1
1080022
109## END
110
111#### 'umask' without args prints the umask
112umask | tail --bytes 4 # 0022 versus 022
113echo status=$?
114
115## STDOUT:
116022
117status=0
118## END
119
120#### 'umask -S' prints symbolic umask
121umask -S | grep 'u=[rwx]*,g=[rwx]*,o=[rwx]*'
122echo status=$?
123
124## STDOUT:
125u=rwx,g=rx,o=rx
126status=0
127## END
128
129#### 'umask -p' prints a form that can be eval'd
130umask -p
131echo status=$?
132
133## STDOUT:
134umask 0022
135status=0
136## END
137## N-I mksh/zsh STDOUT:
138status=1
139## END
140## N-I dash STDOUT:
141status=2
142## END
143
144#### 'umask 0002' sets the umask
145umask 0002
146echo one > $TMP/umask-one
147
148umask 0022
149echo two > $TMP/umask-two
150
151stat -c '%a' $TMP/umask-one $TMP/umask-two
152
153## status: 0
154## STDOUT:
155664
156644
157## END
158## stderr-json: ""
159
160#### set umask with symbolic mode: g-w,o-w
161
162umask 0002 # begin in a known state for the test
163# open()s 'umask-one' with mask 0666, then subtracts 0002 -> 0664
164echo one > $TMP/umask-one
165
166umask g-w,o-w
167echo two > $TMP/umask-two
168
169stat -c '%a' $TMP/umask-one $TMP/umask-two
170
171## status: 0
172## STDOUT:
173664
174644
175## END
176## stderr-json: ""
177
178#### set umask with symbolic mode: u-rw ... u=,g+,o- ...
179
180umask 0000
181umask u-rw
182echo status0=$?
183umask | tail -c 4
184
185umask 0700
186umask u=r
187echo status1=$?
188umask | tail -c 4
189
190umask 0000
191umask u=r,g=w,o=x
192echo status2=$?
193umask | tail -c 4
194
195umask 0777
196umask u+r,g+w,o+x
197echo status3=$?
198umask | tail -c 4
199
200umask 0000
201umask u-r,g-w,o-x
202echo status4=$?
203umask | tail -c 4
204
205umask 0137
206umask u=,g+,o-
207echo status5=$?
208umask | tail -c 4
209
210## status: 0
211## STDOUT:
212status0=0
213600
214status1=0
215300
216status2=0
217356
218status3=0
219356
220status4=0
221421
222status5=0
223737
224## END
225
226#### umask with too many arguments (i.e. extra spaces)
227umask 0111
228# spaces are an error in bash
229# dash & mksh only interpret the first one
230umask u=, g+, o-
231if test $? -ne 0; then
232 echo ok
233fi
234umask | tail -c 4
235## status: 0
236## STDOUT:
237ok
238111
239## END
240## BUG dash/mksh STDOUT:
241711
242## END
243
244#### umask allow overwriting and duplicates
245umask 0111
246umask u=rwx,u=rw,u=r,u=,g=rwx
247umask | tail -c 4
248## status: 0
249## STDOUT:
250701
251## END
252
253#### umask a is valid who
254umask 0732
255umask a=rwx
256umask | tail -c 4
257
258umask 0124
259umask a+r
260umask | tail -c 4
261
262umask 0124
263umask a-r
264umask | tail -c 4
265## status: 0
266## STDOUT:
267000
268120
269564
270## END
271
272#### umask X perm
273umask 0124
274umask a=X
275echo ret0 = $?
276umask | tail -c 4
277
278umask 0246
279umask a=X
280echo ret1 = $?
281umask | tail -c 4
282
283umask 0246
284umask a-X
285echo ret2 = $?
286umask | tail -c 4
287## status: 0
288## STDOUT:
289ret0 = 0
290666
291ret1 = 0
292777
293ret2 = 0
294246
295## END
296## BUG dash/mksh STDOUT:
297ret0 = 0
298666
299ret1 = 0
300666
301ret2 = 0
302357
303## END
304## N-I bash/zsh STDOUT:
305ret0 = 1
306124
307ret1 = 1
308246
309ret2 = 1
310246
311## END
312
313#### umask s perm
314umask 0124
315umask a-s
316echo ret0 = $?
317umask | tail -c 4
318
319umask 0124
320umask a+s
321echo ret1 = $?
322umask | tail -c 4
323
324umask 0124
325umask a=s
326echo ret2 = $?
327umask | tail -c 4
328## status: 0
329## STDOUT:
330ret0 = 0
331124
332ret1 = 0
333124
334ret2 = 0
335777
336## END
337## N-I bash/zsh STDOUT:
338ret0 = 1
339124
340ret1 = 1
341124
342ret2 = 1
343124
344## END
345
346#### umask t perm
347umask 0124
348umask a-t
349echo ret0 = $?
350umask | tail -c 4
351
352umask 0124
353umask a+t
354echo ret1 = $?
355umask | tail -c 4
356
357umask 0124
358umask a=t
359echo ret2 = $?
360umask | tail -c 4
361## status: 0
362## STDOUT:
363ret0 = 0
364124
365ret1 = 0
366124
367ret2 = 0
368777
369## END
370## N-I bash/zsh/mksh STDOUT:
371ret0 = 1
372124
373ret1 = 1
374124
375ret2 = 1
376124
377## END
378## N-I dash STDOUT:
379ret0 = 2
380124
381ret1 = 2
382124
383ret2 = 2
384124
385## END
386
387#### umask default who
388umask 0124
389umask =
390umask | tail -c 4
391
392umask 0124
393umask =rx
394echo ret = $?
395umask | tail -c 4
396
397umask 0124
398umask +
399umask | tail -c 4
400
401umask 0124
402# zsh ALSO treats this as just `umask`
403umask - >/dev/null
404umask | tail -c 4
405## status: 0
406## BUG zsh status: 1
407## STDOUT:
408777
409ret = 0
410222
411124
412124
413## END
414## BUG zsh STDOUT:
415777
416## END
417
418#### umask bare op
419umask 0124
420umask =+=
421umask | tail -c 4
422
423umask 0124
424umask +=
425umask | tail -c 4
426
427umask 0124
428umask =+rwx+rx
429umask | tail -c 4
430## status: 0
431## BUG zsh status: 1
432## STDOUT:
433777
434777
435000
436## END
437## N-I bash STDOUT:
438124
439124
440124
441## END
442## BUG zsh STDOUT:
443## END
444
445#### umask permcopy
446umask 0124
447umask a=u
448umask | tail -c 4
449
450umask 0365
451umask a=g
452umask | tail -c 4
453
454umask 0124
455umask a=o
456umask | tail -c 4
457## status: 0
458## STDOUT:
459111
460666
461444
462## END
463## N-I bash/zsh STDOUT:
464124
465365
466124
467## END
468
469#### umask permcopy running value
470umask 0124
471umask a=,a=u
472umask | tail -c 4
473
474umask 0124
475umask a=
476umask a=u
477umask | tail -c 4
478## status: 0
479## STDOUT:
480111
481777
482## END
483## N-I bash/zsh STDOUT:
484124
485777
486## END
487
488#### umask sequential actions
489umask 0124
490umask u+r+w+x
491umask | tail -c 4
492
493umask 0124
494umask a+r+w+x,o-w
495umask | tail -c 4
496
497umask 0124
498umask a+x+wr-r
499umask | tail -c 4
500## status: 0
501## STDOUT:
502024
503002
504444
505## END
506## N-I bash/zsh STDOUT:
507124
508124
509124
510## END
511