#!/bin/sh

# We don't do that here
exec 2> /dev/null

# Initialization inspired by dlog_test.in, TODO: unify somehow
if [ $# -ne 1 ]; then
	echo "usage: $0 pipe|logger"
	exit 1
fi

if [ "$1" = "pipe" ]; then
	type="pipe"
elif [ "$1" = "logger" ]; then
	type="logger"

	# Make sure the newly launched daemon ignores old logs
	touch /run/dlog/first_time
else
	echo "usage: $0 pipe|logger"
	exit 1
fi

NEEDS_TO_QUIT=0
capsh --print | grep Current | grep cap_syslog > /dev/null || { echo "*** ERROR: cap_syslog missing"; NEEDS_TO_QUIT=1; }
mount | grep ' / ' | grep rw > /dev/null || { echo "*** ERROR: root not mounted read-write"; NEEDS_TO_QUIT=1; }
[ $NEEDS_TO_QUIT -eq 0 ] || exit 1

export DLOG_CONFIG_PATH="/usr/share/dlog-$type.conf.cpu"
PATH=$PATH:/usr/libexec/libdlog/

LOGGER=-1
TEST=-1
RUNTIME_FILTERS_DIR="/tmp/dlog-filters/"
WRITER_DIR="/tmp/dlog-writers/"

cleanup() {
	[ $LOGGER -ne -1 ] && kill $LOGGER > /dev/null 2>&1
	[ $TEST -ne -1 ] && kill $TEST > /dev/null 2>&1
	[ -d $RUNTIME_FILTERS_DIR ] && rm -rf $RUNTIME_FILTERS_DIR
	[ -d $WRITER_DIR ] && rm -rf $WRITER_DIR
}
trap cleanup 0

mkdir -p "$RUNTIME_FILTERS_DIR"
mkdir -p "$WRITER_DIR"

# TODO: 2>&1 is a hack, but I don't see any other solution
for LENGTH in 10 500; do
	sleep 1
	echo "LOG LATENCY ($LENGTH characters):"
	echo
	MESSAGE=$(printf '%0.s&' $(seq 1 $LENGTH)) # Print the '&' character $LENGTH times

	kill $LOGGER
	sleep 1
	dlog_logger &
	LOGGER=$!
	sleep 1
	/usr/libexec/libdlog/dlog_stdout_benchmark 0 100000 $MESSAGE libdlog 2>&1 &
	TEST=$!
	sleep 1
	echo "cpu usage of logger:"
	ps --no-headers --quick-pid $LOGGER --format %cpu
	echo "cpu usage of client:"
	ps --no-headers --quick-pid $TEST --format %cpu
	wait $TEST
	echo

	kill $LOGGER
	sleep 1
	dlog_logger &
	LOGGER=$!
	sleep 1
	dlog_redirect_stdout --outtag "DLOG_BENCHMARK" --nofallback -- /usr/libexec/libdlog/dlog_stdout_benchmark 0 100000 $MESSAGE stdout 2>&1 &
	TEST=$!
	sleep 1
	echo "cpu usage of logger:"
	ps --no-headers --quick-pid $LOGGER --format %cpu
	echo "cpu usage of client:"
	ps --no-headers --quick-pid $TEST --format %cpu
	wait $TEST
	echo

	kill $LOGGER
	sleep 1
	dlog_logger &
	LOGGER=$!
	sleep 1
	dlog_redirect_stdout --outtag "DLOG_BENCHMARK" --nofallback -- /usr/libexec/libdlog/dlog_stdout_benchmark 1 100000 $MESSAGE stdout 2>&1 &
	TEST=$!
	sleep 1
	echo "cpu usage of logger:"
	ps --no-headers --quick-pid $LOGGER --format %cpu
	echo "cpu usage of client:"
	ps --no-headers --quick-pid $TEST --format %cpu
	wait $TEST
	echo
done
