xref: /kvm-unit-tests/scripts/arch-run.bash (revision 8727c886ea810b31be4553bae8a19e0a923fc0a0)
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{
29*8727c886SAndrew Jones	local stdout errors ret sig tty
30b2a2aa5dSAndrew Jones
31f0ca153cSRadim Krčmář	# stdout to {stdout}, stderr to $errors and stderr
32*8727c886SAndrew Jones	tty=$(stty -g)
33b2a2aa5dSAndrew Jones	exec {stdout}>&1
34f0ca153cSRadim Krčmář	errors=$("${@}" 2> >(tee /dev/stderr) > /dev/fd/$stdout)
35b2a2aa5dSAndrew Jones	ret=$?
36b2a2aa5dSAndrew Jones	exec {stdout}>&-
37*8727c886SAndrew Jones	stty "$tty"
38*8727c886SAndrew Jones
39*8727c886SAndrew Jones	[ $ret -eq 134 ] && echo "QEMU Aborted" >&2
40b2a2aa5dSAndrew Jones
41b2a2aa5dSAndrew Jones	if [ "$errors" ]; then
42b2a2aa5dSAndrew Jones		sig=$(grep 'terminating on signal' <<<"$errors")
43b2a2aa5dSAndrew Jones		if [ "$sig" ]; then
44b2a2aa5dSAndrew Jones			sig=$(sed 's/.*terminating on signal \([0-9][0-9]*\).*/\1/' <<<"$sig")
45b2a2aa5dSAndrew Jones		fi
46b2a2aa5dSAndrew Jones	fi
47b2a2aa5dSAndrew Jones
48b2a2aa5dSAndrew Jones	if [ $ret -eq 0 ]; then
49b2a2aa5dSAndrew Jones		# Some signals result in a zero return status, but the
50b2a2aa5dSAndrew Jones		# error log tells the truth.
51b2a2aa5dSAndrew Jones		if [ "$sig" ]; then
52b2a2aa5dSAndrew Jones			((ret=sig+128))
53b2a2aa5dSAndrew Jones		else
54b2a2aa5dSAndrew Jones			# Exiting with zero (non-debugexit) is an error
55b2a2aa5dSAndrew Jones			ret=1
56b2a2aa5dSAndrew Jones		fi
57b2a2aa5dSAndrew Jones	elif [ $ret -eq 1 ]; then
58b2a2aa5dSAndrew Jones		# Even when ret==1 (unittest success) if we also got stderr
59b2a2aa5dSAndrew Jones		# logs, then we assume a QEMU failure. Otherwise we translate
60b2a2aa5dSAndrew Jones		# status of 1 to 0 (SUCCESS)
61a51bab13SRadim Krčmář		if [ -z "$(echo "$errors" | grep -vi warning)" ]; then
62b2a2aa5dSAndrew Jones			ret=0
63b2a2aa5dSAndrew Jones		fi
64b2a2aa5dSAndrew Jones	fi
65b2a2aa5dSAndrew Jones
66b2a2aa5dSAndrew Jones	return $ret
67b2a2aa5dSAndrew Jones}
68fd149358SAndrew Jones
69fd149358SAndrew Jonestimeout_cmd ()
70fd149358SAndrew Jones{
71fd149358SAndrew Jones	if [ "$TIMEOUT" ] && [ "$TIMEOUT" != "0" ]; then
72fd149358SAndrew Jones		echo "timeout -k 1s --foreground $TIMEOUT"
73fd149358SAndrew Jones	fi
74fd149358SAndrew Jones}
75