Commit b0142552 authored by Marcin Siodelski's avatar Marcin Siodelski
Browse files

[3422] Cleanup in the dhcp_test_lib.sh script.

parent c3baf284
......@@ -12,8 +12,6 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# Test name
TEST_NAME="DHCPv4.dynamicReconfiguration"
# Path to the temporary configuration file.
CFG_FILE="test_config.json"
# Path to the Kea log file.
......@@ -61,14 +59,14 @@ CONFIG_INVALID="{
}"
# Set the location of the executable.
BIN="b10-dhcp4"
BIN_PATH=".."
bin="b10-dhcp4"
bin_path=".."
# Import common test library.
. $(dirname $0)/../../../lib/testutils/dhcp_test_lib.sh
# Log the start of the test and print test name.
test_start
test_start "dhcpv4_srv.dynamic_reconfiguration"
# Remove dangling Kea instances and remove log files.
cleanup
# Create new configuration file.
......@@ -76,7 +74,7 @@ create_config "${CONFIG}"
# Instruct Kea to log to the specific file.
set_logger
# Start Kea.
start_kea
start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start.
wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then
......@@ -86,7 +84,7 @@ fi
# Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure).
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM}
......@@ -107,7 +105,7 @@ fi
create_config "${CONFIG_INVALID}"
# Try to reconfigure by sending SIGHUP
send_signal 1 ${BIN}
send_signal 1 ${bin}
# The configuration should fail and the error message should be there.
wait_for_message 10 "DHCP4_CONFIG_LOAD_FAIL" 1
......@@ -126,7 +124,7 @@ elif [ ${_GET_RECONFIG_ERRORS} -ne 1 ]; then
fi
# Make sure the server is still operational.
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1
......@@ -136,7 +134,7 @@ fi
create_config "${CONFIG}"
# Reconfigure the server with SIGHUP.
send_signal 1 ${BIN}
send_signal 1 ${bin}
# There should be two occurrences of the DHCP4_CONFIG_COMPLETE messages.
# Wait for it up to 10s.
......@@ -153,7 +151,7 @@ else
fi
# Make sure the server is still operational.
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1
......
......@@ -18,7 +18,7 @@ if [ $# -ne 2 ]; then
fi
# Test name
TEST_NAME=$1
test_name=${1}
# Signal number to be used for this test.
SIG_NUM=$2
# Path to the temporary configuration file.
......@@ -47,14 +47,14 @@ CONFIG="{
}"
# Set the location of the executable.
BIN="b10-dhcp4"
BIN_PATH=".."
bin="b10-dhcp4"
bin_path=".."
# Import common test library.
. $(dirname $0)/../../../lib/testutils/dhcp_test_lib.sh
# Log the start of the test and print test name.
test_start
test_start ${test_name}
# Remove dangling Kea instances and remove log files.
cleanup
# Create new configuration file.
......@@ -62,7 +62,7 @@ create_config "${CONFIG}"
# Instruct Kea to log to the specific file.
set_logger
# Start Kea.
start_kea
start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start.
wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then
......@@ -72,7 +72,7 @@ fi
# Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure).
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM}
......@@ -90,7 +90,7 @@ else
fi
# Send signal to Kea (SIGTERM, SIGINT etc.)
send_signal ${SIG_NUM} ${BIN}
send_signal ${SIG_NUM} ${bin}
# Wait up to 10s for the server's graceful shutdown. The graceful shut down
# should be recorded in the log file with the appropriate message.
......@@ -101,7 +101,7 @@ if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then
fi
# Server should have shut down.
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 0 ]; then
printf "ERROR: Kea did not shut down after receiving signal.\n"\
${_GET_PIDS_NUM}
......
......@@ -13,4 +13,4 @@
# PERFORMANCE OF THIS SOFTWARE.
# Run a test that sends SIGINT to Kea and checks if it shuts down gracefully.
$(dirname $0)/dhcp4_shutdown_test.sh "DHCPv4.sigint" 2
$(dirname $0)/dhcp4_shutdown_test.sh "dhcpv4_srv.sigint" 2
......@@ -13,4 +13,4 @@
# PERFORMANCE OF THIS SOFTWARE.
# Run a test that sends SIGTERM to Kea and checks if it shuts down gracefully.
$(dirname $0)/dhcp4_shutdown_test.sh "DHCPv4.sigterm" 15
$(dirname $0)/dhcp4_shutdown_test.sh "dhcpv4_srv.sigterm" 15
......@@ -12,8 +12,6 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# Test name
TEST_NAME="DHCPv6.dynamicReconfiguration"
# Path to the temporary configuration file.
CFG_FILE="test_config.json"
# Path to the Kea log file.
......@@ -63,14 +61,14 @@ CONFIG_INVALID="{
}"
# Set the location of the executable.
BIN="b10-dhcp6"
BIN_PATH=".."
bin="b10-dhcp6"
bin_path=".."
# Import common test library.
. $(dirname $0)/../../../lib/testutils/dhcp_test_lib.sh
# Log the start of the test and print test name.
test_start
test_start "dhcpv6_srv.dynamic_reconfiguration"
# Remove dangling Kea instances and remove log files.
cleanup
# Create new configuration file.
......@@ -78,7 +76,7 @@ create_config "${CONFIG}"
# Instruct Kea to log to the specific file.
set_logger
# Start Kea.
start_kea
start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start.
wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then
......@@ -88,7 +86,7 @@ fi
# Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure).
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM}
......@@ -109,7 +107,7 @@ fi
create_config "${CONFIG_INVALID}"
# Try to reconfigure by sending SIGHUP
send_signal 1 ${BIN}
send_signal 1 ${bin}
# The configuration should fail and the error message should be there.
wait_for_message 10 "DHCP6_CONFIG_LOAD_FAIL" 1
......@@ -128,7 +126,7 @@ elif [ ${_GET_RECONFIG_ERRORS} -ne 1 ]; then
fi
# Make sure the server is still operational.
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1
......@@ -138,7 +136,7 @@ fi
create_config "${CONFIG}"
# Reconfigure the server with SIGHUP.
send_signal 1 ${BIN}
send_signal 1 ${bin}
# There should be two occurrences of the DHCP6_CONFIG_COMPLETE messages.
# Wait for it up to 10s.
......@@ -155,7 +153,7 @@ else
fi
# Make sure the server is still operational.
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1
......
......@@ -18,7 +18,7 @@ if [ $# -ne 2 ]; then
fi
# Test name
TEST_NAME=$1
test_name=${1}
# Signal number to be used for this test.
SIG_NUM=$2
# Path to the temporary configuration file.
......@@ -48,14 +48,14 @@ CONFIG="{
}"
# Set the location of the executable.
BIN="b10-dhcp6"
BIN_PATH=".."
bin="b10-dhcp6"
bin_path=".."
# Import common test library.
. $(dirname $0)/../../../lib/testutils/dhcp_test_lib.sh
# Log the start of the test and print test name.
test_start
test_start ${test_name}
# Remove dangling Kea instances and remove log files.
cleanup
# Create new configuration file.
......@@ -63,7 +63,7 @@ create_config "${CONFIG}"
# Instruct Kea to log to the specific file.
set_logger
# Start Kea.
start_kea
start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start.
wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then
......@@ -73,7 +73,7 @@ fi
# Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure).
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM}
......@@ -91,7 +91,7 @@ else
fi
# Send signal to Kea (SIGTERM, SIGINT etc.)
send_signal ${SIG_NUM} ${BIN}
send_signal ${SIG_NUM} ${bin}
# Wait up to 10s for the server's graceful shutdown. The graceful shut down
# should be recorded in the log file with the appropriate message.
......@@ -102,7 +102,7 @@ if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then
fi
# Server should have shut down.
get_pids ${BIN}
get_pids ${bin}
if [ ${_GET_PIDS_NUM} -ne 0 ]; then
printf "ERROR: Kea did not shut down after receiving signal.\n"\
${_GET_PIDS_NUM}
......
......@@ -13,4 +13,4 @@
# PERFORMANCE OF THIS SOFTWARE.
# Run a test that sends SIGINT to Kea and checks if it shuts down gracefully.
$(dirname $0)/dhcp6_shutdown_test.sh "DHCPv6.sigint" 2
$(dirname $0)/dhcp6_shutdown_test.sh "dhcpv6_srv.sigint" 2
......@@ -13,4 +13,4 @@
# PERFORMANCE OF THIS SOFTWARE.
# Run a test that sends SIGTERM to Kea and checks if it shuts down gracefully.
$(dirname $0)/dhcp6_shutdown_test.sh "DHCPv6.sigterm" 15
$(dirname $0)/dhcp6_shutdown_test.sh "dhcpv6_srv.sigterm" 15
......@@ -71,13 +71,11 @@ config="{
# This test checks that both DHCPv4 and DHCPv6 server can be started and
# shut down.
start_both_servers_test() {
# Test name.
TEST_NAME="keactrl.start_both_servers_test"
# Create configuration file for keactrl. This configuration enables
# both DHCPv4 and DHCPv6 server.
keactrl_config="kea_config_file=${CFG_FILE}\nkea4=yes\nkea6=yes\n"
test_start
test_start "keactrl.start_both_servers_test"
# Create configuration file for Kea and for keactrl.
create_config "${config}"
......@@ -150,13 +148,11 @@ Expected wait_for_message return %d, returned %d."
# This test checks that only DHCPv4 server can be started and that the DHCPv6
# server is not started.
start_v4_server_test() {
# Test name.
TEST_NAME="keactrl.start_v4_server_test"
# Create configuration file for keactrl. This configuration enables
# DHCPv4 server but disables DHCPv6 server.
keactrl_config="kea_config_file=${CFG_FILE}\nkea4=yes\nkea6=no\n"
test_start
test_start "keactrl.start_v4_server_test"
# Create configuration file for Kea and for keactrl.
create_config "${config}"
......@@ -228,13 +224,11 @@ Expected wait_for_message return %d, returned %d."
# This test checks that only DHCPv6 server can be started and that the DHCPv4
# server is not started.
start_v6_server_test() {
# Test name.
TEST_NAME="keactrl.start_v6_server_test"
# Create configuration file for keactrl. This configuration enables
# DHCPv6 server but disables DHCPv4 server.
keactrl_config="kea_config_file=${CFG_FILE}\nkea4=no\nkea6=yes\n"
test_start
test_start "keactrl.start_v6_server_test"
# Create configuration file for Kea and for keactrl.
create_config "${config}"
......@@ -307,13 +301,11 @@ Expected wait_for_message return %d, returned %d."
# DHCPv4 server can be started while DHCPv6 server is already running.
# Also check that both servers can be reconfigured.
late_start_v4_server_test() {
# Test name.
TEST_NAME="keactrl.late_start_v4_server_test"
# Create configuration file for keactrl. This configuration enables
# DHCPv6 server but disables DHCPv4 server.
keactrl_config="kea_config_file=${CFG_FILE}\nkea4=no\nkea6=yes\n"
test_start
test_start "keactrl.late_start_v4_server_test"
# Create configuration file for Kea and for keactrl.
create_config "${config}"
......@@ -435,13 +427,11 @@ Expected wait_for_message return %d, returned %d."
# DHCPv6 server can be started while DHCPv4 server is already running.
# Also check that both servers can be reconfigured.
late_start_v6_server_test() {
# Test name.
TEST_NAME="keactrl.late_start_v6_server_test"
# Create configuration file for keactrl. This configuration enables
# DHCPv4 server but disables DHCPv6 server.
keactrl_config="kea_config_file=${CFG_FILE}\nkea4=yes\nkea6=no\n"
test_start
test_start "keactrl.late_start_v6_server_test"
# Create configuration file for Kea and for keactrl.
create_config "${config}"
......
......@@ -12,15 +12,23 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# The following two parameters must to be specified in a script
# including this library.
# - BIN - Name of the Kea executable (excluding a path), e.g. b10-dhcp6
# - BIN_PATH - Path to the Kea executable (excluding an executable name),
# e.g. ../
# A list of Kea processes, mainly used by the cleanup functions.
KEA_PROCS="b10-dhcp4 b10-dhcp6 b10-dhcp-ddns"
### Logging functions ###
# Prints error message.
test_lib_error() {
printf "ERROR/test_lib: %s\n" "${1}"
}
# Prints info message.
test_lib_info() {
printf "INFO/test_lib: %s\n" "${1}"
}
### Assertions ###
# Assertion that checks if two numbers are equal.
# If numbers are not equal, the mismatched values are presented and the
# detailed error is printed. The detailed error must use the printf
......@@ -59,14 +67,18 @@ assert_string_contains() {
}
# Begins a test by prining its name.
# It requires the ${TEST_NAME} variable to hold the test name.
test_start() {
TEST_NAME=${1}
if [ -z ${TEST_NAME} ]; then
test_lib_error "test_start requires test name as an argument"
clean_exit 1
fi
printf "\nSTART TEST ${TEST_NAME}\n"
}
# Prints test result an cleans up after the test.
test_finish() {
local error_code=${1}
exit_code=${1} # Exit code to be returned by the exit function.
local exit_code=${1} # Exit code to be returned by the exit function.
if [ ${exit_code} -eq 0 ]; then
cleanup
printf "PASSED ${TEST_NAME}\n\n"
......@@ -84,39 +96,78 @@ test_finish() {
# Stores the configuration specified as a parameter in the configuration
# file which name has been set in the ${CFG_FILE} variable.
create_config() {
local cfg=${1} # Configuration string.
if [ -z ${CFG_FILE} ]; then
test_lib_error "create_config requires CFG_FILE variable be set"
clean_exit 1
elif [ -z "${cfg}" ]; then
test_lib_error "create_config requires argument holding a configuration"
clean_exit 1
fi
printf "Creating Kea configuration file: %s.\n" ${CFG_FILE}
printf "%b" ${1} > ${CFG_FILE}
printf "%b" ${cfg} > ${CFG_FILE}
}
# Stores the keactrl configuration specified as a parameter in the
# configuration file which name has been set in the ${KEACTRL_CFG_FILE}
# variable.
create_keactrl_config() {
local cfg=${1} # Configuration string.
if [ -z ${KEACTRL_CFG_FILE} ]; then
test_lib_error "create_keactrl_config requires KEACTRL_CFG_FILE \
variable be set"
clean_exit 1
elif [ -z "${cfg}" ]; then
test_lib_error "create_keactrl_config requires argument holding a \
configuration"
clean_exit 1
fi
printf "Creating keactrl configuration file: %s.\n" ${KEACTRL_CFG_FILE}
printf "%b" ${1} > ${KEACTRL_CFG_FILE}
printf "%b" ${cfg} > ${KEACTRL_CFG_FILE}
}
# Sets Kea logger to write to the file specified by the global value
# ${LOG_FILE}.
set_logger() {
if [ -z ${LOG_FILE} ]; then
test_lib_error "set_logger requies LOG_FILE variable be set"
clean_exit 1
fi
printf "Kea log will be stored in %s.\n" ${LOG_FILE}
export B10_LOGGER_DESTINATION=${LOG_FILE}
}
# Returns the number of running process pids and the list of pids.
_GET_PIDS= # Return value: holds space separated list of DHCPv6 pids.
_GET_PIDS_NUM= # Return value: holds the number of DHCPv6 server pids.
# Return values:
# _GET_PIDS: holds space separated list of pids.
# _GET_PIDS_NUM: holds the number pids.
get_pids() {
proc_name=${1} # Process name
_GET_PIDS=`ps axwwo pid,command | grep ${proc_name} | grep -v grep | awk '{print $1}'`
_GET_PIDS_NUM=`printf "%s" "${_GET_PIDS}" | wc -w | awk '{print $1}'`
local proc_name=${1} # Process name
if [ -z ${proc_name} ]; then
test_lib_error "get_pids requires process name"
clean_exit 1
fi
_GET_PIDS=$( ps axwwo pid,command | grep ${proc_name} \
| grep -v grep | awk '{print $1}' )
_GET_PIDS_NUM=$( printf "%s" "${_GET_PIDS}" | wc -w | awk '{print $1}' )
}
# Returns the number of occurrences of the Kea log message in the
# log file.
_GET_LOG_MESSAGES=0 # Holds the number of log message occurrences.
# Returns the number of occurrences of the Kea log message in the log file.
# Return value:
# _GET_LOG_MESSAGES: number of log message occurrences.
get_log_messages() {
local msg=${1} # Message id, e.g. DHCP6_SHUTDOWN
if [ -z ${msg} ]; then
test_lib_error "get_log_messages require message identifier"
clean_exit 1
fi
_GET_LOG_MESSAGES=0
# If log file is not present, the number of occurrences is 0.
if [ -s ${LOG_FILE} ]; then
# Grep log file for the logger message occurrences.
_GET_LOG_MESSAGES=`grep -o ${1} ${LOG_FILE} | wc -w`
_GET_LOG_MESSAGES=$( grep -o ${msg} ${LOG_FILE} | wc -w )
# Remove whitespaces.
${_GET_LOG_MESSAGES##*[! ]}
fi
......@@ -124,26 +175,29 @@ get_log_messages() {
# Returns the number of server configurations performed so far. Also
# returns the number of configuration errors.
_GET_RECONFIGS= # Return value: number of configurations so far.
_GET_RECONFIG_ERRORS= # Return value: number of configuration errors.
# Return values:
# _GET_RECONFIGS: number of configurations so far.
# _GET_RECONFIG_ERRORS: number of configuration errors.
get_reconfigs() {
# Grep log file for DHCP6_CONFIG_COMPLETE occurences. There should
# Grep log file for CONFIG_COMPLETE occurences. There should
# be one occurence per (re)configuration.
_GET_RECONFIGS=`grep -o CONFIG_COMPLETE ${LOG_FILE} | wc -w`
# Grep log file for DHCP6_CONFIG_LOAD_FAIL to check for configuration
_GET_RECONFIGS=$( grep -o CONFIG_COMPLETE ${LOG_FILE} | wc -w )
# Grep log file for CONFIG_LOAD_FAIL to check for configuration
# failures.
_GET_RECONFIG_ERRORS=`grep -o CONFIG_LOAD_FAIL ${LOG_FILE} | wc -w`
_GET_RECONFIG_ERRORS=$( grep -o CONFIG_LOAD_FAIL ${LOG_FILE} | wc -w )
# Remove whitespaces
${_GET_RECONFIGS##*[! ]}
${_GET_RECONFIG_ERRORS##*[! ]}
}
# Performs cleanup for a test.
# Performs cleanup after test.
# It shuts down running Kea processes and removes temporary files.
# The location of the log file and the configuration file should be set
# The location of the log file and the configuration files should be set
# in the ${LOG_FILE}, ${CFG_FILE} and ${KEACTRL_CFG_FILE} variables
# recpectively, prior to calling this function.
cleanup() {
# KEA_PROCS holds the name of all Kea processes. Shut down each
# of them if running.
for proc_name in ${KEA_PROCS}
do
get_pids ${proc_name}
......@@ -153,7 +207,6 @@ cleanup() {
printf "Shutting down Kea proccess having pid %d.\n" ${pid}
kill -9 ${pid}
done
shift
done
# Remove temporary files.
rm -rf ${LOG_FILE}
......@@ -166,19 +219,28 @@ cleanup() {
# If a test fails, the Kea log is dumped.
clean_exit() {
exit_code=${1} # Exit code to be returned by the exit function.
case ${exit_code} in
''|*[!0-9]*)
test_lib_error "argument passed to clean_exit must be a number" ;;
esac
# Print test result and perform a cleanup
test_finish ${exit_code}
exit ${exit_code}
}
# Starts Kea process in background using a configuration file specified
# in the global variable ${CFG_FILE}
# in the global variable ${CFG_FILE}.
start_kea() {
printf "Running command %s.\n" "\"${BIN_PATH}/${BIN} -c ${CFG_FILE}\""
${BIN_PATH}/$BIN -c ${CFG_FILE} &
bin=${1}
if [ -z ${bin} ]; then
test_lib_error "binary name must be specified for start_kea"
clean_exit 1
fi
printf "Running command %s.\n" "\"${bin} -c ${CFG_FILE}\""
${bin} -c ${CFG_FILE} &
}
# Waits for Kea to startup with timeout.
# Waits with timeout for Kea to start.
# This function repeatedly checs if the Kea log file has been created
# and is non-empty. If it is, the function assumes that Kea has started.
# It doesn't check the contents of the log file though.
......@@ -186,15 +248,21 @@ start_kea() {
# checks again. This is repeated until timeout is reached or non-empty
# log file is found. If timeout is reached, the function reports an
# error.
_WAIT_FOR_KEA=0 # Return value: Holds 0 if Kea hasn't started, 1 otherwise
# Return value:
# _WAIT_FOR_KEA: 0 if Kea hasn't started, 1 otherwise
wait_for_kea() {
timeout=${1} # Desired timeout in seconds.
loops=0 # Loops counter
local timeout=${1} # Desired timeout in seconds.
case ${timeout} in
''|*[!0-9]*)
test_lib_error "argument passed to wait_for_kea must be a number"
clean_exit 1 ;;
esac
local loops=0 # Loops counter
_WAIT_FOR_KEA=0
while [ ! -s ${LOG_FILE} ] && [ ${loops} -le ${timeout} ]; do
printf "."
sleep 1
loops=`expr $loops + 1`
loops=$( expr $loops + 1 )
done
printf "\n"
if [ ${loops} -le ${timeout} ]; then
......@@ -211,27 +279,50 @@ wait_for_kea() {
# This function waits a specified number of seconds for the number
# of message occurrences to show up. If the expected number of
# message doesn't occur, the error status is returned.
_WAIT_FOR_MESSAGE=0 # Return value: holds 0 if the message hasn't occured,
# 1 otherwise.