test-many-klibcs: Build and run (some) klibc self-test programs

Only run self-test programs that don't require any input and have
clear success/failure reporting.  We can enable more later.
diff --git a/test-many-klibcs b/test-many-klibcs
index 633e254..0c22452 100755
--- a/test-many-klibcs
+++ b/test-many-klibcs
@@ -8,7 +8,7 @@
     rm -rf ../linux/usr/include || return
     make -C ../linux "ARCH=$kernelarch" headers_install || return
     echo "I: Building with ARCH=$arch CROSS_COMPILE=$gnuarch- $makeflags"
-    make -C ../klibc all "ARCH=$arch" "CROSS_COMPILE=$gnuarch-" $makeflags \
+    make -C ../klibc all test "ARCH=$arch" "CROSS_COMPILE=$gnuarch-" $makeflags \
     || return
 }
 
@@ -17,12 +17,69 @@
     make -C ../klibc clean "ARCH=$arch"
 }
 
+run_test_program() {
+    local progname="$1"
+    shift
+    local logname="test-$gnuarch-$progname.log"
+
+    if "qemu-$qemuarch-static" ../klibc/usr/klibc/tests/"$progname" \
+	 > "$logname"; then
+	if grep -qw ERROR "$logname"; then
+	    echo "E: $progname: Error found in output"
+	    return 1
+	fi
+	while [ $# -ge 1 ]; do
+	    if ! grep -qF -- "$1" "$logname"; then
+		echo "E: $progname: Expected text '$1' not found in output"
+		return 1
+	    fi
+	    shift
+	done
+	echo "I: $progname: pass"
+    else
+	echo "E: $progname: fail"
+	return 1
+    fi
+}
+
+run_shell() {
+    local command="$1"
+
+    if "qemu-$qemuarch-static" ../klibc/usr/dash/sh -c "$command"; then
+	echo "I: shell '$command': pass"
+    else
+	echo "E: shell '$command': fail"
+	return 1
+    fi
+}
+
 run_tests() {
-    echo "I: Testing statically linked shell running builtin command"
-    "qemu-$qemuarch-static" ../klibc/usr/dash/sh -c "exit" || return
-    echo "I: Testing statically linked shell running external command"
-    "qemu-$qemuarch-static" ../klibc/usr/dash/sh -c "../klibc/usr/utils/static/true; exit" || return
-    # TODO: build a chroot environment and run with shared library
+    local err=0
+
+    run_test_program microhello || err=1
+    run_test_program minihello || err=1
+    run_test_program hello || err=1
+    run_test_program environ 'Verifying envp == environ... ok' || err=1
+    run_test_program fcntl || err=1
+    run_test_program malloctest || err=1
+    run_test_program malloctest2 || err=1
+    run_test_program opentest "Line 1 = $(head -1 /etc/passwd)" || err=1
+    run_test_program pipetest || err=1
+    run_test_program select || err=1
+    run_test_program setjmptest \
+	"calling longjmp with 256... setjmp returned 256" || err=1
+    run_test_program sigint "Signal received OK" || err=1
+    run_test_program socket || err=1
+    run_test_program sscanf || err=1
+    run_test_program stdio "Hello, World!" \
+        "Hello again - and some more - and some more" || err=1
+    run_test_program strlcpycat || err=1
+    run_test_program vfork || err=1
+
+    run_shell "exit" || err=1
+    run_shell "../klibc/usr/utils/static/true; exit" || err=1
+
+    return $err
 }
 
 process() {