[Libvir] PATCH: Make test suite debug mode more friendly

When the test suites fail, we have a DEBUG_TESTS=1 environment variable which can be set to show the full XML doc or string pair that failed to match. Unfortunately these docs can be quite large, so it is hard to spot the difference between the actual and expected output. So this patch introduces a virtTestDifference(actual, expect) method which will trim the head & tail of the actual & expected strings until the point at which they differ. This gives immediate clear feedback on where the bug is Second, it will enumerate each test condition & pretty print align things a little better. When I apply this to a test which fails, i now see output like this: 19) Xen SEXPR-2-XML fv-usbmouse -> fv-usbmouse ... Expect [localtime'/> <devices> <emulator>/usr/lib64/xen/bin/qemu-dm</emulator> <disk type='file' device='disk'> <driver name='file'/> <source file='/root/foo.img'/> <target dev='hda'/> </disk> <interface type='network] Actual [utc'/> <devices> <emulator>/usr/lib64/xen/bin/qemu-dm</emulator> <disk type='file' device='disk'> <driver name='file'/> <source file='/root/foo.img'/> <target dev='hda'/> </disk> <interface type='bridge] ... FAILED So you can see immediately that they start to differ in the 'localtime' vs 'utc' value, and the last place at which they differ is the network interface which has type of 'network' vs 'bridge'. This has dramatically eased my debugging of tests when adding the serial device options :-) This patch is merely the helper routines. I'll include the actualy test suite changes later. Dan. Index: testutils.h =================================================================== RCS file: /data/cvs/libvirt/tests/testutils.h,v retrieving revision 1.6 diff -u -p -r1.6 testutils.h --- testutils.h 10 Apr 2008 16:53:29 -0000 1.6 +++ testutils.h 18 Apr 2008 00:22:55 -0000 @@ -32,6 +32,11 @@ extern "C" { char **buf, int buflen); + + int virtTestDifference(FILE *stream, + const char *expect, + const char *actual); + #ifdef __cplusplus } #endif Index: testutils.c =================================================================== RCS file: /data/cvs/libvirt/tests/testutils.c,v retrieving revision 1.11 diff -u -p -r1.11 testutils.c --- testutils.c 10 Apr 2008 16:53:29 -0000 1.11 +++ testutils.c 18 Apr 2008 00:22:55 -0000 @@ -19,6 +19,7 @@ #include <sys/stat.h> #include <sys/wait.h> #include <unistd.h> +#include <string.h> #include <fcntl.h> #include <limits.h> #include "testutils.h" @@ -58,6 +59,12 @@ virtTestRun(const char *title, int nloop { int i, ret = 0; double *ts = NULL; + static int counter = 0; + + counter++; + + fprintf(stderr, "%2d) %-65s ... ", counter, title); + fflush(stderr); if (nloops > 1 && (ts = calloc(nloops, sizeof(double)))==NULL) @@ -76,12 +83,12 @@ virtTestRun(const char *title, int nloop } } if (ret == 0 && ts) - fprintf(stderr, "%-50s ... OK [%.5f ms]\n", title, + fprintf(stderr, "OK [%.5f ms]\n", virtTestCountAverage(ts, nloops)); else if (ret == 0) - fprintf(stderr, "%-50s ... OK\n", title); + fprintf(stderr, "OK\n"); else - fprintf(stderr, "%-50s ... FAILED\n", title); + fprintf(stderr, "FAILED\n"); free(ts); return ret; @@ -206,3 +213,57 @@ int virtTestCaptureProgramOutput(const c } } } + + +/** + * @param stream: output stream write to differences to + * @param expect: expected output text + * @param actual: actual output text + * + * Display expected and actual output text, trimmed to + * first and last characters at which differences occur + */ +int virtTestDifference(FILE *stream, + const char *expect, + const char *actual) +{ + const char *expectStart = expect; + const char *expectEnd = expect + (strlen(expect)-1); + const char *actualStart = actual; + const char *actualEnd = actual + (strlen(actual)-1); + + if (getenv("DEBUG_TESTS") == NULL) + return 0; + + /* Skip to first character where they differ */ + while (*expectStart && *actualStart && + *actualStart == *expectStart) { + actualStart++; + expectStart++; + } + + /* Work backwards to last character where they differ */ + while (actualEnd > actualStart && + expectEnd > expectStart && + *actualEnd == *expectEnd) { + actualEnd--; + expectEnd--; + } + + /* Show the trimmed differences */ + fprintf(stream, "\nExpect ["); + if ((expectEnd - expectStart + 1) && + fwrite(expectStart, (expectEnd-expectStart+1), 1, stream) != 1) + return -1; + fprintf(stream, "]\n"); + fprintf(stream, "Actual ["); + if ((actualEnd - actualStart + 1) && + fwrite(actualStart, (actualEnd-actualStart+1), 1, stream) != 1) + return -1; + fprintf(stream, "]\n"); + + /* Pad to line up with test name ... in virTestRun */ + fprintf(stream, " ... "); + + return 0; +} -- |: Red Hat, Engineering, Boston -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

On Fri, Apr 18, 2008 at 01:28:55AM +0100, Daniel P. Berrange wrote:
When the test suites fail, we have a DEBUG_TESTS=1 environment variable which can be set to show the full XML doc or string pair that failed to match. Unfortunately these docs can be quite large, so it is hard to spot the difference between the actual and expected output.
All looks good, +1. Rich. -- Richard Jones, Emerging Technologies, Red Hat http://et.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v

"Daniel P. Berrange" <berrange@redhat.com> wrote:
When the test suites fail, we have a DEBUG_TESTS=1 environment variable which can be set to show the full XML doc or string pair that failed to match. Unfortunately these docs can be quite large, so it is hard to spot the difference between the actual and expected output.
So this patch introduces a virtTestDifference(actual, expect) method which will trim the head & tail of the actual & expected strings until the point at which they differ. This gives immediate clear feedback on where the bug is
Second, it will enumerate each test condition & pretty print align things a little better.
Looks good.

On Fri, Apr 18, 2008 at 01:28:55AM +0100, Daniel P. Berrange wrote:
When the test suites fail, we have a DEBUG_TESTS=1 environment variable which can be set to show the full XML doc or string pair that failed to match. Unfortunately these docs can be quite large, so it is hard to spot the difference between the actual and expected output.
So this patch introduces a virtTestDifference(actual, expect) method which will trim the head & tail of the actual & expected strings until the point at which they differ. This gives immediate clear feedback on where the bug is
Second, it will enumerate each test condition & pretty print align things a little better.
Great ! Going though the diffs can be really painful at times +1 Daniel -- Red Hat Virtualization group http://redhat.com/virtualization/ Daniel Veillard | virtualization library http://libvirt.org/ veillard@redhat.com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/ http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/
participants (4)
-
Daniel P. Berrange
-
Daniel Veillard
-
Jim Meyering
-
Richard W.M. Jones