#!/bin/bash

# Script to run all U-Boot tests that use sandbox.
#  $1: tests to run (empty for all, 'quick' for quick ones only)

# Runs a test and checks the exit code to decide if it passed
#  $1:         Test name
#  $2 onwards: command line to run
run_test() {
	echo -n "$1: "
	shift
	"$@"
	[ $? -ne 0 ] && failures=$((failures+1))
}

# Select test attributes
ut_mark_expr=test_ut
if [ "$1" = "quick" ]; then
	mark_expr="not slow"
	ut_mark_expr="test_ut and not slow"
	skip=--skip-net-tests
fi

[ "$1" == "tools" ] && tools_only=y

if [ "$1" = "parallel" ]; then
	if ! echo 'import xdist' | python3 2>/dev/null; then
		echo "Please install python3-pytest-xdist - see doc/develop/py_testing.rst"
		exit 1
	fi
	jobs="$(($(nproc) > 16 ? 16 : $(nproc)))"
	para="-n${jobs} -q"
	prompt="Building and..."
	skip=--skip-net-tests
	mark_expr="not slow and not bootstd and not spi_flash"
	ut_mark_expr="test_ut and not slow and not bootstd and not spi_flash"
	echo "Note: test log is garbled with parallel tests"
fi

failures=0

if [ -z "$tools_only" ]; then
	# Run all tests that the standard sandbox build can support
	echo "${prompt}"
	run_test "sandbox" ./test/py/test.py --bd sandbox --build ${para} \
		-k "${mark_expr}"
fi

# Run tests which require sandbox_spl
echo "${prompt}"
run_test "sandbox_spl" ./test/py/test.py --bd sandbox_spl --build ${para} \
		-k 'test_ofplatdata or test_handoff or test_spl'

# Run the same tests with sandbox_noinst (i.e. without OF_PLATDATA_INST)
echo "${prompt}"
run_test "sandbox_noinst" ./test/py/test.py --bd sandbox_noinst --build ${para} \
		-k 'test_ofplatdata or test_handoff or test_spl'

if [ -z "$tools_only" ]; then
	# Run tests for the flat-device-tree version of sandbox. This is a special
	# build which does not enable CONFIG_OF_LIVE for the live device tree, so we can
	# check that functionality is the same. The standard sandbox build (above) uses
	# CONFIG_OF_LIVE.
	echo "${prompt}"
	run_test "sandbox_flattree" ./test/py/test.py --bd sandbox_flattree \
		${para} --build -k "${ut_mark_expr}"
fi

# Set up a path to dtc (device-tree compiler) and libfdt.py, a library it
# provides and which is built by the sandbox_spl config. Also set up the path
# to tools build by the build.
DTC_DIR=build-sandbox_spl/scripts/dtc
export PYTHONPATH=${DTC_DIR}/pylibfdt
export DTC=${DTC_DIR}/dtc
TOOLS_DIR=build-sandbox_spl/tools

run_test "binman" ./tools/binman/binman --toolpath ${TOOLS_DIR} test
run_test "patman" ./tools/patman/patman test
run_test "u_boot_pylib" ./tools/u_boot_pylib/u_boot_pylib

run_test "buildman" ./tools/buildman/buildman -t ${skip}
run_test "fdt" ./tools/dtoc/test_fdt -t
run_test "dtoc" ./tools/dtoc/dtoc -t

# This needs you to set up Python test coverage tools.
# To enable Python test coverage on Debian-type distributions (e.g. Ubuntu):
#   $ sudo apt-get install python-pytest python-coverage

# Code-coverage tests cannot run in parallel, so skip them in that case
if [ -z "${para}" ]; then
	export PATH=$PATH:${TOOLS_DIR}
	run_test "binman code coverage" ./tools/binman/binman test -T
	run_test "dtoc code coverage" ./tools/dtoc/dtoc -T
	run_test "fdt code coverage" ./tools/dtoc/test_fdt -T
fi

if [ $failures == 0 ]; then
	echo "Tests passed!"
else
	echo "Tests FAILED"
	exit 1
fi
