#!/bin/bash
# This file is part of the rsyslog project, released under ASL 2.0
# Verify successful omdtls-to-imdtls transfer with certificate validation. The
# receiver must record the exact injected message sequence.
. ${srcdir:=.}/diag.sh init
export RSTB_IMDIAG_INJECT_DELAY_MODE=full
printf 'using TLS driver: %s\n' ${RS_TLS_DRIVER:=gtls}
export NUMMESSAGES=1000
export NUMMESSAGESFULL=$NUMMESSAGES
export QUEUE_EMPTY_CHECK_FUNC=wait_file_lines

# uncomment for debugging support:
#export RSYSLOG_DEBUG="debug nostdout noprintmutexaction"
export RSYSLOG_DEBUGLOG="$RSYSLOG_DYNNAME.receiver.debuglog"
generate_conf
PORT_RCVR_FILE="$RSYSLOG_DYNNAME.imdtls.port"

add_conf '
global(
	defaultNetstreamDriverCAFile="'$srcdir/testsuites/x.509/ca.pem'"
	defaultNetstreamDriverCertFile="'$srcdir/testsuites/x.509/client-cert.pem'"
	defaultNetstreamDriverKeyFile="'$srcdir/testsuites/x.509/client-key.pem'"
#	debug.whitelist="on"
#	debug.files=["imdtls.c", "modules.c", "errmsg.c", "action.c"]
)

module(	load="../plugins/imdtls/.libs/imdtls" )
input(	type="imdtls"
	port="0"
	listenPortFileName="'$PORT_RCVR_FILE'")

template(name="outfmt" type="string" string="%msg:F,58:2%\n")
:msg, contains, "msgnum:" action(type="omfile" template="outfmt" file="'$RSYSLOG_OUT_LOG'")
'
startup
assign_file_content PORT_RCVR "$PORT_RCVR_FILE"

export RSYSLOG_DEBUGLOG="$RSYSLOG_DYNNAME.sender.debuglog"
#valgrind="valgrind"
generate_conf 2
add_conf '
global(
	defaultNetstreamDriverCAFile="'$srcdir/testsuites/x.509/ca.pem'"
	defaultNetstreamDriverCertFile="'$srcdir/testsuites/x.509/client-cert.pem'"
	defaultNetstreamDriverKeyFile="'$srcdir/testsuites/x.509/client-key.pem'"
#	debug.whitelist="on"
#	debug.files=["omdtls.c", "modules.c", "errmsg.c", "action.c"]
)

# impstats in order to gain insight into error cases
module(load="../plugins/impstats/.libs/impstats"
	log.file="'$RSYSLOG_DYNNAME.pstats'"
	interval="1" log.syslog="off")

# Load modules
module(	load="../plugins/omdtls/.libs/omdtls" )

local4.* {
	action(	name="omdtls"
	type="omdtls"
	target="127.0.0.1"
	port="'$PORT_RCVR'"
	action.resumeInterval="1"
	action.resumeRetryCount="2"
	queue.type="FixedArray"
	queue.size="10000"
	queue.dequeueBatchSize="1"
	queue.minDequeueBatchSize.timeout="1000" # 1 sec
	queue.timeoutWorkerthreadShutdown="1000" # 1 sec
	queue.timeoutshutdown="1000"
	# Slow down, do not lose UDP messages
	queue.dequeueSlowDown="1000"
	)

#	action( type="omfile" file="'$RSYSLOG_OUT_LOG'")
	stop
}

action( type="omfile" file="'$RSYSLOG_DYNNAME.othermsg'")
' 2
startup 2

# now inject the messages into instance 2. It will connect to instance 1,
# and that instance will record the data.
injectmsg2

# shut down sender when everything is sent, receiver continues to run concurrently
shutdown_when_empty 2
wait_shutdown 2
# now it is time to stop the receiver as well
shutdown_when_empty
wait_shutdown

seq_check
exit_test
