diff mbox

[kvm-unit-tests,12/14] scripts: add exit code snooper

Message ID 1438612891-3718-13-git-send-email-drjones@redhat.com
State Superseded, archived
Headers show

Commit Message

Andrew Jones Aug. 3, 2015, 2:41 p.m. UTC
Add a function that reads test output streams and just forwards it
on to stdout, except when a line is 'EXIT: STATUS=%d', at which
point it grabs the status to use as the exit code. Tests that
always exit with zero (due to how they inform QEMU to quit), can
now return other status codes. Run with

. scripts/functions.bash
$test_cmdline | snoop_exitcode

The unit test must call print_exit_line(code) before invoking
its method to quit QEMU. For arm and powerpc, we just add the
print_exit_line calls to their exit() functions right now.

Signed-off-by: Andrew Jones <drjones@redhat.com>
---
 configure              |  5 ++++-
 lib/arm/io.c           |  1 +
 lib/libcflat.h         |  3 +++
 lib/powerpc/io.c       |  1 +
 scripts/functions.bash | 11 +++++++++++
 5 files changed, 20 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/configure b/configure
index b2ad199da7873..e1f70bd79d4f7 100755
--- a/configure
+++ b/configure
@@ -10,6 +10,7 @@  ar=ar
 arch=`uname -m | sed -e s/i.86/i386/ | sed -e 's/arm.*/arm/'`
 host=$arch
 cross_prefix=
+snooper=
 
 usage() {
     cat <<-EOF
@@ -81,8 +82,9 @@  if [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then
     testdir=x86
 elif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
     testdir=arm
-elif [ "$arch" = "ppc64" ]; then
+elif [ "$arch" = "powerpc" ] || [ "$arch" = "ppc64" ]; then
     testdir=powerpc
+    snooper=snoop_exitcode
 else
     testdir=$arch
 fi
@@ -137,4 +139,5 @@  OBJDUMP=$cross_prefix$objdump
 AR=$cross_prefix$ar
 API=$api
 TEST_DIR=$testdir
+SNOOPER="$snooper"
 EOF
diff --git a/lib/arm/io.c b/lib/arm/io.c
index a08d394e4aa1c..487071d2edcd3 100644
--- a/lib/arm/io.c
+++ b/lib/arm/io.c
@@ -78,6 +78,7 @@  void puts(const char *s)
 
 void exit(int code)
 {
+	print_exit_line(code);
 	chr_testdev_exit(code);
 	halt(code);
 }
diff --git a/lib/libcflat.h b/lib/libcflat.h
index 8411f6c5d92e3..c3d90a0af831a 100644
--- a/lib/libcflat.h
+++ b/lib/libcflat.h
@@ -77,4 +77,7 @@  do {									\
 		abort();						\
 } while (0)
 
+#define print_exit_line(code) \
+	printf("\nEXIT: STATUS=%d\n", ((code) << 1) | 1)
+
 #endif
diff --git a/lib/powerpc/io.c b/lib/powerpc/io.c
index 25cdd0ad961ee..b68d33b9ef740 100644
--- a/lib/powerpc/io.c
+++ b/lib/powerpc/io.c
@@ -29,6 +29,7 @@  void puts(const char *s)
 
 void exit(int code)
 {
+	print_exit_line(code);
 	rtas_power_off();
 	halt(code);
 }
diff --git a/scripts/functions.bash b/scripts/functions.bash
index 7ed5a517250bc..7b4a5e4e63c9b 100644
--- a/scripts/functions.bash
+++ b/scripts/functions.bash
@@ -40,3 +40,14 @@  function for_each_unittest()
 	"$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check"
 	exec {fd}<&-
 }
+
+function snoop_exitcode()
+{
+	while read line; do
+		if [[ $line =~ ^EXIT:\ STATUS=(.*)$ ]]; then
+			code=${BASH_REMATCH[1]}
+		fi
+		echo $line
+	done
+	exit $code
+}