X-Git-Url: http://gitweb.michael.orlitzky.com/?p=apply-default-acl.git;a=blobdiff_plain;f=run-tests.sh;h=07ad496584faa680cde5992e2fde03dee698e628;hp=0ce549c84ca1e6a64a1a7cb9f1dd50d19d3b57e8;hb=450699ecf86f3bebab00ca162349270730026d7f;hpb=d89f22c28473cd2e201500af0f970478105c632a diff --git a/run-tests.sh b/run-tests.sh index 0ce549c..07ad496 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -1,14 +1,46 @@ #!/bin/bash +# +# Exit codes +# + +EXIT_SUCCESS=0 + +# Exit with this when a test fails. +EXIT_FAILURE=1 + +# We use a few system users in the tests. If these users aren't +# present, we exit with a different (non-EXIT_FAILURE). +EXIT_MISSING_USERS=2 + +# Define the users that we'll use in the tests below. We store the +# names as variables to avoid repeating them everywhere. +# +# WARNING: These must be in alphabetical order; otherwise the getfacl +# output will not match. +# +USERS=( bin daemon ) + +# Check to see if the above users exist. If not, bail. +for idx in $( seq 0 $((${#USERS[@]} - 1)) ); do + id "${USERS[idx]}" >/dev/null 2>&1 + + if [ $? -ne $EXIT_SUCCESS ]; then + echo "Error: missing test user ${USERS[idx]}." 1>&2 + exit $EXIT_MISSING_USERS + fi +done + # The program name. -BIN=./src/apply-default-acl +BIN=$(realpath src/apply-default-acl) # The directory where we'll do all the ACL manipulation. TESTDIR=test acl_reset() { # Remove any ACLs on our test directory and remove its contents. - setfacl --remove-all --recursive "$TESTDIR" + setfacl --remove-all --recursive "${TESTDIR}" + chmod 755 "${TESTDIR}" rm -rf "${TESTDIR}"/* } @@ -18,11 +50,15 @@ compare() { acl_reset else echo "Failure (#${TESTNUM})" - echo "Expected result:" + echo 'Expected result:' + echo '================' echo "${EXPECTED}" - echo "Actual result:" + echo '================' + echo 'Actual result:' + echo '================' echo "${ACTUAL}" - exit 1 + echo '================' + exit $EXIT_FAILURE fi } @@ -35,11 +71,11 @@ mkdir "${TESTDIR}" # permissions should all be propagated to the mode bits. TESTNUM=1 TARGET="${TESTDIR}"/foo +touch "${TARGET}" +chmod 777 "${TARGET}" setfacl -d -m user::r-- "${TESTDIR}" setfacl -d -m group::r-- "${TESTDIR}" setfacl -d -m other::r-- "${TESTDIR}" -touch "${TARGET}" -chmod 777 "${TARGET}" $BIN "${TARGET}" EXPECTED=$(cat <&1 ) +ACTUAL="${ACTUAL#*: }" +EXPECTED="test/nonexistent: No such file or directory" +compare + +# Same as the previous test, but with --recursive. +TESTNUM=26 +ACTUAL=$( "${BIN}" --recursive test/nonexistent 2>&1 ) +ACTUAL="${ACTUAL#*: }" +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 +DUMMY1="${TESTDIR}/dummy1" +DUMMY2="${TESTDIR}/dummy2" +touch "${DUMMY1}" "${DUMMY2}" +ACTUAL=$( "${BIN}" "${DUMMY1}" test/nonexistent "${DUMMY2}" 2>&1 ) +ACTUAL="${ACTUAL#*: }" +EXPECTED="test/nonexistent: No such file or directory" +compare + + +# Ensure that symlinks are not followed. +TESTNUM=28 +TARGET="${TESTDIR}/foo" +LINK2TARGET="${TESTDIR}/foo-sym" +touch "${TARGET}" +ln -s "${TARGET#${TESTDIR}/}" "${LINK2TARGET}" +setfacl --default --modify user:${USERS[0]}:rwx "${TESTDIR}" +"${BIN}" "${LINK2TARGET}" +ACTUAL=$( getfacl --omit-header "${TARGET}" ) +EXPECTED=$(cat < /dev/null +"${BIN}" bar +popd > /dev/null +ACTUAL=$( getfacl --omit-header "${TARGET}" ) +EXPECTED=$(cat </dev/null +ACTUAL="$?" +EXPECTED="1" +compare + + +# Test that one "failure" exit code overrides two "successes" +TESTNUM=37 +mkdir "${TESTDIR}/foo" +ln -s foo "${TESTDIR}/bar" +mkdir "${TESTDIR}/baz" +"${BIN}" "${TESTDIR}/foo" "${TESTDIR}/bar" "${TESTDIR}/baz" +ACTUAL="$?" +EXPECTED="1" +compare + -ACTUAL=`getfacl --omit-header "${TARGET}"/bar` +# And test the buggy behavior again; the previous test should return +# success (ignoring the failure) when --recursive is used. +TESTNUM=38 +mkdir "${TESTDIR}/foo" +ln -s foo "${TESTDIR}/bar" +mkdir "${TESTDIR}/baz" +"${BIN}" --recursive "${TESTDIR}" +ACTUAL="$?" +EXPECTED="0" compare