Only print out '.' for each test case, full test output can be re-enabled with VIR_TEST_VERBOSE=1, or VIR_TEST_DEBUG=XXXX Sample output now looks like TEST: statstest ........................................ 40 ................................... 75 OK PASS: statstest TEST: qparamtest ................................ 32 OK PASS: qparamtest TEST: ............ 12 OK --- tests/capabilityschematest | 5 ++- tests/daemon-conf | 27 ++++++---- tests/domainschematest | 5 ++- tests/esxutilstest.c | 2 +- tests/eventtest.c | 78 ++++++++++++++--------------- tests/interfaceschematest | 5 ++- tests/networkschematest | 5 ++- tests/nodedevschematest | 5 ++- tests/schematestutils.sh | 20 ++++---- tests/statstest.c | 4 +- tests/storagepoolschematest | 5 ++- tests/storagevolschematest | 5 ++- tests/test-lib.sh | 64 +++++++++++++++++++++++ tests/test_conf.sh | 23 +++------ tests/testutils.c | 117 +++++++++++++++++++++++++++++++++---------- tests/testutils.h | 4 +- tests/testutilsqemu.c | 2 +- tests/virsh-all | 25 ++++++--- 18 files changed, 277 insertions(+), 124 deletions(-) diff --git a/tests/capabilityschematest b/tests/capabilityschematest index 3a1acc5..e32f85d 100755 --- a/tests/capabilityschematest +++ b/tests/capabilityschematest @@ -1,6 +1,9 @@ #!/bin/sh -. ./schematestutils.sh +test -z "$srcdir" && srcdir=$(pwd) + +. "$srcdir/test-lib.sh" +. "$abs_srcdir/schematestutils.sh" DIRS="capabilityschemadata xencapsdata" SCHEMA="capability.rng" diff --git a/tests/daemon-conf b/tests/daemon-conf index 722fe4e..1eb4be1 100755 --- a/tests/daemon-conf +++ b/tests/daemon-conf @@ -2,15 +2,14 @@ # Get coverage of libvirtd's config-parsing code. test -z "$srcdir" && srcdir=$(pwd) -test -z "$abs_top_srcdir" && abs_top_srcdir=$(pwd)/.. -test -z "$abs_top_builddir" && abs_top_builddir=$(pwd)/.. +LC_ALL=C +. "$srcdir/test-lib.sh" -if test "$VERBOSE" = yes; then - set -x +if test "$verbose" = yes; then $abs_top_builddir/daemon/libvirtd --version fi -. "$srcdir/test-lib.sh" +test_intro "$this_test" test -z "$CONFIG_HEADER" && CONFIG_HEADER="$abs_top_builddir/config.h" @@ -30,10 +29,12 @@ sed -n 's/^#\([^ #]\)/\1/p' "$conf" > tmp.conf # time and running libvirtd with the resulting config. Each libvirtd # invocation must fail. n=$(wc -l < tmp.conf) -i=1 +i=0 +fail=0 while :; do + i=$(expr $i + 1) + param_name=$(sed -n "$i"'s/ = .*//p' tmp.conf) - printf "testing with corrupted config: $param_name\n" 1>&2 rhs=$(sed -n "$i"'s/.* = \(.*\)/\1/p' tmp.conf) f=in$i.conf case $rhs in @@ -59,9 +60,8 @@ while :; do # Check that the diagnostic we want appears grep "$msg" err 1>/dev/null 2>&1 RET=$? + test_result $i "corrupted config $param_name" $RET test "$RET" = "0" || fail=1 - - i=$(expr $i + 1) done # Run with the unmodified config file. @@ -76,13 +76,18 @@ sed 's,^log_outputs.*,log_outputs="3:file:'"$(pwd)/log"'",' tmp.conf > k \ || fail=1 mv k tmp.conf || fail=1 -printf "running libvirtd with a valid config file ($sleep_secs seconds)\n" 1>&2 $abs_top_builddir/daemon/libvirtd --pid-file=pid-file --config=tmp.conf > log 2>&1 & pid=$! sleep $sleep_secs kill $pid +RET=0 # Expect an orderly shut-down and successful exit. -wait $pid || fail=1 +wait $pid || RET=1 + +test_result $i "valid config file (sleeping $sleep_secs seconds)" $RET +test $RET = 0 || fail=1 + +test_final $i $fail # "cat log" would print this for non-root: # Cannot set group when not running as root diff --git a/tests/domainschematest b/tests/domainschematest index 28ee69a..41a5f47 100755 --- a/tests/domainschematest +++ b/tests/domainschematest @@ -1,6 +1,9 @@ #!/bin/sh -. ./schematestutils.sh +test -z "$srcdir" && srcdir=$(pwd) + +. "$srcdir/test-lib.sh" +. "$abs_srcdir/schematestutils.sh" DIRS="domainschemadata qemuxml2argvdata sexpr2xmldata xmconfigdata xml2sexprdata" SCHEMA="domain.rng" diff --git a/tests/esxutilstest.c b/tests/esxutilstest.c index 058280d..f73df48 100644 --- a/tests/esxutilstest.c +++ b/tests/esxutilstest.c @@ -75,7 +75,7 @@ testDiskNameToIndex(const void *data ATTRIBUTE_UNUSED) k = virDiskNameToIndex(name); if (k != i) { - if (virtTestGetDebug() > 0) { + if (virTestGetDebug() > 0) { fprintf(stderr, "\nExpect [%d]\n", i); fprintf(stderr, "Actual [%d]\n", k); } diff --git a/tests/eventtest.c b/tests/eventtest.c index 90c60bb..067e365 100644 --- a/tests/eventtest.c +++ b/tests/eventtest.c @@ -139,7 +139,7 @@ static void *eventThreadLoop(void *data ATTRIBUTE_UNUSED) { static int -verifyFired(int handle, int timer) +verifyFired(const char *name, int handle, int timer) { int handleFired = 0; int timerFired = 0; @@ -147,25 +147,25 @@ verifyFired(int handle, int timer) for (i = 0 ; i < NUM_FDS ; i++) { if (handles[i].fired) { if (i != handle) { - fprintf(stderr, "FAIL Handle %d fired, but expected %d\n", i, handle); + virtTestResult(name, 1, "Handle %d fired, but expected %d\n", i, handle); return EXIT_FAILURE; } else { if (handles[i].error != EV_ERROR_NONE) { - fprintf(stderr, "FAIL Handle %d fired, but had error %d\n", i, - handles[i].error); + virtTestResult(name, 1, "Handle %d fired, but had error %d\n", i, + handles[i].error); return EXIT_FAILURE; } handleFired = 1; } } else { if (i == handle) { - fprintf(stderr, "FAIL Handle %d should have fired, but didn't\n", handle); + virtTestResult(name, 1, "Handle %d should have fired, but didn't\n", handle); return EXIT_FAILURE; } } } if (handleFired != 1 && handle != -1) { - fprintf(stderr, "FAIL Something wierd happened, expecting handle %d\n", handle); + virtTestResult(name, 1, "Something wierd happened, expecting handle %d\n", handle); return EXIT_FAILURE; } @@ -173,34 +173,33 @@ verifyFired(int handle, int timer) for (i = 0 ; i < NUM_TIME ; i++) { if (timers[i].fired) { if (i != timer) { - fprintf(stderr, "FAIL Timer %d fired, but expected %d\n", i, timer); + virtTestResult(name, 1, "Timer %d fired, but expected %d\n", i, timer); return EXIT_FAILURE; } else { if (timers[i].error != EV_ERROR_NONE) { - fprintf(stderr, "FAIL Timer %d fired, but had error %d\n", i, - timers[i].error); + virtTestResult(name, 1, "Timer %d fired, but had error %d\n", i, + timers[i].error); return EXIT_FAILURE; } timerFired = 1; } } else { if (i == timer) { - fprintf(stderr, "FAIL Timer %d should have fired, but didn't\n", timer); + virtTestResult(name, 1, "Timer %d should have fired, but didn't\n", timer); return EXIT_FAILURE; } } } if (timerFired != 1 && timer != -1) { - fprintf(stderr, "FAIL Something wierd happened, expecting timer %d\n", timer); + virtTestResult(name, 1, "Something wierd happened, expecting timer %d\n", timer); return EXIT_FAILURE; } return EXIT_SUCCESS; } static void -startJob(const char *msg, int *test) +startJob(void) { - fprintf(stderr, "%2d: %s ", (*test)++, msg); eventThreadRunOnce = 1; eventThreadJobDone = 0; pthread_cond_signal(&eventThreadRunCond); @@ -210,7 +209,7 @@ startJob(const char *msg, int *test) } static int -finishJob(int handle, int timer) +finishJob(const char *name, int handle, int timer) { struct timespec waitTime; int rc; @@ -220,14 +219,14 @@ finishJob(int handle, int timer) while (!eventThreadJobDone && rc == 0) rc = pthread_cond_timedwait(&eventThreadJobCond, &eventThreadMutex, &waitTime); if (rc != 0) { - fprintf(stderr, "FAIL Timed out waiting for pipe event\n"); + virtTestResult(name, 1, "Timed out waiting for pipe event\n"); return EXIT_FAILURE; } - if (verifyFired(handle, timer) != EXIT_SUCCESS) + if (verifyFired(name, handle, timer) != EXIT_SUCCESS) return EXIT_FAILURE; - fprintf(stderr, "OK\n"); + virtTestResult(name, 0, NULL); return EXIT_SUCCESS; } @@ -252,7 +251,6 @@ mymain(int argc, char **argv) int i; pthread_t eventThread; char one = '1'; - int test = 1; progname = argv[0]; @@ -302,10 +300,10 @@ mymain(int argc, char **argv) /* First time, is easy - just try triggering one of our * registered handles */ - startJob("Simple write", &test); + startJob(); if (safewrite(handles[1].pipeFD[1], &one, 1) != 1) return EXIT_FAILURE; - if (finishJob(1, -1) != EXIT_SUCCESS) + if (finishJob("Simple write", 1, -1) != EXIT_SUCCESS) return EXIT_FAILURE; resetAll(); @@ -313,10 +311,10 @@ mymain(int argc, char **argv) /* Now lets delete one before starting poll(), and * try triggering another handle */ virEventRemoveHandleImpl(handles[0].watch); - startJob("Deleted before poll", &test); + startJob(); if (safewrite(handles[1].pipeFD[1], &one, 1) != 1) return EXIT_FAILURE; - if (finishJob(1, -1) != EXIT_SUCCESS) + if (finishJob("Deleted before poll", 1, -1) != EXIT_SUCCESS) return EXIT_FAILURE; resetAll(); @@ -327,13 +325,13 @@ mymain(int argc, char **argv) /* NB: this case is subject to a bit of a race condition. * We yield & sleep, and pray that the other thread gets * scheduled before we run EventRemoveHandleImpl */ - startJob("Interrupted during poll", &test); + startJob(); pthread_mutex_unlock(&eventThreadMutex); sched_yield(); usleep(100 * 1000); pthread_mutex_lock(&eventThreadMutex); virEventRemoveHandleImpl(handles[1].watch); - if (finishJob(-1, -1) != EXIT_SUCCESS) + if (finishJob("Interrupted during poll", -1, -1) != EXIT_SUCCESS) return EXIT_FAILURE; resetAll(); @@ -345,22 +343,22 @@ mymain(int argc, char **argv) * before poll() exits for the first safewrite(). We don't * see a hard failure in other cases, so nothing to worry * about */ - startJob("Deleted during dispatch", &test); + startJob(); handles[2].delete = handles[3].watch; if (safewrite(handles[2].pipeFD[1], &one, 1) != 1 || safewrite(handles[3].pipeFD[1], &one, 1) != 1) return EXIT_FAILURE; - if (finishJob(2, -1) != EXIT_SUCCESS) + if (finishJob("Deleted during dispatch", 2, -1) != EXIT_SUCCESS) return EXIT_FAILURE; resetAll(); /* Extreme fun, lets delete ourselves during dispatch */ - startJob("Deleted during dispatch", &test); + startJob(); handles[2].delete = handles[2].watch; if (safewrite(handles[2].pipeFD[1], &one, 1) != 1) return EXIT_FAILURE; - if (finishJob(2, -1) != EXIT_SUCCESS) + if (finishJob("Deleted during dispatch", 2, -1) != EXIT_SUCCESS) return EXIT_FAILURE; resetAll(); @@ -369,8 +367,8 @@ mymain(int argc, char **argv) /* Run a timer on its own */ virEventUpdateTimeoutImpl(timers[1].timer, 100); - startJob("Firing a timer", &test); - if (finishJob(-1, 1) != EXIT_SUCCESS) + startJob(); + if (finishJob("Firing a timer", -1, 1) != EXIT_SUCCESS) return EXIT_FAILURE; virEventUpdateTimeoutImpl(timers[1].timer, -1); @@ -380,8 +378,8 @@ mymain(int argc, char **argv) * try triggering another timer */ virEventUpdateTimeoutImpl(timers[1].timer, 100); virEventRemoveTimeoutImpl(timers[0].timer); - startJob("Deleted before poll", &test); - if (finishJob(-1, 1) != EXIT_SUCCESS) + startJob(); + if (finishJob("Deleted before poll", -1, 1) != EXIT_SUCCESS) return EXIT_FAILURE; virEventUpdateTimeoutImpl(timers[1].timer, -1); @@ -393,13 +391,13 @@ mymain(int argc, char **argv) /* NB: this case is subject to a bit of a race condition. * We yield & sleep, and pray that the other thread gets * scheduled before we run EventRemoveTimeoutImpl */ - startJob("Interrupted during poll", &test); + startJob(); pthread_mutex_unlock(&eventThreadMutex); sched_yield(); usleep(100 * 1000); pthread_mutex_lock(&eventThreadMutex); virEventRemoveTimeoutImpl(timers[1].timer); - if (finishJob(-1, -1) != EXIT_SUCCESS) + if (finishJob("Interrupted during poll", -1, -1) != EXIT_SUCCESS) return EXIT_FAILURE; resetAll(); @@ -413,9 +411,9 @@ mymain(int argc, char **argv) * about */ virEventUpdateTimeoutImpl(timers[2].timer, 100); virEventUpdateTimeoutImpl(timers[3].timer, 100); - startJob("Deleted during dispatch", &test); + startJob(); timers[2].delete = timers[3].timer; - if (finishJob(-1, 2) != EXIT_SUCCESS) + if (finishJob("Deleted during dispatch", -1, 2) != EXIT_SUCCESS) return EXIT_FAILURE; virEventUpdateTimeoutImpl(timers[2].timer, -1); @@ -423,9 +421,9 @@ mymain(int argc, char **argv) /* Extreme fun, lets delete ourselves during dispatch */ virEventUpdateTimeoutImpl(timers[2].timer, 100); - startJob("Deleted during dispatch", &test); + startJob(); timers[2].delete = timers[2].timer; - if (finishJob(-1, 2) != EXIT_SUCCESS) + if (finishJob("Deleted during dispatch", -1, 2) != EXIT_SUCCESS) return EXIT_FAILURE; for (i = 0 ; i < NUM_FDS ; i++) @@ -448,10 +446,10 @@ mymain(int argc, char **argv) VIR_EVENT_HANDLE_READABLE, testPipeReader, &handles[1], NULL); - startJob("Write duplicate", &test); + startJob(); if (safewrite(handles[1].pipeFD[1], &one, 1) != 1) return EXIT_FAILURE; - if (finishJob(1, -1) != EXIT_SUCCESS) + if (finishJob("Write duplicate", 1, -1) != EXIT_SUCCESS) return EXIT_FAILURE; //pthread_kill(eventThread, SIGTERM); diff --git a/tests/interfaceschematest b/tests/interfaceschematest index e9ec2a4..66d8890 100755 --- a/tests/interfaceschematest +++ b/tests/interfaceschematest @@ -1,6 +1,9 @@ #!/bin/sh -. ./schematestutils.sh +test -z "$srcdir" && srcdir=$(pwd) + +. "$srcdir/test-lib.sh" +. "$abs_srcdir/schematestutils.sh" DIRS="interfaceschemadata" SCHEMA="interface.rng" diff --git a/tests/networkschematest b/tests/networkschematest index 01b2e6f..1bad45d 100755 --- a/tests/networkschematest +++ b/tests/networkschematest @@ -1,6 +1,9 @@ #!/bin/sh -. ./schematestutils.sh +test -z "$srcdir" && srcdir=$(pwd) + +. "$srcdir/test-lib.sh" +. "$abs_srcdir/schematestutils.sh" DIRS="../src/network networkxml2xmlin networkxml2xmlout" SCHEMA="network.rng" diff --git a/tests/nodedevschematest b/tests/nodedevschematest index 2f0e2b9..112fa6f 100755 --- a/tests/nodedevschematest +++ b/tests/nodedevschematest @@ -1,6 +1,9 @@ #!/bin/sh -. ./schematestutils.sh +test -z "$srcdir" && srcdir=$(pwd) + +. "$srcdir/test-lib.sh" +. "$abs_srcdir/schematestutils.sh" DIRS="nodedevschemadata" SCHEMA="nodedev.rng" diff --git a/tests/schematestutils.sh b/tests/schematestutils.sh index 56e6d83..1ad13fa 100644 --- a/tests/schematestutils.sh +++ b/tests/schematestutils.sh @@ -1,12 +1,11 @@ #!/bin/sh -test -z "$srcdir" && srcdir=`pwd` -test -z "$abs_srcdir" && abs_srcdir=`pwd` - check_schema () { DIRS=$1 -SCHEMA="$srcdir/../docs/schemas/$2" +SCHEMA="$abs_srcdir/../docs/schemas/$2" + +test_intro $NAME n=0 f=0 @@ -17,20 +16,21 @@ do for xml in $XML do n=`expr $n + 1` - printf "%4d) %.60s " $n $(basename $(dirname $xml))"/"$(basename $xml) cmd="xmllint --relaxng $SCHEMA --noout $xml" result=`$cmd 2>&1` ret=$? - if test $ret = 0; then - echo "OK" - else - echo "FAILED" + + test_result $n $(basename $(dirname $xml))"/"$(basename $xml) $ret + if test "$verbose" = "1" -a $ret != 0 ; then echo -e "$cmd\n$result" + fi + if test "$ret" != 0 ; then f=`expr $f + 1` fi done done -echo "Validated $n files, $f failed" + +test_final $n $f ret=0 test $f != 0 && ret=255 diff --git a/tests/statstest.c b/tests/statstest.c index 4c2ea7f..c7a5430 100644 --- a/tests/statstest.c +++ b/tests/statstest.c @@ -25,7 +25,7 @@ static int testDevice(const char *path, int expect) if (actual == expect) { return 0; } else { - if (virtTestGetDebug()) + if (virTestGetDebug()) fprintf(stderr, "Expect %-6d Actual %-6d\n", expect, actual); return -1; } @@ -55,7 +55,7 @@ mymain(int argc ATTRIBUTE_UNUSED, * register a handler to stop error messages cluttering * up display */ - if (!virtTestGetDebug()) + if (!virTestGetDebug()) virSetErrorFunc(NULL, testQuietError); #define DO_TEST(dev, num) \ diff --git a/tests/storagepoolschematest b/tests/storagepoolschematest index 57b2f7b..942c542 100755 --- a/tests/storagepoolschematest +++ b/tests/storagepoolschematest @@ -1,6 +1,9 @@ #!/bin/sh -. ./schematestutils.sh +test -z "$srcdir" && srcdir=$(pwd) + +. "$srcdir/test-lib.sh" +. "$abs_srcdir/schematestutils.sh" DIRS="storagepoolxml2xmlin storagepoolxml2xmlout" SCHEMA="storagepool.rng" diff --git a/tests/storagevolschematest b/tests/storagevolschematest index 32a8657..1f231c2 100755 --- a/tests/storagevolschematest +++ b/tests/storagevolschematest @@ -1,6 +1,9 @@ #!/bin/sh -. ./schematestutils.sh +test -z "$srcdir" && srcdir=$(pwd) + +. "$srcdir/test-lib.sh" +. "$abs_srcdir/schematestutils.sh" DIRS="storagevolxml2xmlin storagevolxml2xmlout" SCHEMA="storagevol.rng" diff --git a/tests/test-lib.sh b/tests/test-lib.sh index a007109..43265f3 100644 --- a/tests/test-lib.sh +++ b/tests/test-lib.sh @@ -1,5 +1,11 @@ # source this file; set up for tests +test -z "$abs_srcdir" && abs_srcdir=$(pwd) +test -z "$abs_builddir" && abs_builddir=$(pwd) +test -z "$abs_top_srcdir" && abs_top_srcdir=$(pwd)/.. +test -z "$abs_top_builddir" && abs_top_builddir=$(pwd)/.. +test -z "$LC_ALL" && LC_ALL=C + # Skip this test if the shell lacks support for functions. unset function_test eval 'function_test() { return 11; }; function_test' @@ -8,6 +14,59 @@ if test $? != 11; then (exit 77); exit 77 fi +test_intro() +{ + name=$1 + if test "$verbose" = "0" ; then + echo "TEST: $name" + echo -n " " + fi +} + +test_result() +{ + counter=$1 + name=$2 + status=$3 + if test "$verbose" = "0" ; then + mod=`eval "expr \( $counter - 1 \) % 40"` + if test "$counter" != 1 -a "$mod" = 0 ; then + printf " %-3d\n" `eval "expr $counter - 1"` + echo -n " " + fi + if test "$status" = "0" ; then + echo -n "." + else + echo -n "!" + fi + else + if test "$status" = "0" ; then + printf "%3d) %-60s ... OK\n" "$counter" "$name" + else + printf "%3d) %-60s ... FAILED\n" "$counter" "$name" + fi + fi +} + +test_final() +{ + counter=$1 + status=$2 + + if test "$verbose" = "0" ; then + mod=`eval "expr \( $counter + 1 \) % 40"` + for i in `seq $mod 40` + do + echo -n " " + done + if test "$status" = "0" ; then + printf " %-3d OK\n" $counter + else + printf " %-3d FAILED\n" $counter + fi + fi +} + skip_test_() { echo "$0: skipping test: $@" 1>&2 @@ -137,6 +196,11 @@ test_dir_=$(pwd) this_test_() { echo "./$0" | sed 's,.*/,,'; } this_test=$(this_test_) +verbose=0 +if test -n "$VIR_TEST_DEBUG" -o -n "$VIR_TEST_VERBOSE" ; then + verbose=1 +fi + # This is a stub function that is run upon trap (upon regular exit and # interrupt). Override it with a per-test function, e.g., to unmount # a partition, or to undo any other global state changes. diff --git a/tests/test_conf.sh b/tests/test_conf.sh index 682f1f5..aa7abf6 100755 --- a/tests/test_conf.sh +++ b/tests/test_conf.sh @@ -1,35 +1,28 @@ #!/bin/sh test -z "$srcdir" && srcdir=$(pwd) -test -z "$abs_top_srcdir" && abs_top_srcdir=$(pwd)/.. -test -z "$abs_top_builddir" && abs_top_builddir=$(pwd)/.. -test -z "$abs_srcdir" && abs_srcdir=$(pwd) -test -z "$abs_builddir" && abs_builddir=$(pwd) - -if test "$VERBOSE" = yes; then - set -x - $abs_top_builddir/tools/virsh --version -fi . "$srcdir/test-lib.sh" -set -e +test_intro $this_test fail=0 -i=1 +i=0 data_dir=$abs_srcdir/confdata for f in $(cd "$data_dir" && echo *.conf) do + i=`expr $i + 1` "$abs_builddir/conftest" "$data_dir/$f" > "$f-actual" expected="$data_dir"/`echo "$f" | sed s+\.conf$+\.out+` if compare "$expected" "$f-actual"; then - msg=OK + ret=0 else - msg=FAILED + ret=1 fail=1 fi - printf "%2d) %-60s ... %s\n" $i "$f" $msg - i=`expr $i + 1` + test_result $i "$f" $ret done +test_final $i $fail + (exit $fail); exit $fail diff --git a/tests/testutils.c b/tests/testutils.c index 25102ed..f31099e 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -46,6 +46,7 @@ ((int) ((T)->tv_usec - (U)->tv_usec))) / 1000.0) static unsigned int testDebug = -1; +static unsigned int testVerbose = -1; static unsigned int testOOM = 0; static unsigned int testCounter = 0; @@ -62,6 +63,38 @@ virtTestCountAverage(double *items, int nitems) return (double) (sum / nitems); } + +void virtTestResult(const char *name, int ret, const char *msg, ...) +{ + va_list vargs; + va_start(vargs, msg); + + testCounter++; + if (virTestGetVerbose()) { + fprintf(stderr, "%3d) %-60s ", testCounter, name); + if (ret == 0) + fprintf(stderr, "OK\n"); + else { + fprintf(stderr, "FAILED\n"); + if (msg) { + vfprintf(stderr, msg, vargs); + } + } + } else { + if (testCounter != 1 && + !((testCounter-1) % 40)) { + fprintf(stderr, " %-3d\n", (testCounter-1)); + fprintf(stderr, " "); + } + if (ret == 0) + fprintf(stderr, "."); + else + fprintf(stderr, "!"); + } + + va_end(vargs); +} + /* * Runs test and count average time (if the nloops is grater than 1) * @@ -76,8 +109,8 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const testCounter++; if (testOOM < 2) { - fprintf(stderr, "%2d) %-65s ... ", testCounter, title); - fflush(stderr); + if (virTestGetVerbose()) + fprintf(stderr, "%2d) %-65s ... ", testCounter, title); } if (nloops > 1 && (ts = calloc(nloops, @@ -97,13 +130,25 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const } } if (testOOM < 2) { - if (ret == 0 && ts) - fprintf(stderr, "OK [%.5f ms]\n", - virtTestCountAverage(ts, nloops)); - else if (ret == 0) - fprintf(stderr, "OK\n"); - else - fprintf(stderr, "FAILED\n"); + if (virTestGetVerbose()) { + if (ret == 0 && ts) + fprintf(stderr, "OK [%.5f ms]\n", + virtTestCountAverage(ts, nloops)); + else if (ret == 0) + fprintf(stderr, "OK\n"); + else + fprintf(stderr, "FAILED\n"); + } else { + if (testCounter != 1 && + !((testCounter-1) % 40)) { + fprintf(stderr, " %-3d\n", (testCounter-1)); + fprintf(stderr, " "); + } + if (ret == 0) + fprintf(stderr, "."); + else + fprintf(stderr, "!"); + } } free(ts); @@ -255,10 +300,10 @@ int virtTestDifference(FILE *stream, const char *actualStart = actual; const char *actualEnd = actual + (strlen(actual)-1); - if (!virtTestGetDebug()) + if (!virTestGetDebug()) return 0; - if (virtTestGetDebug() < 2) { + if (virTestGetDebug() < 2) { /* Skip to first character where they differ */ while (*expectStart && *actualStart && *actualStart == *expectStart) { @@ -322,26 +367,34 @@ virtTestErrorHook(int n, void *data ATTRIBUTE_UNUSED) } #endif -unsigned int -virtTestGetDebug() { - char *debugStr; - unsigned int debug; - - if (testDebug != -1) - return testDebug; +static unsigned int +virTestGetFlag(const char *name) { + char *flagStr; + unsigned int flag; - testDebug = 0; - - if ((debugStr = getenv("VIR_TEST_DEBUG")) == NULL) + if ((flagStr = getenv(name)) == NULL) return 0; - if (virStrToLong_ui(debugStr, NULL, 10, &debug) < 0) + if (virStrToLong_ui(flagStr, NULL, 10, &flag) < 0) return 0; - testDebug = debug; + return flag; +} + +unsigned int +virTestGetDebug() { + if (testDebug == -1) + testDebug = virTestGetFlag("VIR_TEST_DEBUG"); return testDebug; } +unsigned int +virTestGetVerbose() { + if (testVerbose == -1) + testVerbose = virTestGetFlag("VIR_TEST_VERBOSE"); + return testVerbose || virTestGetDebug(); +} + int virtTestMain(int argc, char **argv, int (*func)(int, char **)) @@ -357,6 +410,10 @@ int virtTestMain(int argc, int worker = 0; #endif + fprintf(stderr, "TEST: %s\n", STRPREFIX(argv[0], "./") ? argv[0] + 2 : argv[0]); + if (!virTestGetVerbose()) + fprintf(stderr, " "); + if (virThreadInitialize() < 0 || virErrorInitialize() < 0 || virRandomInitialize(time(NULL) ^ getpid())) @@ -389,7 +446,7 @@ int virtTestMain(int argc, goto cleanup; #if TEST_OOM_TRACE - if (virtTestGetDebug()) + if (virTestGetDebug()) virAllocTestHook(virtTestErrorHook, NULL); #endif @@ -407,7 +464,7 @@ int virtTestMain(int argc, approxAlloc = virAllocTestCount(); testCounter++; - if (virtTestGetDebug()) + if (virTestGetDebug()) fprintf(stderr, "%d) OOM...\n", testCounter); else fprintf(stderr, "%d) OOM of %d allocs ", testCounter, approxAlloc); @@ -429,7 +486,7 @@ int virtTestMain(int argc, if (mp && (n % mp) != (worker - 1)) continue; - if (!virtTestGetDebug()) { + if (!virTestGetDebug()) { if (mp) fprintf(stderr, "%d", worker); else @@ -458,7 +515,7 @@ int virtTestMain(int argc, } } - if (virtTestGetDebug()) + if (virTestGetDebug()) fprintf(stderr, " ... OOM of %d allocs", approxAlloc); if (ret == EXIT_SUCCESS) @@ -472,6 +529,12 @@ cleanup: #endif virResetLastError(); + if (!virTestGetVerbose()) { + int i; + for (i = (testCounter % 40) ; i < 40 ; i++) + fprintf(stderr, " "); + fprintf(stderr, " %-3d %s\n", testCounter, ret == 0 ? "OK" : "FAIL"); + } return ret; } diff --git a/tests/testutils.h b/tests/testutils.h index e5d5750..1f03746 100644 --- a/tests/testutils.h +++ b/tests/testutils.h @@ -18,6 +18,7 @@ double virtTestCountAverage(double *items, int nitems); +void virtTestResult(const char *name, int ret, const char *msg, ...); int virtTestRun(const char *title, int nloops, int (*body)(const void *data), @@ -36,7 +37,8 @@ int virtTestDifference(FILE *stream, const char *expect, const char *actual); -unsigned int virtTestGetDebug(void); +unsigned int virTestGetDebug(void); +unsigned int virTestGetVerbose(void); int virtTestMain(int argc, char **argv, diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index eeeb5ec..b07ab48 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -132,7 +132,7 @@ virCapsPtr testQemuCapsInit(void) { NULL) == NULL) goto cleanup; - if (virtTestGetDebug()) { + if (virTestGetDebug()) { char *caps_str; caps_str = virCapabilitiesFormatXML(caps); diff --git a/tests/virsh-all b/tests/virsh-all index 81b3e57..f1eb82c 100755 --- a/tests/virsh-all +++ b/tests/virsh-all @@ -17,13 +17,6 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. test -z "$srcdir" && srcdir=$(pwd) -test -z "$abs_top_srcdir" && abs_top_srcdir=$(pwd)/.. -test -z "$abs_top_builddir" && abs_top_builddir=$(pwd)/.. - -if test "$VERBOSE" = yes; then - set -x - $abs_top_builddir/tools/virsh --version -fi . "$srcdir/test-lib.sh" @@ -35,10 +28,24 @@ $abs_top_builddir/tools/virsh -c $test_url help > cmds || framework_failure cmds=$(sed -n 's/^ \([^ ][^ ]*\) .*/\1/p' cmds) || framework_failure test -n "$cmds" || framework_failure +test_intro "virsh-all" + +counter=0 for i in $cmds; do - echo testing $i... 1>&2 - # For now, just run the command and ignore output and exit status. + counter=`eval "expr $counter + 1"` + + # For now, just run the command and ignore output $abs_top_builddir/tools/virsh -c $test_url $i < /dev/null > /dev/null 2>&1 + # Temporarily ignoring exit status + #status=$? + status=0 + test_result $counter $i $status + + if test "$status" = "1" ; then + fail=1 + fi done +test_final $counter $fail + (exit $fail); exit $fail -- 1.6.5.2 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list