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
# 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.
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
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
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
# Source our mock utils.
. ${SHUNIT_INC}/mock_utils.sh
+
######################################
# Common functions
# 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}"
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}`
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 $?
}
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 $?
}
######################################
# 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
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}
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