summaryrefslogtreecommitdiffstats
path: root/tests/chmod/usage.sh
blob: 686f945ffb7c0afe958bcc5963e49519329f7caf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/sh
# Verify that chmod works correctly with odd option combinations.

# Copyright (C) 2004-2018 Free Software Foundation, Inc.

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ chmod


# Each line in this list is a set of arguments, followed by :,
# followed by the set of files it will attempt to chmod,
# or empty if the usage is erroneous.
# Many of these test cases are due to Glenn Fowler.
# These test cases assume GNU behavior for "options" like -w.
cases='
  --         :
  -- --      :
  -- -- -- f : -- f
  -- -- -w f : -w f
  -- -- f    : f
  -- -w      :
  -- -w -- f : -- f
  -- -w -w f : -w f
  -- -w f    : f
  -- f       :
  -w         :
  -w --      :
  -w -- -- f : -- f
  -w -- -w f : -w f
  -w -- f    : f
  -w -w      :
  -w -w -- f : f
  -w -w -w f : f
  -w -w f    : f
  -w f       : f
  f          :
  f --       :
  f -w       : f
  f f        :
  u+gr f     :
  ug,+x f    :
'

all_files=$(echo "$cases" | sed 's/.*://'|sort -u)

old_IFS=$IFS
IFS='
'
for case in $cases; do
  IFS=$old_IFS
  args=$(expr "$case" : ' *\(.*[^ ]\) *:')
  files=$(expr "$case" : '.*: *\(.*\)')

  case $files in
  '')
    touch -- $all_files || framework_failure_
    returns_ 1 chmod $args 2>/dev/null || fail=1
    ;;
  ?*)
    touch -- $files || framework_failure_
    chmod $args || fail=1
    for file in $files; do
      # Test for misparsing args by creating all $files but $file.
      # chmod has a bug if it succeeds even though $file is absent.
      rm -f -- $all_files && touch -- $files && rm -- $file \
          || framework_failure_
      returns_ 1 chmod $args 2>/dev/null || fail=1
    done
    ;;
  esac
done

Exit $fail