--- /dev/null
+Unit tests for event daemon
--- /dev/null
+[logging]
+ location = file:
+ log level = DEBUG
+
+[event]
+ debug script = debug-script.sh
--- /dev/null
+#!/bin/sh
+
+log="${CTDB_BASE}/debug_script.log"
+
+case "$2" in
+"timeout")
+ echo "args: $*" > "$log"
+ ;;
+
+"verbosetimeout")
+ (pstree -p -a $1 ; ctdb-event status random $2) > "$log"
+ ;;
+
+"verbosetimeout2")
+ exec > "$log" 2>&1
+ ctdb-event status random $2
+ ;;
+
+*)
+ ;;
+
+esac
--- /dev/null
+empty event scripts directory
--- /dev/null
+#!/bin/sh
+
+case "$1" in
+"startup") sleep 5; exit 0 ;;
+"monitor") sleep 5; exit 0 ;;
+"event1") sleep 1; exit 0 ;;
+"event2") sleep 1; exit 0 ;;
+"event3") exit 3 ;;
+"timeout1") sleep 99 ;;
+*) exit 0 ;;
+esac
--- /dev/null
+#!/bin/sh
+
+case "$1" in
+"monitor") sleep 1; exit 0 ;;
+"event1") exit 1 ;;
+"event2") sleep 1; exit 0 ;;
+"timeout2") sleep 99 ;;
+*) exit 0 ;;
+esac
--- /dev/null
+#!/bin/sh
+
+case "$1" in
+"monitor") sleep 1; exit 0 ;;
+"event1") sleep 1; exit 0 ;;
+"event2") exit 2 ;;
+"timeout3") sleep 99 ;;
+*) exit 0 ;;
+esac
--- /dev/null
+#!/bin/sh
+
+exit 0
--- /dev/null
+#!/bin/sh
+
+case "$1" in
+"monitor") exit 0 ;;
+"failure") exit 1 ;;
+"timeout") sleep 99 ;;
+"verbose") echo "Running event $1" ; exit 0 ;;
+"verbosefailure") echo "args: $*"; exit 1 ;;
+"verbosetimeout") echo "Sleeping for 99 seconds"; sleep 99 ;;
+"verbosetimeout2") echo "Sleeping for 99 seconds"; sleep 99 ;;
+*) exit 0 ;;
+esac
--- /dev/null
+Random collection of files and event scripts
--- /dev/null
+#!/bin/sh
+
+exit 1
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "non-existent eventscript directory"
+
+setup_eventd
+
+required_result 2 <<EOF
+Event dir for foobar does not exist
+EOF
+simple_test status foobar monitor
+
+required_result 2 <<EOF
+Event dir for foobar does not exist
+EOF
+simple_test run 10 foobar monitor
+
+required_result 2 <<EOF
+Script 01.test does not exist in foobar
+EOF
+simple_test script enable foobar 01.test
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "empty eventscript directory"
+
+setup_eventd
+
+required_result 22 <<EOF
+Event monitor has never run in empty
+EOF
+simple_test status empty monitor
+
+ok <<EOF
+EOF
+simple_test run 10 empty monitor
+
+ok <<EOF
+EOF
+simple_test status empty monitor
+
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "eventscript directory with random files"
+
+setup_eventd
+
+required_result 22 <<EOF
+Script README is invalid in random
+EOF
+simple_test script enable random README
+
+required_result 22 <<EOF
+Script a is invalid in random
+EOF
+simple_test script disable random a
+
+required_result 2 <<EOF
+Script 00.foobar does not exist in random
+EOF
+simple_test script enable random 00.foobar
+
+required_result 22 <<EOF
+Event monitor has never run in random
+EOF
+simple_test status random monitor
+
+ok <<EOF
+EOF
+simple_test run 10 random monitor
+
+ok <<EOF
+01.disabled DISABLED
+02.enabled OK DURATION DATETIME
+EOF
+simple_test status random monitor
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "disabled event script"
+
+setup_eventd
+
+ok_null
+simple_test script disable random 01.disabled
+
+ok_null
+simple_test script disable random 01.disabled
+
+ok_null
+simple_test script enable random 01.disabled
+
+ok_null
+simple_test script disable random 01.disabled
+
+required_result 22 <<EOF
+Event monitor has never run in random
+EOF
+simple_test status random monitor
+
+ok_null
+simple_test run 10 random monitor
+
+ok <<EOF
+01.disabled DISABLED
+02.enabled OK DURATION DATETIME
+EOF
+simple_test status random monitor
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "enabled event script"
+
+setup_eventd
+
+ok_null
+simple_test script enable random 02.enabled
+
+ok_null
+simple_test script enable random 02.enabled
+
+ok_null
+simple_test run 10 random monitor
+
+ok <<EOF
+01.disabled DISABLED
+02.enabled OK DURATION DATETIME
+EOF
+simple_test status random monitor
+
+ok_null
+simple_test script enable random 01.disabled
+
+ok_null
+simple_test run 10 random monitor
+
+ok <<EOF
+01.disabled OK DURATION DATETIME
+02.enabled OK DURATION DATETIME
+EOF
+simple_test status random monitor
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "failing event script"
+
+setup_eventd
+
+required_result 8 <<EOF
+Event failure in random failed
+EOF
+simple_test run 10 random failure
+
+required_result 1 <<EOF
+01.disabled DISABLED
+02.enabled ERROR DURATION DATETIME
+ OUTPUT:
+EOF
+simple_test status random failure
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "timing out event script"
+
+setup_eventd
+
+required_result 62 <<EOF
+Event timeout in random timed out
+EOF
+simple_test run 5 random timeout
+
+required_result 62 <<EOF
+01.disabled DISABLED
+02.enabled TIMEDOUT DATETIME
+ OUTPUT:
+EOF
+simple_test status random timeout
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "capture event script output"
+
+setup_eventd
+
+required_result 8 <<EOF
+Event verbosefailure in random failed
+EOF
+simple_test run 10 random verbosefailure with some args
+
+required_result 1 <<EOF
+01.disabled DISABLED
+02.enabled ERROR DURATION DATETIME
+ OUTPUT: args: verbosefailure with some args
+EOF
+simple_test status random verbosefailure
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "multiple events"
+
+setup_eventd
+
+ok_null
+simple_test run 10 random monitor
+
+ok <<EOF
+01.disabled DISABLED
+02.enabled OK DURATION DATETIME
+EOF
+simple_test status random monitor
+
+required_result 8 <<EOF
+Event failure in random failed
+EOF
+simple_test run 10 random failure
+
+required_result 1 <<EOF
+01.disabled DISABLED
+02.enabled ERROR DURATION DATETIME
+ OUTPUT:
+EOF
+simple_test status random failure
+
+required_result 8 <<EOF
+Event verbosefailure in random failed
+EOF
+simple_test run 10 random verbosefailure
+
+required_result 1 <<EOF
+01.disabled DISABLED
+02.enabled ERROR DURATION DATETIME
+ OUTPUT: args: verbosefailure
+EOF
+simple_test status random verbosefailure
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "cancel new monitor event"
+
+setup_eventd
+
+ok_null
+simple_test_background run 10 multi startup
+
+required_result 125 <<EOF
+Event monitor in multi got cancelled
+EOF
+simple_test run 10 multi monitor
+
+ok <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi startup
+
+required_result 22 <<EOF
+Event monitor has never run in multi
+EOF
+simple_test status multi monitor
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "cancel running monitor event"
+
+setup_eventd
+
+required_result 125 <<EOF
+Event monitor in multi got cancelled
+EOF
+simple_test_background run 10 multi monitor
+
+ok_null
+simple_test run 10 multi startup
+
+ok <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi startup
+
+required_result 22 <<EOF
+Event monitor has never run in multi
+EOF
+simple_test status multi monitor
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "queue events"
+
+setup_eventd
+
+ok_null
+simple_test_background run 10 multi queue1
+
+ok_null
+simple_test run 10 multi queue2
+
+ok <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi queue1
+
+ok <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi queue2
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "debug script"
+
+setup_eventd
+
+result_filter ()
+{
+ _pid="[0-9][0-9]*"
+ sed -e "s| ${_pid}| PID|"
+}
+
+required_result 62 <<EOF
+Event timeout in random timed out
+EOF
+simple_test run 5 random timeout
+
+# wait for debug hung script
+sleep 5
+
+ok <<EOF
+args: PID timeout
+EOF
+unit_test cat "${CTDB_BASE}/debug_script.log"
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "status output in debug script"
+
+setup_eventd
+
+required_result 62 <<EOF
+Event verbosetimeout in random timed out
+EOF
+simple_test run 5 random verbosetimeout
+
+# wait for debug hung script
+sleep 5
+
+ok <<EOF
+02.enabled.scri,PID $eventd_scriptdir/random/02.enabled.script verbosetimeout
+ \`-sleep,PID 99
+01.disabled DISABLED
+02.enabled TIMEDOUT DATETIME
+ OUTPUT: Sleeping for 99 seconds
+EOF
+unit_test cat "${CTDB_BASE}/debug_script.log"
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "redirected status output in debug script"
+
+setup_eventd
+
+required_result 62 <<EOF
+Event verbosetimeout2 in random timed out
+EOF
+simple_test run 5 random verbosetimeout2
+
+# wait for debug hung script
+sleep 5
+
+ok <<EOF
+01.disabled DISABLED
+02.enabled TIMEDOUT DATETIME
+ OUTPUT: Sleeping for 99 seconds
+EOF
+unit_test cat "${CTDB_BASE}/debug_script.log"
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "process terminated after debug"
+
+setup_eventd
+
+result_filter()
+{
+ _pid="[0-9][0-9]*"
+ sed -e "s|${_pid}|PID|"
+}
+
+required_result 62 <<EOF
+Event timeout in random timed out
+EOF
+simple_test run 5 random timeout
+
+# wait for debug hung script
+sleep 5
+
+ok <<EOF
+args: PID timeout
+EOF
+unit_test cat "${CTDB_BASE}/debug_script.log"
+
+pid=$(cat "${CTDB_BASE}/debug_script.log" | awk '{print $2}')
+
+ok_null
+unit_test pstree -p -a "$pid"
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "multiple scripts"
+
+setup_eventd
+
+ok_null
+simple_test run 30 multi monitor
+
+ok <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi monitor
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "failures with multiple scripts"
+
+setup_eventd
+
+required_result 8 <<EOF
+Event event1 in multi failed
+EOF
+simple_test run 10 multi event1
+
+required_result 1 <<EOF
+01.test OK DURATION DATETIME
+02.test ERROR DURATION DATETIME
+ OUTPUT:
+EOF
+simple_test status multi event1
+
+required_result 8 <<EOF
+Event event2 in multi failed
+EOF
+simple_test run 10 multi event2
+
+required_result 2 <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test ERROR DURATION DATETIME
+ OUTPUT:
+EOF
+simple_test status multi event2
+
+required_result 8 <<EOF
+Event event3 in multi failed
+EOF
+simple_test run 10 multi event3
+
+required_result 3 <<EOF
+01.test ERROR DURATION DATETIME
+ OUTPUT:
+EOF
+simple_test status multi event3
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "timeouts with multiple scripts"
+
+setup_eventd
+
+required_result 62 <<EOF
+Event timeout1 in multi timed out
+EOF
+simple_test run 5 multi timeout1
+
+required_result 62 <<EOF
+01.test TIMEDOUT DATETIME
+ OUTPUT:
+EOF
+simple_test status multi timeout1
+
+required_result 62 <<EOF
+Event timeout2 in multi timed out
+EOF
+simple_test run 5 multi timeout2
+
+required_result 62 <<EOF
+01.test OK DURATION DATETIME
+02.test TIMEDOUT DATETIME
+ OUTPUT:
+EOF
+simple_test status multi timeout2
+
+required_result 62 <<EOF
+Event timeout3 in multi timed out
+EOF
+simple_test run 5 multi timeout3
+
+required_result 62 <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test TIMEDOUT DATETIME
+ OUTPUT:
+EOF
+simple_test status multi timeout3
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "multiple components"
+
+setup_eventd
+
+ok_null
+simple_test_background run 10 multi monitor
+
+ok_null
+simple_test run 10 random monitor
+
+ok <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi monitor
+
+ok <<EOF
+01.disabled DISABLED
+02.enabled OK DURATION DATETIME
+EOF
+simple_test status random monitor
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "multiple components with failure"
+
+setup_eventd
+
+ok_null
+simple_test_background run 10 multi monitor
+
+required_result 8 <<EOF
+Event failure in random failed
+EOF
+simple_test run 10 random failure
+
+ok <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi monitor
+
+required_result 1 <<EOF
+01.disabled DISABLED
+02.enabled ERROR DURATION DATETIME
+ OUTPUT:
+EOF
+simple_test status random failure
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "multiple components with timeout"
+
+setup_eventd
+
+ok_null
+simple_test_background run 10 multi monitor
+
+required_result 62 <<EOF
+Event timeout in random timed out
+EOF
+simple_test run 10 random timeout
+
+ok <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi monitor
+
+required_result 62 <<EOF
+01.disabled DISABLED
+02.enabled TIMEDOUT DATETIME
+ OUTPUT:
+EOF
+simple_test status random timeout
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "new component"
+
+setup_eventd
+
+ok_null
+mkdir "${eventd_scriptdir}/foobar"
+
+ok_null
+cp "${eventd_scriptdir}/random/01.disabled.script" "${eventd_scriptdir}/foobar"
+
+required_result 22 <<EOF
+Event monitor has never run in foobar
+EOF
+simple_test status foobar monitor
+
+ok_null
+simple_test run 10 foobar monitor
+
+ok <<EOF
+01.disabled DISABLED
+EOF
+simple_test status foobar monitor
+
+ok_null
+simple_test script enable foobar 01.disabled
+
+ok_null
+simple_test run 10 foobar monitor
+
+ok <<EOF
+01.disabled OK DURATION DATETIME
+EOF
+simple_test status foobar monitor
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "logging check"
+
+setup_eventd
+
+ok_null
+simple_test run 10 random verbose
+
+ok <<EOF
+ctdb-eventd[PID]: 02.enabled: Running event verbose
+EOF
+unit_test grep "02.enabled:" "$eventd_logfile"
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "run through failure"
+
+setup_eventd
+
+export CTDB_EVENT_RUN_ALL=1
+
+required_result 8 <<EOF
+Event event1 in multi failed
+EOF
+simple_test run 10 multi event1
+
+required_result 1 <<EOF
+01.test OK DURATION DATETIME
+02.test ERROR DURATION DATETIME
+ OUTPUT:
+03.test OK DURATION DATETIME
+EOF
+simple_test status multi event1
+
+required_result 8 <<EOF
+Event event2 in multi failed
+EOF
+simple_test run 10 multi event2
+
+required_result 2 <<EOF
+01.test OK DURATION DATETIME
+02.test OK DURATION DATETIME
+03.test ERROR DURATION DATETIME
+ OUTPUT:
+EOF
+simple_test status multi event2
--- /dev/null
+# Hey Emacs, this is a -*- shell-script -*- !!! :-)
+
+. "${TEST_SCRIPTS_DIR}/script_install_paths.sh"
+
+PATH="$PATH:$CTDB_SCRIPTS_TOOLS_HELPER_DIR"
+
+if "$TEST_VERBOSE" ; then
+ debug () { echo "$@" ; }
+else
+ debug () { : ; }
+fi
+
+setup_ctdb_base "${TEST_VAR_DIR}" "eventd"
+
+ctdb_config=$(ctdb-path config)
+eventd_socket=$(ctdb-path socket eventd)
+eventd_pidfile=$(ctdb-path pidfile eventd)
+eventd_scriptdir=$(ctdb-path etcdir append events)
+eventd_logfile="${CTDB_BASE}/eventd.log"
+
+define_test ()
+{
+ _f=$(basename "$0" ".sh")
+
+ printf "%-28s - %s\n" "$_f" "$1"
+}
+
+cleanup_eventd ()
+{
+ debug "Cleaning up eventd"
+
+ pid=$(cat "$eventd_pidfile" 2>/dev/null || echo)
+ if [ -n "$pid" ] ; then
+ kill $pid || true
+ fi
+}
+
+setup_eventd ()
+{
+ echo "Setting up eventd"
+
+ $VALGRIND ctdb-eventd 2>&1 | tee "$eventd_logfile" &
+ # Wait till eventd is running
+ wait_until 10 test -S "$eventd_socket" || \
+ die "ctdb_eventd failed to start"
+
+ test_cleanup cleanup_eventd
+}
+
+simple_test_background ()
+{
+ background_log="${CTDB_BASE}/background.log"
+ background_status="${CTDB_BASE}/background.status"
+ background_running=1
+
+ (
+ (unit_test ctdb-event "$@") > "$background_log" 2>&1
+ echo $? > "$background_status"
+ ) &
+ background_pid=$!
+}
+
+background_wait ()
+{
+ [ -n "$background_running" ] || return
+
+ count=0
+ while [ ! -s "$background_status" -a $count -lt 30 ] ; do
+ count=$(( $count + 1 ))
+ sleep 1
+ done
+
+ if [ ! -s "$background_status" ] ; then
+ kill -9 "$background_pid"
+ echo TIMEOUT > "$background_status"
+ fi
+}
+
+background_output ()
+{
+ [ -n "$background_running" ] || return
+
+ bg_status=$(cat "$background_status")
+ rm -f "$background_status"
+ echo "--- Background ---"
+ if [ "$bg_status" = "TIMEOUT" ] ; then
+ echo "Background process did not complete"
+ bg_status=1
+ else
+ cat "$background_log"
+ rm -f "$background_log"
+ fi
+ echo "--- Background ---"
+ unset background_running
+ [ $bg_status -eq 0 ] || exit $bg_status
+}
+
+simple_test ()
+{
+ (unit_test ctdb-event "$@")
+ status=$?
+
+ background_wait
+ background_output
+
+ [ $status -eq 0 ] || exit $status
+}
+
+result_filter ()
+{
+ _duration="\<[0-9][0-9]*\.[0-9][0-9][0-9]\>"
+ _day="\(Mon\|Tue\|Wed\|Thu\|Fri\|Sat\|Sun\)"
+ _month="\(Jan\|Feb\|Mar\|Apr\|May\|Jun\|Jul\|Aug\|Sep\|Oct\|Nov\|Dec\)"
+ _date="\( [0-9]\|[0-9][0-9]\)"
+ _time="[0-9][0-9]:[0-9][0-9]:[0-9][0-9]"
+ _year="[0-9][0-9][0-9][0-9]"
+ _datetime="${_day} ${_month} ${_date} ${_time} ${_year}"
+ _pid="[0-9][0-9]*"
+ sed -e "s#${_duration}#DURATION#" \
+ -e "s#${_datetime}#DATETIME#" \
+ -e "s#,${_pid}#,PID#" \
+ -e "s#\[${_pid}\]#[PID]#"
+}
unit_tests="
ctdb_eventd
cunit
+ eventd
eventscripts
onnode
shellcheck
'complex',
'ctdb_eventd',
'cunit',
+ 'eventd',
'eventscripts',
'onnode',
'shellcheck',