diff options
Diffstat (limited to 'ctdb/tests/scripts/common.sh')
-rw-r--r-- | ctdb/tests/scripts/common.sh | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/ctdb/tests/scripts/common.sh b/ctdb/tests/scripts/common.sh new file mode 100644 index 0000000..5bc5869 --- /dev/null +++ b/ctdb/tests/scripts/common.sh @@ -0,0 +1,146 @@ +# Hey Emacs, this is a -*- shell-script -*- !!! :-) + +# Common variables and functions for all CTDB tests. + + +# Commands on different platforms may quote or sort things differently +# without this +export LANG=C + +# Print a message and exit. +die () +{ + echo "$1" >&2 ; exit "${2:-1}" +} + +. "${TEST_SCRIPTS_DIR}/script_install_paths.sh" + +if [ -d "$CTDB_SCRIPTS_TOOLS_BIN_DIR" ] ; then + PATH="${CTDB_SCRIPTS_TOOLS_BIN_DIR}:${PATH}" +fi + +if [ -d "$CTDB_SCRIPTS_TESTS_LIBEXEC_DIR" ] ; then + PATH="${CTDB_SCRIPTS_TESTS_LIBEXEC_DIR}:${PATH}" +fi + +ctdb_test_error () +{ + if [ $# -gt 0 ] ; then + echo "$*" + fi + exit 99 +} + +ctdb_test_fail () +{ + if [ $# -gt 0 ] ; then + echo "$*" + fi + exit 1 +} + +ctdb_test_skip () +{ + if [ $# -gt 0 ] ; then + echo "$*" + fi + exit 77 +} + +# "$@" is supported OSes +ctdb_test_check_supported_OS () +{ + _os=$(uname -s) + for _i ; do + if [ "$_os" = "$_i" ] ; then + return + fi + done + + ctdb_test_skip "This test is not supported on ${_os}" +} + +# Wait until either timeout expires or command succeeds. The command +# will be tried once per second, unless timeout has format T/I, where +# I is the recheck interval. +wait_until () +{ + _timeout="$1" ; shift # "$@" is the command... + + _interval=1 + case "$_timeout" in + */*) + _interval="${_timeout#*/}" + _timeout="${_timeout%/*}" + esac + + _negate=false + if [ "$1" = "!" ] ; then + _negate=true + shift + fi + + printf '<%d|' "$_timeout" + _t="$_timeout" + while [ "$_t" -gt 0 ] ; do + _rc=0 + "$@" || _rc=$? + if { ! $_negate && [ $_rc -eq 0 ] ; } || \ + { $_negate && [ $_rc -ne 0 ] ; } ; then + echo "|$((_timeout - _t))|" + echo "OK" + return 0 + fi + for _i in $(seq 1 "$_interval") ; do + printf '.' + done + _t=$((_t - _interval)) + sleep "$_interval" + done + + echo "*TIMEOUT*" + + return 1 +} + +# setup_ctdb_base <parent> <subdir> [item-to-copy]... +setup_ctdb_base () +{ + [ $# -ge 2 ] || die "usage: setup_ctdb_base <parent> <subdir> [item]..." + # If empty arguments are passed then we attempt to remove / + # (i.e. the root directory) below + if [ -z "$1" ] || [ -z "$2" ] ; then + die "usage: setup_ctdb_base <parent> <subdir> [item]..." + fi + + _parent="$1" + _subdir="$2" + + # Other arguments are files/directories to copy + shift 2 + + export CTDB_BASE="${_parent}/${_subdir}" + if [ -d "$CTDB_BASE" ] ; then + rm -r "$CTDB_BASE" + fi + mkdir -p "$CTDB_BASE" || die "Failed to create CTDB_BASE=$CTDB_BASE" + mkdir -p "${CTDB_BASE}/run" || die "Failed to create ${CTDB_BASE}/run" + mkdir -p "${CTDB_BASE}/var" || die "Failed to create ${CTDB_BASE}/var" + + for _i ; do + cp -pr "${CTDB_SCRIPTS_BASE}/${_i}" "${CTDB_BASE}/" + done + + mkdir -p "${CTDB_BASE}/events/legacy" + + if [ -z "$CTDB_TEST_SUITE_DIR" ] ; then + return + fi + + for _i in "${CTDB_TEST_SUITE_DIR}/etc-ctdb/"* ; do + # No/empty etc-ctdb directory + [ -e "$_i" ] || break + + cp -pr "$_i" "${CTDB_BASE}/" + done +} |