#!/bin/sh
# Verify that chmod works correctly with odd option combinations.

# Copyright (C) 2004, 2005, 2006 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

if test "$VERBOSE" = yes; then
  set -x
  chmod --version
fi

. $srcdir/../lang-default

pwd=`pwd`
t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0
trap '(exit $?); exit $?' 1 2 13 15

framework_failure=0
mkdir -p $tmp || framework_failure=1
cd $tmp || framework_failure=1

if test $framework_failure = 1; then
  echo "$0: failure in testing framework" 1>&2
  (exit 1); exit 1
fi

fail=0

# 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=1
    chmod $args 2>/dev/null && fail=1
    ;;
  ?*)
    touch -- $files || framework_failure=1
    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=1
      chmod $args 2>/dev/null && fail=1
    done
    ;;
  esac
done

if test $framework_failure = 1; then
  echo "$0: failure in testing framework" 1>&2
  fail=1
fi

(exit $fail); exit $fail
