# The directory where we'll do all the ACL manipulation.
TESTDIR=test
+# Will auto-increment.
+TESTNUM=0
+
acl_reset() {
# Remove any ACLs on our test directory and remove its contents.
setfacl --remove-all --recursive "${TESTDIR}"
# When using a minimal ACL, the default user, group, and other
# permissions should all be propagated to the mode bits.
-TESTNUM=1
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 777 "${TARGET}"
compare
# Do the same thing as the last test, except with an extended ACL.
-TESTNUM=2
+((TESTNUM++))
setfacl -d -m user::r-- "${TESTDIR}"
setfacl -d -m group::r-- "${TESTDIR}"
setfacl -d -m other::r-- "${TESTDIR}"
# A file shared by a group, should still be group-writable
# afterwards.
-TESTNUM=3
+((TESTNUM++))
touch "${TARGET}"
chmod 644 "${TARGET}"
setfacl -d -m group:${USERS[0]}:rwx "${TESTDIR}"
# Same test as before except with a directory.
-TESTNUM=4
+((TESTNUM++))
setfacl -d -m group:${USERS[0]}:rwx "${TESTDIR}"
mkdir "${TARGET}"
chmod 755 "${TARGET}"
# With no default, things are left alone.
-TESTNUM=5
+((TESTNUM++))
touch "${TARGET}"
chmod 744 "${TARGET}"
$BIN "${TARGET}"
# Since the default ACL will grant r-x to group/other, they will wind
# up with it.
-TESTNUM=6
+((TESTNUM++))
touch "${TARGET}"
chmod 744 "${TARGET}"
setfacl -d -m user:${USERS[0]}:rwx "${TESTDIR}"
# Some named entries can be granted execute permissions as the result
# of reapplication.
-TESTNUM=7
+((TESTNUM++))
touch "${TARGET}"
chmod 744 "${TARGET}"
setfacl -m user:${USERS[1]}:rw "${TARGET}"
# We should not retain any entries that aren't in the default.
-TESTNUM=8
+((TESTNUM++))
touch "${TARGET}"
chmod 644 "${TARGET}"
setfacl -m user:${USERS[1]}:rw "${TARGET}"
# A slightly modified test #1 to make sure it works right.
-TESTNUM=9
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 777 "${TARGET}"
# If the default ACL mask denies execute, we should respect that
# regardless of the existing execute permissions.
-TESTNUM=10
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 777 "${TARGET}"
# The --recursive mode should work normally if the argument is a
# normal file. See Test #1.
-TESTNUM=11
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
setfacl -d -m user::r-- "${TESTDIR}"
setfacl -d -m group::r-- "${TESTDIR}"
# The --recursive mode should work recursively.
-TESTNUM=12
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
mkdir -p "${TARGET}"
touch "${TARGET}"/baz
# The --recursive mode should work recursively. This time
# check a directory, and pass the short command-line flag.
-TESTNUM=13
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
mkdir -p "${TARGET}"
touch "${TARGET}"/baz
# Test double application on a directory.
#
-TESTNUM=14
+((TESTNUM++))
TARGET="${TESTDIR}"/baz
mkdir "${TARGET}"
chmod 644 "${TARGET}"
# Same as previous test, with 755 initial perms.
#
-TESTNUM=15
+((TESTNUM++))
TARGET="${TESTDIR}"/baz
mkdir "${TARGET}"
chmod 755 "${TARGET}"
# Same as previous two tests, only with a file.
#
-TESTNUM=16
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 644 "${TARGET}"
# User-executable files should not wind up exec-masked.
-TESTNUM=17
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 700 "${TARGET}"
# Group-executable files should not wind up exec-masked.
-TESTNUM=18
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 670 "${TARGET}"
# Other-executable files should not wind up exec-masked.
-TESTNUM=19
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 607 "${TARGET}"
# Test #16's setup repeated with the --no-exec-mask flag.
#
-TESTNUM=20
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 644 "${TARGET}"
# Test #20 repeated recursively to make sure the flags play nice
# together.
-TESTNUM=21
+((TESTNUM++))
PARENT_DIR="${TESTDIR}"/foo
TARGET="${PARENT_DIR}"/bar
mkdir "${PARENT_DIR}"
# Make sure a mask with an execute bit doesn't count as being
# executable.
#
-TESTNUM=22
+((TESTNUM++))
TARGET="${TESTDIR}"/foo
touch "${TARGET}"
chmod 644 "${TARGET}"
# Same as test #2, except we pass multiple files on the command
# line and check the result of the first one.
-TESTNUM=23
+((TESTNUM++))
setfacl -d -m user::r-- "${TESTDIR}"
setfacl -d -m group::r-- "${TESTDIR}"
setfacl -d -m other::r-- "${TESTDIR}"
# Same as the previous test with the argument order switched.
-TESTNUM=24
+((TESTNUM++))
setfacl -d -m user::r-- "${TESTDIR}"
setfacl -d -m group::r-- "${TESTDIR}"
setfacl -d -m other::r-- "${TESTDIR}"
# If we call apply-default-acl on a single file that does not exist,
# we get the expected error.
-TESTNUM=25
+((TESTNUM++))
ACTUAL=$( "${BIN}" test/nonexistent 2>&1 )
EXPECTED="test/nonexistent: No such file or directory"
compare
# Same as the previous test, but with --recursive.
-TESTNUM=26
+((TESTNUM++))
ACTUAL=$( "${BIN}" --recursive test/nonexistent 2>&1 )
EXPECTED="test/nonexistent: No such file or directory"
compare
# If we call apply-default-acl on more than one file, it should report any
# that don't exist (but proceed to operate on the others).
-TESTNUM=27
+((TESTNUM++))
DUMMY1="${TESTDIR}/dummy1"
DUMMY2="${TESTDIR}/dummy2"
touch "${DUMMY1}" "${DUMMY2}"
# Ensure that symlinks are not followed.
-TESTNUM=28
+((TESTNUM++))
TARGET="${TESTDIR}/foo"
LINK2TARGET="${TESTDIR}/foo-sym"
touch "${TARGET}"
# Ensure that symlinks are not followed in subdirectories
# (recursively).
-TESTNUM=29
+((TESTNUM++))
TARGET="${TESTDIR}/bar"
touch "${TARGET}"
mkdir "${TESTDIR}/foo"
# Ensure that hard links are ignored.
-TESTNUM=30
+((TESTNUM++))
TARGET="${TESTDIR}/foo"
LINK2TARGET="${TESTDIR}/bar"
touch "${TARGET}"
# We should be able to run the tool with a relative path from within a
# directory that contains a symlink, so long as the relative path
# doesn't contain one.
-TESTNUM=31
+((TESTNUM++))
TARGET="${TESTDIR}/foo/bar"
LINK2TARGET="${TESTDIR}/baz"
mkdir -p $(dirname "${TARGET}")
# Ensure that symlinks in non-terminal path components are not followed.
-TESTNUM=32
+((TESTNUM++))
TARGET="${TESTDIR}/foo/bar/baz"
LINK2FOO="${TESTDIR}/quux"
mkdir -p $(dirname "${TARGET}")
# Test that our exit code succeeds on a single, normal path.
-TESTNUM=33
+((TESTNUM++))
TARGET="${TESTDIR}/foo"
touch "${TARGET}"
setfacl --default --modify user:${USERS[0]}:rw "${TESTDIR}"
# Test that our exit code fails on a symlink.
-TESTNUM=34
+((TESTNUM++))
TARGET="${TESTDIR}/bar"
touch "${TESTDIR}/foo"
ln -s foo "${TARGET}"
# The previous test should fail, even if we use --recursive.
-TESTNUM=35
+((TESTNUM++))
TARGET="${TESTDIR}/bar"
touch "${TESTDIR}/foo"
ln -s foo "${TARGET}"
# Test the return value for nonexistent paths.
-TESTNUM=36
+((TESTNUM++))
TARGET="${TESTDIR}/foo"
"${BIN}" "${TARGET}" &>/dev/null
ACTUAL="$?"
# Test that one "failure" exit code overrides two "successes"
# We need a default ACL on ${TESTDIR} because otherwise we do
# nothing, successfully, on the symlink path.
-TESTNUM=37
+((TESTNUM++))
mkdir "${TESTDIR}/foo"
ln -s foo "${TESTDIR}/bar"
mkdir "${TESTDIR}/baz"
# The failure should prevail when using --recursive, too.
-TESTNUM=38
+((TESTNUM++))
mkdir "${TESTDIR}/foo"
ln -s foo "${TESTDIR}/bar"
mkdir "${TESTDIR}/baz"
# We should get "Not a directory" if we stick a trailing slash on the
# end of the path to a file.
-TESTNUM=39
+((TESTNUM++))
TARGET="${TESTDIR}/foo"
touch "${TARGET}"
ACTUAL=$( "${BIN}" "${TARGET}/" 2>&1 )
# We should be a no-op on files contained in directories that have no
# default ACL.
-TESTNUM=40
+((TESTNUM++))
TARGET="${TESTDIR}/foo"
touch "${TARGET}"
setfacl --modify user:${USERS[0]}:rw "${TARGET}"
# We should be a no-op on directories contained in directories that
# have no default ACL (same as the previous test, but with a directory).
-TESTNUM=41
+((TESTNUM++))
TARGET="${TESTDIR}/foo"
mkdir "${TARGET}"
setfacl --modify user:${USERS[0]}:rw "${TARGET}"
# Make sure we descend into subdirectories that don't have default ACLs.
-TESTNUM=42
+((TESTNUM++))
TARGET="${TESTDIR}/foo/bar/baz"
mkdir -p $(dirname "${TARGET}")
touch "${TARGET}"
# Ensure that we don't get "error" results for symlinks encountered
# during a recursive traversal.
-TESTNUM=43
+((TESTNUM++))
TARGET="${TESTDIR}"
mkdir "${TARGET}/foo"
mkdir "${TARGET}/bar"