#!/usr/bin/env bash

: ${LABWC_RUNS:=1}
: ${LABWC_LEAK_TEST:=0}
: ${LABWC_EXPECT_RETURNCODE:=0}
: ${LABWC_VERBOSE:=0}

if ! test -x "$1/labwc"; then
	echo "$1/labwc not found"
	exit 1
fi

args=(
	"$1/labwc"
	-C scripts/ci
	-d
)

export XDG_RUNTIME_DIR=$(mktemp -d)
export WLR_BACKENDS=headless

gdb_run() {
	# Not using -Db_sanitize=address,undefined
	# because it slows down the usual execution
	# way too much and spams pages over pages
	# of irrelevant memory-still-in-use logs
	# for external libraries.
	#
	# Not using coredumps either because they
	# are a pain to setup on GH actions and
	# just running labwc again is a lot faster
	# anyway.

	gdb --batch                       \
		--return-child-result     \
		-ex run                   \
		-ex 'bt full'             \
		-ex 'echo \n'             \
		-ex 'echo "Local vars:\n' \
		-ex 'info locals'         \
		-ex 'echo \n'             \
		-ex 'set listsize 50'     \
		-ex list                  \
		--args "${args[@]}"
	return $?
}

echo "Running with LABWC_RUNS=$LABWC_RUNS"

if test "$LABWC_LEAK_TEST" != "0"; then
	LSAN_OPTIONS=suppressions=scripts/asan_leak_suppressions "${args[@]}"
	exit $?
fi

ret=0
for((i=1; i<=LABWC_RUNS; i++)); do
	printf "Starting run %2s\n" $i
	output=$(gdb_run 2>&1)
	ret=$?
	if test $ret -ne $LABWC_EXPECT_RETURNCODE; then
		echo "Crash encountered:"
		echo "------------------"
		echo "$output"
		break
	elif test $LABWC_VERBOSE -eq 1; then
		echo "------------------"
		echo "$output"
	fi
done

echo "labwc terminated with return code $ret"
if test $ret -eq $LABWC_EXPECT_RETURNCODE; then
	exit 0;
else
	exit 1;
fi
