X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=packaging%2Fcommon%2Ftest_sh_libs.sh;fp=packaging%2Fcommon%2Ftest_sh_libs.sh;h=22c4fb6cf87351bc12d0ed0e58b42917419a29af;hb=949b8910a5e23c4285d0b1aedacfc82a14dc97a5;hp=85711f1d30af669dd0e0b66ca971120f31d77bb8;hpb=c6f0a88c567f8536c498f554285aed1f8150da18;p=debian%2Famanda diff --git a/packaging/common/test_sh_libs.sh b/packaging/common/test_sh_libs.sh index 85711f1..22c4fb6 100755 --- a/packaging/common/test_sh_libs.sh +++ b/packaging/common/test_sh_libs.sh @@ -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 "\/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 "\/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