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

505 lines, 305 significant
1## compare_shells: dash bash mksh zsh
2## oils_failures_allowed: 4
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#### usage: bad symbolic input
42umask b=rwx
43case $? in
44 1) echo error ;;
45 2) echo error ;;
46 *) echo status=$? ;;
47esac
48## STDOUT:
49error
50## END
51
52#### usage: invalid octal digits
53umask 089
54case $? in
55 1) echo error ;;
56 2) echo error ;;
57esac
58## STDOUT:
59error
60## END
61
62#### usage: large octal number
63umask 0022
64
65# osh and other shells treat truncate 0o1234567 as 0o0567
66umask 1234567
67echo status=$?
68
69umask
70
71## status: 0
72## STDOUT:
73status=1
740022
75## END
76## BUG mksh/zsh/dash STDOUT:
77status=0
780567
79## END
80
81#### 'umask' without args prints the umask
82umask | tail --bytes 4 # 0022 versus 022
83echo status=$?
84
85## STDOUT:
86022
87status=0
88## END
89
90#### 'umask -S' prints symbolic umask
91umask -S | grep 'u=[rwx]*,g=[rwx]*,o=[rwx]*'
92echo status=$?
93
94## STDOUT:
95u=rwx,g=rx,o=rx
96status=0
97## END
98
99#### 'umask -p' prints a form that can be eval'd
100umask -p
101echo status=$?
102
103## STDOUT:
104umask 0022
105status=0
106## END
107## N-I mksh/zsh STDOUT:
108status=1
109## END
110## N-I dash STDOUT:
111status=2
112## END
113
114#### 'umask 0002' sets the umask
115umask 0002
116echo one > $TMP/umask-one
117
118umask 0022
119echo two > $TMP/umask-two
120
121stat -c '%a' $TMP/umask-one $TMP/umask-two
122
123## status: 0
124## STDOUT:
125664
126644
127## END
128## stderr-json: ""
129
130#### set umask with symbolic mode: g-w,o-w
131
132umask 0002 # begin in a known state for the test
133# open()s 'umask-one' with mask 0666, then subtracts 0002 -> 0664
134echo one > $TMP/umask-one
135
136umask g-w,o-w
137echo two > $TMP/umask-two
138
139stat -c '%a' $TMP/umask-one $TMP/umask-two
140
141## status: 0
142## STDOUT:
143664
144644
145## END
146## stderr-json: ""
147
148#### set umask with symbolic mode: u-rw ... u=,g+,o- ...
149
150umask 0000
151umask u-rw
152echo status0=$?
153umask | tail -c 4
154
155umask 0700
156umask u=r
157echo status1=$?
158umask | tail -c 4
159
160umask 0000
161umask u=r,g=w,o=x
162echo status2=$?
163umask | tail -c 4
164
165umask 0777
166umask u+r,g+w,o+x
167echo status3=$?
168umask | tail -c 4
169
170umask 0000
171umask u-r,g-w,o-x
172echo status4=$?
173umask | tail -c 4
174
175umask 0137
176umask u=,g+,o-
177echo status5=$?
178umask | tail -c 4
179
180## status: 0
181## STDOUT:
182status0=0
183600
184status1=0
185300
186status2=0
187356
188status3=0
189356
190status4=0
191421
192status5=0
193737
194## END
195
196#### umask with too many arguments (i.e. extra spaces)
197umask 0111
198# spaces are an error in bash
199# dash & mksh only interpret the first one
200umask u=, g+, o-
201if test $? -ne 0; then
202 echo ok
203fi
204umask | tail -c 4
205## status: 0
206## STDOUT:
207ok
208111
209## END
210## BUG dash/mksh STDOUT:
211711
212## END
213
214#### umask allow overwriting and duplicates
215umask 0111
216umask u=rwx,u=rw,u=r,u=,g=rwx
217umask | tail -c 4
218## status: 0
219## STDOUT:
220701
221## END
222
223#### umask a is valid who
224umask 0732
225umask a=rwx
226umask | tail -c 4
227
228umask 0124
229umask a+r
230umask | tail -c 4
231
232umask 0124
233umask a-r
234umask | tail -c 4
235## status: 0
236## STDOUT:
237000
238120
239564
240## END
241
242#### umask X perm
243umask 0124
244umask a=X
245echo ret0 = $?
246umask | tail -c 4
247
248umask 0246
249umask a=X
250echo ret1 = $?
251umask | tail -c 4
252
253umask 0246
254umask a-X
255echo ret2 = $?
256umask | tail -c 4
257## status: 0
258## STDOUT:
259ret0 = 0
260666
261ret1 = 0
262777
263ret2 = 0
264246
265## END
266## BUG dash/mksh STDOUT:
267ret0 = 0
268666
269ret1 = 0
270666
271ret2 = 0
272357
273## END
274## N-I bash/zsh STDOUT:
275ret0 = 1
276124
277ret1 = 1
278246
279ret2 = 1
280246
281## END
282
283#### umask s perm
284umask 0124
285umask a-s
286echo ret0 = $?
287umask | tail -c 4
288
289umask 0124
290umask a+s
291echo ret1 = $?
292umask | tail -c 4
293
294umask 0124
295umask a=s
296echo ret2 = $?
297umask | tail -c 4
298## status: 0
299## STDOUT:
300ret0 = 0
301124
302ret1 = 0
303124
304ret2 = 0
305777
306## END
307## N-I bash/zsh STDOUT:
308ret0 = 1
309124
310ret1 = 1
311124
312ret2 = 1
313124
314## END
315
316#### umask t perm
317umask 0124
318umask a-t
319echo ret0 = $?
320umask | tail -c 4
321
322umask 0124
323umask a+t
324echo ret1 = $?
325umask | tail -c 4
326
327umask 0124
328umask a=t
329echo ret2 = $?
330umask | tail -c 4
331## status: 0
332## STDOUT:
333ret0 = 0
334124
335ret1 = 0
336124
337ret2 = 0
338777
339## END
340## N-I bash/zsh/mksh STDOUT:
341ret0 = 1
342124
343ret1 = 1
344124
345ret2 = 1
346124
347## END
348## N-I dash STDOUT:
349ret0 = 2
350124
351ret1 = 2
352124
353ret2 = 2
354124
355## END
356
357#### umask default who
358umask 0124
359umask =
360umask | tail -c 4
361
362umask 0124
363umask =rx
364echo ret = $?
365umask | tail -c 4
366
367umask 0124
368umask +
369umask | tail -c 4
370
371umask 0124
372# zsh ALSO treats this as just `umask`
373umask - >/dev/null
374umask | tail -c 4
375## status: 0
376## BUG zsh status: 1
377## STDOUT:
378777
379ret = 0
380222
381124
382124
383## END
384## BUG zsh STDOUT:
385777
386## END
387
388#### umask bare op
389umask 0124
390umask =+=
391umask | tail -c 4
392
393umask 0124
394umask +=
395umask | tail -c 4
396
397umask 0124
398umask =+rwx+rx
399umask | tail -c 4
400## status: 0
401## BUG zsh status: 1
402## STDOUT:
403777
404777
405000
406## END
407## N-I bash STDOUT:
408124
409124
410124
411## END
412## BUG zsh STDOUT:
413## END
414
415#### umask bare op -
416umask 0124
417umask -rwx
418umask | tail -c 4
419
420umask 0124
421umask -wx
422umask | tail -c 4
423
424umask 0124
425umask -=+
426umask | tail -c 4
427## status: 0
428## STDOUT:
429777
430337
431777
432## END
433## N-I dash/bash/mksh/zsh STDOUT:
434124
435124
436124
437## END
438
439#### umask permcopy
440umask 0124
441umask a=u
442umask | tail -c 4
443
444umask 0365
445umask a=g
446umask | tail -c 4
447
448umask 0124
449umask a=o
450umask | tail -c 4
451## status: 0
452## STDOUT:
453111
454666
455444
456## END
457## N-I bash/zsh STDOUT:
458124
459365
460124
461## END
462
463#### umask permcopy running value
464umask 0124
465umask a=,a=u
466umask | tail -c 4
467
468umask 0124
469umask a=
470umask a=u
471umask | tail -c 4
472## status: 0
473## STDOUT:
474111
475777
476## END
477## N-I bash/zsh STDOUT:
478124
479777
480## END
481
482#### umask sequential actions
483umask 0124
484umask u+r+w+x
485umask | tail -c 4
486
487umask 0124
488umask a+r+w+x,o-w
489umask | tail -c 4
490
491umask 0124
492umask a+x+wr-r
493umask | tail -c 4
494## status: 0
495## STDOUT:
496024
497002
498444
499## END
500## N-I bash/zsh STDOUT:
501124
502124
503124
504## END
505