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

506 lines, 308 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 b=rwx
43case $? in
44 1) echo error ;;
45 2) echo error ;;
46 *) echo status=$? ;;
47esac
48## STDOUT:
49error
50## END
51
52#### symbolic syntax error: start with -
53umask 0124
54umask -rwx
55if test $? -ne 0; then echo 'error'; fi
56umask | tail -c 4
57
58umask 0124
59umask -wx
60if test $? -ne 0; then echo 'error'; fi
61umask | tail -c 4
62
63umask 0124
64umask -=+
65if test $? -ne 0; then echo 'error'; fi
66umask | tail -c 4
67## status: 0
68## STDOUT:
69error
70124
71error
72124
73error
74124
75## END
76
77#### usage: invalid octal digits
78umask 089
79case $? in
80 1) echo error ;;
81 2) echo error ;;
82esac
83## STDOUT:
84error
85## END
86
87#### usage: large octal number
88umask 0022
89
90# osh and other shells treat truncate 0o1234567 as 0o0567
91umask 1234567
92echo status=$?
93
94umask
95
96## status: 0
97## STDOUT:
98status=0
990567
100## END
101## OK bash STDOUT:
102status=1
1030022
104## END
105
106#### 'umask' without args prints the umask
107umask | tail --bytes 4 # 0022 versus 022
108echo status=$?
109
110## STDOUT:
111022
112status=0
113## END
114
115#### 'umask -S' prints symbolic umask
116umask -S | grep 'u=[rwx]*,g=[rwx]*,o=[rwx]*'
117echo status=$?
118
119## STDOUT:
120u=rwx,g=rx,o=rx
121status=0
122## END
123
124#### 'umask -p' prints a form that can be eval'd
125umask -p
126echo status=$?
127
128## STDOUT:
129umask 0022
130status=0
131## END
132## N-I mksh/zsh STDOUT:
133status=1
134## END
135## N-I dash STDOUT:
136status=2
137## END
138
139#### 'umask 0002' sets the umask
140umask 0002
141echo one > $TMP/umask-one
142
143umask 0022
144echo two > $TMP/umask-two
145
146stat -c '%a' $TMP/umask-one $TMP/umask-two
147
148## status: 0
149## STDOUT:
150664
151644
152## END
153## stderr-json: ""
154
155#### set umask with symbolic mode: g-w,o-w
156
157umask 0002 # begin in a known state for the test
158# open()s 'umask-one' with mask 0666, then subtracts 0002 -> 0664
159echo one > $TMP/umask-one
160
161umask g-w,o-w
162echo two > $TMP/umask-two
163
164stat -c '%a' $TMP/umask-one $TMP/umask-two
165
166## status: 0
167## STDOUT:
168664
169644
170## END
171## stderr-json: ""
172
173#### set umask with symbolic mode: u-rw ... u=,g+,o- ...
174
175umask 0000
176umask u-rw
177echo status0=$?
178umask | tail -c 4
179
180umask 0700
181umask u=r
182echo status1=$?
183umask | tail -c 4
184
185umask 0000
186umask u=r,g=w,o=x
187echo status2=$?
188umask | tail -c 4
189
190umask 0777
191umask u+r,g+w,o+x
192echo status3=$?
193umask | tail -c 4
194
195umask 0000
196umask u-r,g-w,o-x
197echo status4=$?
198umask | tail -c 4
199
200umask 0137
201umask u=,g+,o-
202echo status5=$?
203umask | tail -c 4
204
205## status: 0
206## STDOUT:
207status0=0
208600
209status1=0
210300
211status2=0
212356
213status3=0
214356
215status4=0
216421
217status5=0
218737
219## END
220
221#### umask with too many arguments (i.e. extra spaces)
222umask 0111
223# spaces are an error in bash
224# dash & mksh only interpret the first one
225umask u=, g+, o-
226if test $? -ne 0; then
227 echo ok
228fi
229umask | tail -c 4
230## status: 0
231## STDOUT:
232ok
233111
234## END
235## BUG dash/mksh STDOUT:
236711
237## END
238
239#### umask allow overwriting and duplicates
240umask 0111
241umask u=rwx,u=rw,u=r,u=,g=rwx
242umask | tail -c 4
243## status: 0
244## STDOUT:
245701
246## END
247
248#### umask a is valid who
249umask 0732
250umask a=rwx
251umask | tail -c 4
252
253umask 0124
254umask a+r
255umask | tail -c 4
256
257umask 0124
258umask a-r
259umask | tail -c 4
260## status: 0
261## STDOUT:
262000
263120
264564
265## END
266
267#### umask X perm
268umask 0124
269umask a=X
270echo ret0 = $?
271umask | tail -c 4
272
273umask 0246
274umask a=X
275echo ret1 = $?
276umask | tail -c 4
277
278umask 0246
279umask a-X
280echo ret2 = $?
281umask | tail -c 4
282## status: 0
283## STDOUT:
284ret0 = 0
285666
286ret1 = 0
287777
288ret2 = 0
289246
290## END
291## BUG dash/mksh STDOUT:
292ret0 = 0
293666
294ret1 = 0
295666
296ret2 = 0
297357
298## END
299## N-I bash/zsh STDOUT:
300ret0 = 1
301124
302ret1 = 1
303246
304ret2 = 1
305246
306## END
307
308#### umask s perm
309umask 0124
310umask a-s
311echo ret0 = $?
312umask | tail -c 4
313
314umask 0124
315umask a+s
316echo ret1 = $?
317umask | tail -c 4
318
319umask 0124
320umask a=s
321echo ret2 = $?
322umask | tail -c 4
323## status: 0
324## STDOUT:
325ret0 = 0
326124
327ret1 = 0
328124
329ret2 = 0
330777
331## END
332## N-I bash/zsh STDOUT:
333ret0 = 1
334124
335ret1 = 1
336124
337ret2 = 1
338124
339## END
340
341#### umask t perm
342umask 0124
343umask a-t
344echo ret0 = $?
345umask | tail -c 4
346
347umask 0124
348umask a+t
349echo ret1 = $?
350umask | tail -c 4
351
352umask 0124
353umask a=t
354echo ret2 = $?
355umask | tail -c 4
356## status: 0
357## STDOUT:
358ret0 = 0
359124
360ret1 = 0
361124
362ret2 = 0
363777
364## END
365## N-I bash/zsh/mksh STDOUT:
366ret0 = 1
367124
368ret1 = 1
369124
370ret2 = 1
371124
372## END
373## N-I dash STDOUT:
374ret0 = 2
375124
376ret1 = 2
377124
378ret2 = 2
379124
380## END
381
382#### umask default who
383umask 0124
384umask =
385umask | tail -c 4
386
387umask 0124
388umask =rx
389echo ret = $?
390umask | tail -c 4
391
392umask 0124
393umask +
394umask | tail -c 4
395
396umask 0124
397# zsh ALSO treats this as just `umask`
398umask - >/dev/null
399umask | tail -c 4
400## status: 0
401## BUG zsh status: 1
402## STDOUT:
403777
404ret = 0
405222
406124
407124
408## END
409## BUG zsh STDOUT:
410777
411## END
412
413#### umask bare op
414umask 0124
415umask =+=
416umask | tail -c 4
417
418umask 0124
419umask +=
420umask | tail -c 4
421
422umask 0124
423umask =+rwx+rx
424umask | tail -c 4
425## status: 0
426## BUG zsh status: 1
427## STDOUT:
428777
429777
430000
431## END
432## N-I bash STDOUT:
433124
434124
435124
436## END
437## BUG zsh STDOUT:
438## END
439
440#### umask permcopy
441umask 0124
442umask a=u
443umask | tail -c 4
444
445umask 0365
446umask a=g
447umask | tail -c 4
448
449umask 0124
450umask a=o
451umask | tail -c 4
452## status: 0
453## STDOUT:
454111
455666
456444
457## END
458## N-I bash/zsh STDOUT:
459124
460365
461124
462## END
463
464#### umask permcopy running value
465umask 0124
466umask a=,a=u
467umask | tail -c 4
468
469umask 0124
470umask a=
471umask a=u
472umask | tail -c 4
473## status: 0
474## STDOUT:
475111
476777
477## END
478## N-I bash/zsh STDOUT:
479124
480777
481## END
482
483#### umask sequential actions
484umask 0124
485umask u+r+w+x
486umask | tail -c 4
487
488umask 0124
489umask a+r+w+x,o-w
490umask | tail -c 4
491
492umask 0124
493umask a+x+wr-r
494umask | tail -c 4
495## status: 0
496## STDOUT:
497024
498002
499444
500## END
501## N-I bash/zsh STDOUT:
502124
503124
504124
505## END
506