diff tests/test-copy-acl.sh @ 10142:dc740b83408a

New ACL unit tests.
author Bruno Haible <bruno@clisp.org>
date Sun, 01 Jun 2008 22:51:13 +0200
parents
children 2f94bd2a861d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-copy-acl.sh	Sun Jun 01 22:51:13 2008 +0200
@@ -0,0 +1,485 @@
+#!/bin/sh
+
+# Show all commands when run with environment variable VERBOSE=yes.
+test -z "$VERBOSE" || set -x
+
+# func_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp             pathname of freshly created temporary directory
+func_tmpdir ()
+{
+  # Use the environment variable TMPDIR, falling back to /tmp. This allows
+  # users to specify a different temporary directory, for example, if their
+  # /tmp is filled up or too small.
+  : ${TMPDIR=/tmp}
+  {
+    # Use the mktemp program if available. If not available, hide the error
+    # message.
+    tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+    test -n "$tmp" && test -d "$tmp"
+  } ||
+  {
+    # Use a simple mkdir command. It is guaranteed to fail if the directory
+    # already exists.  $RANDOM is bash specific and expands to empty in shells
+    # other than bash, ksh and zsh.  Its use does not increase security;
+    # rather, it minimizes the probability of failure in a very cluttered /tmp
+    # directory.
+    tmp=$TMPDIR/gl$$-$RANDOM
+    (umask 077 && mkdir "$tmp")
+  } ||
+  {
+    echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+    exit 1
+  }
+}
+
+func_tmpdir
+builddir=`pwd`
+cd "$builddir" ||
+  {
+    echo "$0: cannot determine build directory (unreadable parent dir?)" >&2
+    exit 1
+  }
+# Switch to a temporary directory, to increase the likelihood that ACLs are
+# supported on the current file system. (/tmp is usually locally mounted,
+# whereas the build dir is sometimes NFS-mounted.)
+( cd "$tmp"
+
+  # Prepare tmpfile0.
+  rm -f tmpfile[0-9] tmpaclout[0-2]
+  echo "Simple contents" > tmpfile0
+  chmod 600 tmpfile0
+
+  # Classification of the platform according to the programs available for
+  # manipulating ACLs.
+  # Possible values are:
+  #   linux, cygwin, freebsd, solaris, hpux, osf1, aix, macosx, irix, none.
+  # TODO: Support also native Win32 platforms (mingw).
+  acl_flavor=none
+  if (getfacl tmpfile0 >/dev/null) 2>/dev/null; then
+    # Platforms with the getfacl and setfacl programs.
+    # Linux, FreeBSD, Solaris, Cygwin.
+    if (setfacl --help >/dev/null) 2>/dev/null; then
+      # Linux, Cygwin.
+      if (LC_ALL=C setfacl --help | grep ' --set-file' >/dev/null) 2>/dev/null; then
+        # Linux.
+        acl_flavor=linux
+      else
+        acl_flavor=cygwin
+      fi
+    else
+      # FreeBSD, Solaris.
+      if (LC_ALL=C setfacl 2>&1 | grep '\-x entries' >/dev/null) 2>/dev/null; then
+        # FreeBSD.
+        acl_flavor=freebsd
+      else
+        # Solaris.
+        acl_flavor=solaris
+      fi
+    fi
+  else
+    if (lsacl / >/dev/null) 2>/dev/null; then
+      # Platforms with the lsacl and chacl programs.
+      # HP-UX, sometimes also IRIX.
+      acl_flavor=hpux
+    else
+      if (getacl tmpfile0 >/dev/null) 2>/dev/null; then
+        # Tru64.
+        acl_flavor=osf1
+      else
+        if (aclget tmpfile0 >/dev/null) 2>/dev/null; then
+          # AIX.
+          acl_flavor=aix
+        else
+          if (fsaclctl -v >/dev/null) 2>/dev/null; then
+            # MacOS X.
+            acl_flavor=macosx
+          else
+            if test -f /sbin/chacl; then
+              # IRIX.
+              acl_flavor=irix
+            fi
+          fi
+        fi
+      fi
+    fi
+  fi
+
+  # Define a function to test for the same ACLs, from the point of view of
+  # the programs.
+  # func_test_same_acls file1 file2
+  case $acl_flavor in
+    linux | cygwin | freebsd | solaris)
+      func_test_same_acls ()
+      {
+        getfacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+        getfacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+        cmp tmpaclout1 tmpaclout2 > /dev/null
+      }
+      ;;
+    hpux)
+      func_test_same_acls ()
+      {
+        lsacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+        lsacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+        cmp tmpaclout1 tmpaclout2 > /dev/null
+      }
+      ;;
+    osf1)
+      func_test_same_acls ()
+      {
+        getacl "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+        getacl "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+        cmp tmpaclout1 tmpaclout2 > /dev/null
+      }
+      ;;
+    aix)
+      func_test_same_acls ()
+      {
+        aclget "$1" > tmpaclout1
+        aclget "$2" > tmpaclout2
+        cmp tmpaclout1 tmpaclout2 > /dev/null
+      }
+      ;;
+    macosx)
+      func_test_same_acls ()
+      {
+        /bin/ls -le "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+        /bin/ls -le "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+        cmp tmpaclout1 tmpaclout2 > /dev/null
+      }
+      ;;
+    irix)
+      func_test_same_acls ()
+      {
+        /bin/ls -lD "$1" | sed -e "s/$1/FILENAME/g" > tmpaclout1
+        /bin/ls -lD "$2" | sed -e "s/$2/FILENAME/g" > tmpaclout2
+        cmp tmpaclout1 tmpaclout2 > /dev/null
+      }
+      ;;
+    none)
+      func_test_same_acls ()
+      {
+        :
+      }
+      ;;
+  esac
+
+  # func_test_copy file1 file2
+  # copies file1 to file2 and verifies the permissions and ACLs are the same
+  # on both.
+  func_test_copy ()
+  {
+    echo "Simple contents" > "$2"
+    chmod 600 "$2"
+    "$builddir"/test-copy-acl${EXEEXT} "$1" "$2" || exit 1
+    "$builddir"/test-sameacls${EXEEXT} "$1" "$2" || exit 1
+    func_test_same_acls                "$1" "$2" || exit 1
+  }
+
+  func_test_copy tmpfile0 tmpfile1
+
+  if test $acl_flavor != none; then
+    # Use a user and group id different from the current one, to avoid
+    # redundant/ambiguous ACLs.
+    myuid=`id -u`
+    mygid=`id -g`
+    auid=1
+    if test "$auid" = "$myuid"; then auid=2; fi
+    agid=1
+    if test "$agid" = "$mygid"; then agid=2; fi
+
+    case $acl_flavor in
+      linux | cygwin | freebsd | solaris)
+
+        # Set an ACL for a user.
+        setfacl -m user:$auid:1 tmpfile0
+
+        func_test_copy tmpfile0 tmpfile2
+
+        # Set an ACL for a group.
+        setfacl -m group:$agid:4 tmpfile0
+
+        func_test_copy tmpfile0 tmpfile3
+
+        # Set an ACL for other.
+        case $acl_flavor in
+          freebsd) setfacl -m other::4 tmpfile0 ;;
+          solaris) chmod o+r tmpfile0 ;;
+          *)       setfacl -m other:4 tmpfile0 ;;
+        esac
+
+        func_test_copy tmpfile0 tmpfile4
+
+        # Remove the ACL for the user.
+        case $acl_flavor in
+          linux)   setfacl -x user:$auid tmpfile0 ;;
+          freebsd) setfacl -x user:$auid:1 tmpfile0 ;;
+          *)       setfacl -d user:$auid:1 tmpfile0 ;;
+        esac
+
+        func_test_copy tmpfile0 tmpfile5
+
+        # Remove the ACL for other.
+        case $acl_flavor in
+          linux | solaris) ;; # impossible
+          freebsd) setfacl -x other::4 tmpfile0 ;;
+          *)       setfacl -d other:4 tmpfile0 ;;
+        esac
+
+        func_test_copy tmpfile0 tmpfile6
+
+        # Remove the ACL for the group.
+        case $acl_flavor in
+          linux)   setfacl -x group:$agid tmpfile0 ;;
+          freebsd) setfacl -x group:$agid:4 tmpfile0 ;;
+          *)       setfacl -d group:$agid:4 tmpfile0 ;;
+        esac
+
+        func_test_copy tmpfile0 tmpfile7
+
+        # Delete all optional ACLs.
+        case $acl_flavor in
+          linux | freebsd)
+            setfacl -m user:$auid:1 tmpfile0
+            setfacl -b tmpfile0
+            ;;
+          *)
+            setfacl -s user::6,group::0,other:0 tmpfile0 ;;
+        esac
+
+        func_test_copy tmpfile0 tmpfile8
+
+        # Copy ACLs from a file that has no ACLs.
+        echo > tmpfile9
+        chmod a+x tmpfile9
+        case $acl_flavor in
+          linux)   getfacl tmpfile9 | setfacl --set-file=- tmpfile0 ;;
+          freebsd) ;;
+          *)       getfacl tmpfile9 | setfacl -f - tmpfile0 ;;
+        esac
+        rm -f tmpfile9
+
+        func_test_copy tmpfile0 tmpfile9
+
+        ;;
+
+      hpux)
+
+        # Set an ACL for a user.
+        orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+        chacl -r "${orig}($auid.%,--x)" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile2
+
+        # Set an ACL for a group.
+        orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+        chacl -r "${orig}(%.$agid,r--)" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile3
+
+        # Set an ACL for other.
+        orig=`lsacl tmpfile0 | sed -e 's/ tmpfile0$//'`
+        chacl -r "${orig}(%.%,r--)" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile4
+
+        # Remove the ACL for the user.
+        chacl -d "($auid.%,--x)" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile5
+
+        # Remove the ACL for the group.
+        chacl -d "(%.$agid,r--)" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile6
+
+        # Delete all optional ACLs.
+        chacl -z tmpfile0
+
+        func_test_copy tmpfile0 tmpfile8
+
+        # Copy ACLs from a file that has no ACLs.
+        echo > tmpfile9
+        chmod a+x tmpfile9
+        orig=`lsacl tmpfile9 | sed -e 's/ tmpfile9$//'`
+        rm -f tmpfile9
+        chacl -r "${orig}" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile9
+
+        ;;
+
+      osf1)
+
+        # Set an ACL for a user.
+        setacl -u user:$auid:1 tmpfile0
+
+        func_test_copy tmpfile0 tmpfile2
+
+        # Set an ACL for a group.
+        setacl -u group:$agid:4 tmpfile0
+
+        func_test_copy tmpfile0 tmpfile3
+
+        # Set an ACL for other.
+        setacl -u other::4 tmpfile0
+
+        func_test_copy tmpfile0 tmpfile4
+
+        # Remove the ACL for the user.
+        setacl -x user:$auid:1 tmpfile0
+
+        func_test_copy tmpfile0 tmpfile5
+
+        if false; then # would give an error "can't set ACL: Invalid argument"
+          # Remove the ACL for other.
+          setacl -x other::4 tmpfile0
+
+          func_test_copy tmpfile0 tmpfile6
+        fi
+
+        # Remove the ACL for the group.
+        setacl -x group:$agid:4 tmpfile0
+
+        func_test_copy tmpfile0 tmpfile7
+
+        # Delete all optional ACLs.
+        setacl -u user:$auid:1 tmpfile0
+        setacl -b tmpfile0
+
+        func_test_copy tmpfile0 tmpfile8
+
+        # Copy ACLs from a file that has no ACLs.
+        echo > tmpfile9
+        chmod a+x tmpfile9
+        getacl tmpfile9 > tmpaclout0
+        setacl -b -U tmpaclout0 tmpfile0
+        rm -f tmpfile9
+
+        func_test_copy tmpfile0 tmpfile9
+
+        ;;
+
+      aix)
+
+        # Set an ACL for a user.
+        { aclget tmpfile0 | sed -e 's/disabled$/enabled/'; echo "        permit --x u:$auid"; } | aclput tmpfile0
+
+        func_test_copy tmpfile0 tmpfile2
+
+        # Set an ACL for a group.
+        { aclget tmpfile0 | sed -e 's/disabled$/enabled/'; echo "        permit r-- g:$agid"; } | aclput tmpfile0
+
+        func_test_copy tmpfile0 tmpfile3
+
+        # Set an ACL for other.
+        chmod o+r tmpfile0
+
+        func_test_copy tmpfile0 tmpfile4
+
+        # Remove the ACL for the user.
+        aclget tmpfile0 | grep -v ' u:[^ ]*$' | aclput tmpfile0
+
+        func_test_copy tmpfile0 tmpfile5
+
+        # Remove the ACL for the group.
+        aclget tmpfile0 | grep -v ' g:[^ ]*$' | aclput tmpfile0
+
+        func_test_copy tmpfile0 tmpfile7
+
+        # Delete all optional ACLs.
+        aclget tmpfile0 | sed -e 's/enabled$/disabled/' | sed -e '/disabled$/q' | aclput tmpfile0
+
+        func_test_copy tmpfile0 tmpfile8
+
+        # Copy ACLs from a file that has no ACLs.
+        echo > tmpfile9
+        chmod a+x tmpfile9
+        aclget tmpfile9 | aclput tmpfile0
+        rm -f tmpfile9
+
+        func_test_copy tmpfile0 tmpfile9
+
+        ;;
+
+      macosx)
+
+        # Set an ACL for a user.
+        /bin/chmod +a "user:daemon allow execute" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile2
+
+        # Set an ACL for a group.
+        /bin/chmod +a "group:daemon allow read" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile3
+
+        # Set an ACL for other.
+        chmod o+r tmpfile0
+
+        func_test_copy tmpfile0 tmpfile4
+
+        # Remove the ACL for the user.
+        /bin/chmod -a "user:daemon allow execute" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile5
+
+        # Remove the ACL for the group.
+        /bin/chmod -a "group:daemon allow read" tmpfile0
+
+        func_test_copy tmpfile0 tmpfile7
+
+        # Delete all optional ACLs.
+        /bin/chmod -N tmpfile0
+
+        func_test_copy tmpfile0 tmpfile8
+
+        # Copy ACLs from a file that has no ACLs.
+        echo > tmpfile9
+        chmod a+x tmpfile9
+        { /bin/ls -le tmpfile9 | sed -n -e 's/^ [0-9][0-9]*: //p'; echo; } | /bin/chmod -E tmpfile0
+        rm -f tmpfile9
+
+        func_test_copy tmpfile0 tmpfile9
+
+        ;;
+
+      irix)
+
+        # Set an ACL for a user.
+        /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x tmpfile0
+
+        func_test_copy tmpfile0 tmpfile2
+
+        # Set an ACL for a group.
+        /sbin/chacl user::rw-,group::---,other::---,user:$auid:--x,group:$agid:r-- tmpfile0
+
+        func_test_copy tmpfile0 tmpfile3
+
+        # Set an ACL for other.
+        /sbin/chacl user::rw-,group::---,user:$auid:--x,group:$agid:r--,other::r-- tmpfile0
+
+        func_test_copy tmpfile0 tmpfile4
+
+        # Remove the ACL for the user.
+        /sbin/chacl user::rw-,group::---,group:$agid:r--,other::r-- tmpfile0
+
+        func_test_copy tmpfile0 tmpfile5
+
+        # Remove the ACL for the group.
+        /sbin/chacl user::rw-,group::---,other::r-- tmpfile0
+
+        func_test_copy tmpfile0 tmpfile7
+
+        ;;
+
+    esac
+  fi
+
+  rm -f tmpfile[0-9] tmpaclout[0-2]
+) || exit 1
+
+rm -rf "$tmp"
+exit 0