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