xref: /kvm-unit-tests/scripts/arch-run.bash (revision f0ca153cc2d1e6a670b3571a8ac24c2ef7042594)
1b2a2aa5dSAndrew Jones##############################################################################
2b2a2aa5dSAndrew Jones# run_qemu translates the ambiguous exit status in Table1 to that in Table2.
3b2a2aa5dSAndrew Jones# Table3 simply documents the complete status table.
4b2a2aa5dSAndrew Jones#
5b2a2aa5dSAndrew Jones# Table1: Before fixup
6b2a2aa5dSAndrew Jones# --------------------
7b2a2aa5dSAndrew Jones# 0      - Unexpected exit from QEMU (possible signal), or the unittest did
8b2a2aa5dSAndrew Jones#          not use debug-exit
9b2a2aa5dSAndrew Jones# 1      - most likely unittest succeeded, or QEMU failed
10b2a2aa5dSAndrew Jones#
11b2a2aa5dSAndrew Jones# Table2: After fixup
12b2a2aa5dSAndrew Jones# -------------------
13b2a2aa5dSAndrew Jones# 0      - Everything succeeded
14b2a2aa5dSAndrew Jones# 1      - most likely QEMU failed
15b2a2aa5dSAndrew Jones#
16b2a2aa5dSAndrew Jones# Table3: Complete table
17b2a2aa5dSAndrew Jones# ----------------------
18b2a2aa5dSAndrew Jones# 0      - SUCCESS
19b2a2aa5dSAndrew Jones# 1      - most likely QEMU failed
20b2a2aa5dSAndrew Jones# 2      - most likely a run script failed
21b2a2aa5dSAndrew Jones# 3      - most likely the unittest failed
22fd149358SAndrew Jones# 124    - most likely the unittest timed out
23b2a2aa5dSAndrew Jones# 127    - most likely the unittest called abort()
24b2a2aa5dSAndrew Jones# 1..127 - FAILURE (could be QEMU, a run script, or the unittest)
25b2a2aa5dSAndrew Jones# >= 128 - Signal (signum = status - 128)
26b2a2aa5dSAndrew Jones##############################################################################
27b2a2aa5dSAndrew Jonesrun_qemu ()
28b2a2aa5dSAndrew Jones{
29b2a2aa5dSAndrew Jones	local stdout errors ret sig
30b2a2aa5dSAndrew Jones
31*f0ca153cSRadim Krčmář	# stdout to {stdout}, stderr to $errors and stderr
32b2a2aa5dSAndrew Jones	exec {stdout}>&1
33*f0ca153cSRadim Krčmář	errors=$("${@}" 2> >(tee /dev/stderr) > /dev/fd/$stdout)
34b2a2aa5dSAndrew Jones	ret=$?
35b2a2aa5dSAndrew Jones	exec {stdout}>&-
36b2a2aa5dSAndrew Jones
37b2a2aa5dSAndrew Jones	if [ "$errors" ]; then
38b2a2aa5dSAndrew Jones		sig=$(grep 'terminating on signal' <<<"$errors")
39b2a2aa5dSAndrew Jones		if [ "$sig" ]; then
40b2a2aa5dSAndrew Jones			sig=$(sed 's/.*terminating on signal \([0-9][0-9]*\).*/\1/' <<<"$sig")
41b2a2aa5dSAndrew Jones		fi
42b2a2aa5dSAndrew Jones	fi
43b2a2aa5dSAndrew Jones
44b2a2aa5dSAndrew Jones	if [ $ret -eq 0 ]; then
45b2a2aa5dSAndrew Jones		# Some signals result in a zero return status, but the
46b2a2aa5dSAndrew Jones		# error log tells the truth.
47b2a2aa5dSAndrew Jones		if [ "$sig" ]; then
48b2a2aa5dSAndrew Jones			((ret=sig+128))
49b2a2aa5dSAndrew Jones		else
50b2a2aa5dSAndrew Jones			# Exiting with zero (non-debugexit) is an error
51b2a2aa5dSAndrew Jones			ret=1
52b2a2aa5dSAndrew Jones		fi
53b2a2aa5dSAndrew Jones	elif [ $ret -eq 1 ]; then
54b2a2aa5dSAndrew Jones		# Even when ret==1 (unittest success) if we also got stderr
55b2a2aa5dSAndrew Jones		# logs, then we assume a QEMU failure. Otherwise we translate
56b2a2aa5dSAndrew Jones		# status of 1 to 0 (SUCCESS)
57a51bab13SRadim Krčmář		if [ -z "$(echo "$errors" | grep -vi warning)" ]; then
58b2a2aa5dSAndrew Jones			ret=0
59b2a2aa5dSAndrew Jones		fi
60b2a2aa5dSAndrew Jones	fi
61b2a2aa5dSAndrew Jones
62b2a2aa5dSAndrew Jones	return $ret
63b2a2aa5dSAndrew Jones}
64fd149358SAndrew Jones
65fd149358SAndrew Jonestimeout_cmd ()
66fd149358SAndrew Jones{
67fd149358SAndrew Jones	if [ "$TIMEOUT" ] && [ "$TIMEOUT" != "0" ]; then
68fd149358SAndrew Jones		echo "timeout -k 1s --foreground $TIMEOUT"
69fd149358SAndrew Jones	fi
70fd149358SAndrew Jones}
71