Imported Upstream version 3.3.2
[debian/amanda] / packaging / common / test_sh_libs.sh
index 85711f1d30af669dd0e0b66ca971120f31d77bb8..22c4fb6cf87351bc12d0ed0e58b42917419a29af 100755 (executable)
@@ -23,9 +23,11 @@ SHUNIT_INC="${srcdir=`pwd`}/packaging/common"; export SHUNIT_INC
 TMPDIR=`pwd`/shunit-test; export TMPDIR
 amanda_user=test_amandabackup; export amanda_user
 amanda_group=test_disk; export amanda_group
+sup_group="test_tape"; export sup_group
 AMANDAHOMEDIR=$TMPDIR/amanda; export AMANDAHOMEDIR
 AMANDATES=$AMANDAHOMEDIR/amandates; export AMANDATES
 os=`uname`; export os
+wanted_shell='/bin/false'; export wanted_shell
 dist=Fedora; export dist
 SYSCONFDIR=$TMPDIR/etc; export SYSCONFDIR
 SBINDIR=$TMPDIR/sbin; export SBINDIR
@@ -34,7 +36,7 @@ deb_uid=63000; export deb_uid
 
 
 # Append stuff to this when you make temp files if they are outside TMPDIR
-test_cleanup_files="$TMPDIR"; export sh_cleanup_files
+test_cleanup_files="$TMPDIR"; export test_cleanup_files
 
 # This can't be part of one-time setup, because TMPDIR must exist before
 # shunit2 is sourced.
@@ -63,6 +65,8 @@ oneTimeSetUp() {
         grep "${amanda_user}" ${SYSCONFDIR}/passwd &> /dev/null || { \
             echo "$msg_prefix ${amanda_user} still exists, or no ${SYSCONFDIR}/passwd.";
             exit 1; }
+        groupdel ${amanda_group} || exit 1
+        groupdel ${sup_group} || exit 1
     else
        echo "Not root, cleanup skipped"
     fi
@@ -84,7 +88,7 @@ oneTimeTearDown() {
 
 test_cleanup_files="$LOGFILE ${test_cleanup_files}"
 
-# errors before the tests are run.
+# shows syntax errors before the tests are run.
 . ${SHUNIT_INC}/common_functions.sh
 . ${SHUNIT_INC}/pre_inst_functions.sh
 . ${SHUNIT_INC}/post_inst_functions.sh
@@ -99,8 +103,6 @@ if [ "$tester_id" = "0" ]; then
 else
     IAmRoot=
 fi
-# A list of flag files that must be present to avoid spurious output.
-# Each mock util gets one whether it is used or not.
 
 # CAUTION: using real values if we are root.
 if [ "$IAmRoot" ]; then
@@ -111,6 +113,7 @@ fi
 
 # Source our mock utils.
 . ${SHUNIT_INC}/mock_utils.sh
+
 ######################################
 # Common functions
 
@@ -118,7 +121,7 @@ fi
 # to run first.
 test___logger() {
     # Write a line to the log, test that it got there.
-    TEST_MSG="Test01_logger message"
+    TEST_MSG="test___logger message"
     LOG_LINE="`date +'%b %e %Y %T'`: ${TEST_MSG}"
     # It's important for the log messages to be quoted, or funny stuff happens.
     logger "${TEST_MSG}"
@@ -136,7 +139,7 @@ test___logger() {
 
 test__log_output_of() {
     # Use log_output_of to append to the log
-    TEST_MSG="Test02_log_output_of message"
+    TEST_MSG="test__log_output_of message"
     log_output_of echo "${TEST_MSG}"
     assertEquals "log_output_of()" 0 $?
     COUNT=`grep -c "${TEST_MSG}" ${LOGFILE}`
@@ -285,11 +288,11 @@ test_reload_xinetd() {
     rm ${MOCKDIR}/success
     reload_xinetd "reload"
     assertEquals "reload_xinetd" 1 $?
-    tail -4 ${LOGFILE}|grep "\<xinetd.*Attempting restart"
+    tail -4 ${LOGFILE}|grep "\<xinetd.*Attempting restart" >/dev/null
     assertEquals "reload_xinetd should try to restart." 0 $?
     reload_xinetd "restart"
     assertEquals "restart should fail." 1 $?
-    tail -3 ${LOGFILE}|grep "Restarting xinetd"
+    tail -3 ${LOGFILE}|grep "Restarting xinetd" >/dev/null
     assertEquals "Should log attempt to restart" 0 $?
 }
 
@@ -313,11 +316,11 @@ test_reload_inetd() {
     rm ${MOCKDIR}/success
     reload_inetd "reload"
     assertEquals "reload_inetd" 1 $?
-    tail -4 ${LOGFILE}|grep "\<inetd.*Attempting restart"
+    tail -4 ${LOGFILE}|grep "\<inetd.*Attempting restart" >/dev/null
     assertEquals "reload_inetd should try to restart." 0 $?
     reload_inetd "restart"
     assertEquals "restart should fail." 1 $?
-    tail -3 ${LOGFILE}|grep "Restarting inetd"
+    tail -3 ${LOGFILE}|grep "Restarting inetd" >/dev/null
     assertEquals "Should log attempt to restart" 0 $?
 }
 
@@ -325,89 +328,118 @@ test_reload_inetd() {
 ######################################
 # pre_install_functions
 
-test_check_user_crazy_input() {
-    logger "test_check_user_crazy_input"
-    # Case 1: not enough params.
-    check_user "bar"
-    assertEquals "'check_user bar'" 2 $?
-    
-    # Case 2: bad first param.
-    check_user "bar" "bell" 
-    assertEquals "'check_user bar bell'" 2 $?
-}
-
 test_check_user_group_missing() {
-    logger "test_check_user_group_missing"
+    logger "test_check_user_group_missing no param"
+    check_user_group
+    assertNotEquals "'check_user_group' should fail" 0 $?
+    logger "test_check_user_group_missing missing group"
+    [ ! "$IAmRoot" ] && rm -f ${SYSCONFDIR}/group
     touch ${SYSCONFDIR}/group
-    check_user "group" "abracadabra"
-    assertNotEquals "'check_user group abracadabra' should not be found:" 0 $?
-}
-
-# passwd file entry for Linux systems, maybe others.  UID is correct
-# for Debian as well.
-good_passwd_entry="${amanda_user}:x:${mock_deb_uid}:6::${AMANDAHOMEDIR}:/bin/bash"
-export good_passwd_entry
-test_create_user() {
-    logger "test_create_user"
-    if [ ! "$IAmRoot" ]; then
-       startSkipping
-       echo "test_create_user: Creating mock passwd file."
-       echo "$good_passwd_entry" > ${SYSCONFDIR}/passwd
-       echo "test_create_user: tests skipped."
-       #TODO: mock useradd.
-       return
-    fi
-    # Case 1: create_user should succeed.
-    create_user
-    assertEquals "create_user()" 0 $?
-}
-
-good_group_entry="${amanda_group}:x:100:${amanda_user}"
+    for os in linux osx solaris; do
+        echo $os > ${MOCKDIR}/id_os
+        check_user_group "abracadabra"
+        assertNotEquals "'check_user group abracadabra' should not be found:" 0 $?
+        LOG_TAIL=`tail -1 ${LOGFILE}|cut -d " " -f 5-`
+        assertEquals "check_user_group should write" \
+            "User's primary group 'abracadabra' does not exist" \
+            "${LOG_TAIL}"
+    done
+}
+
+good_group_entry="${amanda_group}:x:100:"
 export good_group_entry
-test_check_user_group() {
-    logger "test_check_user_group"
+test_check_user_group_exists() {
+    logger "test_check_user_group user and group exist"
+    touch ${MOCKDIR}/id_exists
     touch ${SYSCONFDIR}/group
     # Non-root adds and entry to the mock group file
     [ ! "$IAmRoot" ] && echo $good_group_entry > ${SYSCONFDIR}/group
+    for os in linux osx solaris; do
+        echo $os > ${MOCKDIR}/id_os
 
-    # Case 1: Amanda_user is correct.
-    touch ${MOCKDIR}/is_member
-    check_user "group" "${amanda_group}"
-    assertEquals "'check_user group ${amanda_group}': id returns member" \
-        0 $?
+        # Case 1: Amanda_user is correct.
+        echo ${amanda_group} > ${MOCKDIR}/id_group
+        check_user_group "${amanda_group}"
+        assertEquals "'check_user_group ${amanda_group}': id returns correct groupname" \
+            0 $?
 
-    # Case 2: Amanda_user is not a member of the the correct group.
-    rm ${MOCKDIR}/is_member
-    check_user "group" "${amanda_group}"
-    assertEquals "'check_user group ${amanda_group}' when not a member" 1 $?
+        # Case 2: Amanda_user is not a member of the the correct primary group.
+        rm ${MOCKDIR}/id_group
+        check_user_group "${amanda_group}"
+        assertEquals "'check_user_group ${amanda_group}' when not a member" 1 $?
+    done
 }
 
+test_check_user_supplemental_group_missing() {
+    logger "test_check_user_supplemental_group missing"
+    [ ! "$IAmRoot" ] && echo $good_group_entry > ${SYSCONFDIR}/group
+    for os in linux osx solaris; do
+        echo $os > ${MOCKDIR}/id_os
+        check_user_supplemental_group ${sup_group}
+        assertEquals "'check_user supplemental-group ${sup_group}' when group missing" \
+        1 $?
+    done
+}
+
+missing_group_member="${sup_group}:x:105:nobody"
+export missing_group_member
+good_sup_group_entry="${missing_group_member},${amanda_user}"
+export good_sup_group_entry
+
+test_check_user_supplemental_group_exists() {
+    logger "test_check_user_supplemental_group exists"
+    [ ! "$IAmRoot" ] && echo $missing_group_member > ${SYSCONFDIR}/group
+    check_user_supplemental_group ${sup_group}
+    assertEquals "'check_user_supplemental_group ${sup_group}' when amanda_user is not a member" \
+        1 $?
+
+    [ ! "$IAmRoot" ] && echo ${good_sup_group_entry} > ${SYSCONFDIR}/group
+    check_user_supplemental_group ${sup_group}
+    assertEquals "'check_user_supplemental_group ${sup_group}' with correct membership" \
+        0 $?
+}
 test_check_user_shell() {
     logger "test_check_user_shell"
     if [ ! "$IAmRoot" ]; then
-       echo "$good_passwd_entry" > ${SYSCONFDIR}/passwd
+       echo "${good_passwd_entry}" > ${SYSCONFDIR}/passwd
     fi
     # Case 1: Provide a matching shell
-    check_user "shell" "/bin/bash"
-    assertEquals "check_user shell /bin/bash (matching)" 0 $?
-    # Case 2: Provid a non-matching shell. 
-    check_user "shell" "/bin/sh"
-    assertEquals "check_user shell /bin/ksh (not matching)" 1 $?
+    check_user_shell "/bin/bash"
+    assertEquals "check_user_shell /bin/bash (matching)" 0 $?
+    # Case 2: Provide a non-matching shell. 
+    check_user_shell "/bin/ksh"
+    assertEquals "check_user_shell /bin/ksh (not matching)" 1 $?
 }
 
 test_check_user_homedir() {
     logger 'test_check_user_homedir'
     if [ ! "$IAmRoot" ]; then
-       echo "$good_passwd_entry" > ${SYSCONFDIR}/passwd
+       echo "${good_passwd_entry}" > ${SYSCONFDIR}/passwd
     fi
     # Case 1: Assume amanda_user is correct.
-    check_user "homedir" "${AMANDAHOMEDIR}"
-    assertEquals "check_user homedir ${AMANDAHOMEDIR}" 0 $?
+    check_user_homedir "${AMANDAHOMEDIR}"
+    assertEquals "check_user_homedir ${AMANDAHOMEDIR}" 0 $?
     # Case 2: Provide an incorrect homedir
-    check_user "homedir" "/tmp"
-    assertEquals "check_user homedir /tmp" 1 $?
-}
+    check_user_homedir "/tmp"
+    assertEquals "check_user_homedir /tmp" 1 $?
+}
+
+test_check_user_uid() {
+    echo "${amanda_group}" > ${MOCKDIR}/id_group
+    touch ${MOCKDIR}/id_exists
+    logger 'test_check_user_uid'
+    for os in linux osx solaris; do
+        echo $os > ${MOCKDIR}/id_os
+        check_user_uid
+        assertEquals "check_user_uid without a uid" 1 $?
+        logger 'test_check_user_uid wrong id'
+        check_user_uid 123
+        assertEquals "check_user_uid uids don't match" 1 $?
+        logger 'test_check_user_uid correct id'
+        check_user_uid ${deb_uid}
+    done
 
+}
 test_check_homedir_dir_missing() {
     logger "test_check_homedir_dir_missing"
     # First make sure the dir is missing
@@ -416,6 +448,61 @@ test_check_homedir_dir_missing() {
     assertNotEquals "check_homedir returned 0, but homedir did not exist" 0 $?
 }
 
+# passwd file entry for Linux systems, maybe others.  UID is correct
+# for Debian as well.
+good_passwd_entry="${amanda_user}:x:${mock_deb_uid}:6::${AMANDAHOMEDIR}:/bin/bash"
+export good_passwd_entry
+test_create_user() {
+    logger "test_create_user"
+    if [ ! "$IAmRoot" ]; then
+       startSkipping
+       echo "test_create_user: Creating mock passwd file."
+       echo "$good_passwd_entry" > ${SYSCONFDIR}/passwd
+       echo "test_create_user: tests skipped."
+       #TODO: mock useradd.
+       return
+    fi
+    # Case 1: create_user should succeed.
+    create_user
+    assertEquals "create_user()" 0 $?
+}
+
+test_add_group_check_parameters_logs() {
+    rm -f ${MOCKDIR}/groupadd_rc ${MOCKDIR}/num_groups
+    # Return codes are integers.
+    printf '%i' 0 > ${MOCKDIR}/groupadd_rc
+    # Test that first parameter is required.
+    add_group
+    assertEquals "add_group without a group should fail." 1 $?
+    LOG_TAIL=`tail -1 ${LOGFILE}|cut -d " " -f 5-`
+    assertEquals "add_group should write" \
+        "Error: first argument was not a group to add." \
+        "${LOG_TAIL}"
+}
+
+test_add_group_group_ok() {
+    # groupadd created group
+    printf '%i' 0 > ${MOCKDIR}/groupadd_rc
+    echo '${amanda_user} : prev_grp1' > ${MOCKDIR}/groups_output
+    add_group twinkle
+    assertEquals "add_group group ok" 0 $?
+    flags=`cat ${mock_usermod_flags}`
+    assertEquals "usermod_flags" \
+        "usermod args: -G prev_grp1,twinkle ${amanda_user}" \
+        "${flags}"
+
+    # Make sure supplemental groups are preserved when adding groups to an
+    # existing account
+    echo '${amanda_user} : prev_grp1 prev_grp2' > ${MOCKDIR}/groups_output
+    printf '%i' 1 > ${MOCKDIR}/num_groups
+    add_group twinkle
+    assertEquals "add_group group ok" 0 $?
+    flags=`cat ${mock_usermod_flags}`
+    assertEquals "usermod_flags should contain:" \
+        "usermod args: -G prev_grp1,prev_grp2,twinkle ${amanda_user}" \
+        "${flags}"
+}
+
 test_create_homedir() {
     logger "test_create_homedir"
     rm -rf ${AMANDAHOMEDIR}
@@ -627,12 +714,11 @@ if [ $# -gt 0 ]; then
     echo $1
     SPECIFIC_TESTS="$*"
     suite() {
-       __shunit_suite="test___logger"
-       __shunit_suite="$__shunit_suite test__log_output_of"
-       __shunit_suite="$__shunit_suite $SPECIFIC_TESTS"
-       # Set the test total including the 3 base tests.
-       __shunit_testsTotal=`expr 2 + $#`
         suite_addTest test___logger
+        suite_addTest test__log_output_of
+        for t in $SPECIFIC_TESTS; do
+            suite_addTest $t
+        done
     }
 fi