[libvirt] [PATCH 0/4] Rewrite the test OOM checking code

From: "Daniel P. Berrange" <berrange@redhat.com> This rewrites the OOM checking code to be much much much more scalable. Instead of looping running 'main' multiple times, we loop running 'virtTestRun' multiple times. Although the overall number of mallocs to be checked is basically the same, checking them in small blocks is a massive efficiency win, because the complexity is 'n * (n + 1) / 1'. Although I've fixed many issues, there are still some big problems remaining - The APIs in virxml.h don't let the caller distinguish between "attribute not found" and other errors. So anywhere we have an attribute that is optional, we are failing to diagnose & report OOM correctly (or indeed other errors we might get from libxml) - It is desirable to validate that we get VIR_ERR_NO_MEMORY for each failure, but there are times where we won't get this. In particular with any of the APIs which have delayed error reporting such as virCommand and virBuffer. You can see an OOM from those APIs, but there's a window between that occurring & being reported, where another error may be reported. - We should not count allocs in virerror.c or virlog.c APIs when doing OOM testing, since they're intentionally non-fatal Daniel P. Berrange (4): Don't clobber 'ret' variable in testCompareXMLToXMLHelper Remove existing OOM test impl Remove test case average timing Introduce new OOM testing support tests/commandtest.c | 2 +- tests/cputest.c | 5 +- tests/domainsnapshotxml2xmltest.c | 2 +- tests/esxutilstest.c | 2 +- tests/fchosttest.c | 10 +- tests/fdstreamtest.c | 8 +- tests/interfacexml2xmltest.c | 6 +- tests/jsontest.c | 2 +- tests/libvirtdconftest.c | 2 +- tests/lxcxml2xmltest.c | 4 +- tests/metadatatest.c | 6 +- tests/networkxml2conftest.c | 2 +- tests/networkxml2xmltest.c | 2 +- tests/networkxml2xmlupdatetest.c | 2 +- tests/nodedevxml2xmltest.c | 6 +- tests/nodeinfotest.c | 2 +- tests/nwfilterxml2xmltest.c | 2 +- tests/openvzutilstest.c | 2 +- tests/qemuagenttest.c | 4 +- tests/qemuargv2xmltest.c | 18 +- tests/qemuhelptest.c | 2 +- tests/qemuhotplugtest.c | 2 +- tests/qemumonitorjsontest.c | 8 +- tests/qemumonitortest.c | 2 +- tests/qemuxml2argvtest.c | 14 +- tests/qemuxml2xmltest.c | 25 +-- tests/qemuxmlnstest.c | 20 +- tests/securityselinuxlabeltest.c | 6 +- tests/securityselinuxtest.c | 2 +- tests/sexpr2xmltest.c | 2 +- tests/sockettest.c | 16 +- tests/statstest.c | 2 +- tests/storagepoolxml2xmltest.c | 6 +- tests/storagevolxml2argvtest.c | 2 +- tests/storagevolxml2xmltest.c | 14 +- tests/sysinfotest.c | 2 +- tests/testutils.c | 386 ++++++++++++++++++++------------------ tests/testutils.h | 3 +- tests/utiltest.c | 4 +- tests/viratomictest.c | 4 +- tests/virauthconfigtest.c | 2 +- tests/virbitmaptest.c | 18 +- tests/virbuftest.c | 2 +- tests/vircgrouptest.c | 22 +-- tests/virdbustest.c | 10 +- tests/virdrivermoduletest.c | 2 +- tests/virendiantest.c | 4 +- tests/virhashtest.c | 2 +- tests/viridentitytest.c | 4 +- tests/virkeycodetest.c | 4 +- tests/virkeyfiletest.c | 2 +- tests/virlockspacetest.c | 14 +- tests/virnetmessagetest.c | 10 +- tests/virnetserverclienttest.c | 2 +- tests/virnetsockettest.c | 30 +-- tests/virnettlscontexttest.c | 2 +- tests/virnettlssessiontest.c | 4 +- tests/virportallocatortest.c | 4 +- tests/virshtest.c | 36 ++-- tests/virstoragetest.c | 2 +- tests/virstringtest.c | 8 +- tests/virsystemdtest.c | 10 +- tests/virtimetest.c | 2 +- tests/viruritest.c | 2 +- tests/vmwarevertest.c | 2 +- tests/vmx2xmltest.c | 2 +- tests/xencapstest.c | 22 +-- tests/xmconfigtest.c | 4 +- tests/xml2sexprtest.c | 2 +- tests/xml2vmxtest.c | 2 +- 70 files changed, 436 insertions(+), 407 deletions(-) -- 1.8.3.1

From: "Daniel P. Berrange" <berrange@redhat.com> The qemuxml2xmltest.c function testCompareXMLToXMLHelper would clobber the 'ret' variable causing it to mis-diagnose OOM errors. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/qemuxml2xmltest.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index c661573..9fd3ada 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -84,16 +84,19 @@ testCompareXMLToXMLHelper(const void *data) abs_srcdir, info->name) < 0) goto cleanup; - if (info->when & WHEN_INACTIVE) { - ret = testCompareXMLToXMLFiles(xml_in, - info->different ? xml_out : xml_in, - false); - } - if (info->when & WHEN_ACTIVE) { - ret = testCompareXMLToXMLFiles(xml_in, - info->different ? xml_out : xml_in, - true); - } + if ((info->when & WHEN_INACTIVE) && + testCompareXMLToXMLFiles(xml_in, + info->different ? xml_out : xml_in, + false) < 0) + goto cleanup; + + if ((info->when & WHEN_ACTIVE) && + testCompareXMLToXMLFiles(xml_in, + info->different ? xml_out : xml_in, + true) < 0) + goto cleanup; + + ret = 0; cleanup: VIR_FREE(xml_in); -- 1.8.3.1

On 09/25/2013 11:23 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The qemuxml2xmltest.c function testCompareXMLToXMLHelper would clobber the 'ret' variable causing it to mis-diagnose OOM errors.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/qemuxml2xmltest.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-)
ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

From: "Daniel P. Berrange" <berrange@redhat.com> Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/testutils.c | 188 +++++++----------------------------------------------- 1 file changed, 22 insertions(+), 166 deletions(-) diff --git a/tests/testutils.c b/tests/testutils.c index 45882c5..da69d53 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -47,10 +47,6 @@ #include "virprocess.h" #include "virstring.h" -#if TEST_OOM_TRACE -# include <execinfo.h> -#endif - #ifdef HAVE_PATHS_H # include <paths.h> #endif @@ -68,7 +64,6 @@ static unsigned int testDebug = -1; static unsigned int testVerbose = -1; static unsigned int testExpensive = -1; -static unsigned int testOOM = 0; static size_t testCounter = 0; static size_t testStart = 0; static size_t testEnd = 0; @@ -151,10 +146,8 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const testCounter > testEnd)) return 0; - if (testOOM < 2) { - if (virTestGetVerbose()) - fprintf(stderr, "%2zu) %-65s ... ", testCounter, title); - } + if (virTestGetVerbose()) + fprintf(stderr, "%2zu) %-65s ... ", testCounter, title); if (nloops > 1 && (VIR_ALLOC_N(ts, nloops) < 0)) return -1; @@ -182,30 +175,28 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const ts[i] = DIFF_MSEC(&after, &before); } } - if (testOOM < 2) { - if (virTestGetVerbose()) { - if (ret == 0 && ts) - fprintf(stderr, "OK [%.5f ms]\n", - virtTestCountAverage(ts, nloops)); - else if (ret == 0) - fprintf(stderr, "OK\n"); - else if (ret == EXIT_AM_SKIP) - fprintf(stderr, "SKIP\n"); - else - fprintf(stderr, "FAILED\n"); - } else { - if (testCounter != 1 && - !((testCounter-1) % 40)) { - fprintf(stderr, " %-3zu\n", (testCounter-1)); - fprintf(stderr, " "); + if (virTestGetVerbose()) { + if (ret == 0 && ts) + fprintf(stderr, "OK [%.5f ms]\n", + virtTestCountAverage(ts, nloops)); + else if (ret == 0) + fprintf(stderr, "OK\n"); + else if (ret == EXIT_AM_SKIP) + fprintf(stderr, "SKIP\n"); + else + fprintf(stderr, "FAILED\n"); + } else { + if (testCounter != 1 && + !((testCounter-1) % 40)) { + fprintf(stderr, " %-3zu\n", (testCounter-1)); + fprintf(stderr, " "); } - if (ret == 0) + if (ret == 0) fprintf(stderr, "."); - else if (ret == EXIT_AM_SKIP) - fprintf(stderr, "_"); - else - fprintf(stderr, "!"); - } + else if (ret == EXIT_AM_SKIP) + fprintf(stderr, "_"); + else + fprintf(stderr, "!"); } VIR_FREE(ts); @@ -539,27 +530,6 @@ virtTestLogContentAndReset(void) return ret; } -#if TEST_OOM_TRACE -static void -virtTestErrorHook(int n, void *data ATTRIBUTE_UNUSED) -{ - void *trace[30]; - int ntrace = ARRAY_CARDINALITY(trace); - size_t i; - char **symbols = NULL; - - ntrace = backtrace(trace, ntrace); - symbols = backtrace_symbols(trace, ntrace); - if (symbols) { - fprintf(stderr, "Failing allocation %d at:\n", n); - for (i = 0; i < ntrace; i++) { - if (symbols[i]) - fprintf(stderr, " TRACE: %s\n", symbols[i]); - } - VIR_FREE(symbols); - } -} -#endif static unsigned int virTestGetFlag(const char *name) { @@ -603,15 +573,6 @@ int virtTestMain(int argc, int ret; bool abs_srcdir_cleanup = false; char *testRange = NULL; -#if TEST_OOM - int approxAlloc = 0; - int n; - char *oomStr = NULL; - int oomCount; - int mp = 0; - pid_t *workers; - int worker = 0; -#endif abs_srcdir = getenv("abs_srcdir"); if (!abs_srcdir) { @@ -672,112 +633,7 @@ int virtTestMain(int argc, } } -#if TEST_OOM - if ((oomStr = getenv("VIR_TEST_OOM")) != NULL) { - if (virStrToLong_i(oomStr, NULL, 10, &oomCount) < 0) - oomCount = 0; - - if (oomCount < 0) - oomCount = 0; - if (oomCount) - testOOM = 1; - } - - if (getenv("VIR_TEST_MP") != NULL) { - mp = sysconf(_SC_NPROCESSORS_ONLN); - fprintf(stderr, "Using %d worker processes\n", mp); - if (VIR_ALLOC_N(workers, mp) < 0) { - ret = EXIT_FAILURE; - goto cleanup; - } - } - - /* Run once to prime any static allocations & ensure it passes */ ret = (func)(); - if (ret != EXIT_SUCCESS) - goto cleanup; - -# if TEST_OOM_TRACE - if (virTestGetDebug()) - virAllocTestHook(virtTestErrorHook, NULL); -# endif - - if (testOOM) { - /* Makes next test runs quiet... */ - testOOM++; - virtTestQuiesceLibvirtErrors(true); - - virAllocTestInit(); - - /* Run again to count allocs, and ensure it passes :-) */ - ret = (func)(); - if (ret != EXIT_SUCCESS) - goto cleanup; - - approxAlloc = virAllocTestCount(); - testCounter++; - if (virTestGetDebug()) - fprintf(stderr, "%zu) OOM...\n", testCounter); - else - fprintf(stderr, "%zu) OOM of %d allocs ", testCounter, approxAlloc); - - if (mp) { - size_t i; - for (i = 0; i < mp; i++) { - workers[i] = fork(); - if (workers[i] == 0) { - worker = i + 1; - break; - } - } - } - - /* Run once for each alloc, failing a different one - and validating that the test case failed */ - for (n = 0; n < approxAlloc && (!mp || worker); n++) { - if (mp && - (n % mp) != (worker - 1)) - continue; - if (!virTestGetDebug()) { - if (mp) - fprintf(stderr, "%d", worker); - else - fprintf(stderr, "."); - fflush(stderr); - } - virAllocTestOOM(n+1, oomCount); - - if (((func)()) != EXIT_FAILURE) { - ret = EXIT_FAILURE; - break; - } - } - - if (mp) { - if (worker) { - _exit(ret); - } else { - size_t i; - for (i = 0; i < mp; i++) { - if (virProcessWait(workers[i], NULL) < 0) - ret = EXIT_FAILURE; - } - VIR_FREE(workers); - } - } - - if (virTestGetDebug()) - fprintf(stderr, " ... OOM of %d allocs", approxAlloc); - - if (ret == EXIT_SUCCESS) - fprintf(stderr, " OK\n"); - else - fprintf(stderr, " FAILED\n"); - } -cleanup: -#else - ret = (func)(); -#endif if (abs_srcdir_cleanup) VIR_FREE(abs_srcdir); -- 1.8.3.1

On 09/25/2013 11:23 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/testutils.c | 188 +++++++----------------------------------------------- 1 file changed, 22 insertions(+), 166 deletions(-)
ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

From: "Daniel P. Berrange" <berrange@redhat.com> Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/commandtest.c | 2 +- tests/cputest.c | 2 +- tests/domainsnapshotxml2xmltest.c | 2 +- tests/esxutilstest.c | 2 +- tests/fchosttest.c | 10 ++++----- tests/fdstreamtest.c | 8 +++---- tests/interfacexml2xmltest.c | 6 +++--- tests/jsontest.c | 2 +- tests/libvirtdconftest.c | 2 +- tests/lxcxml2xmltest.c | 4 ++-- tests/metadatatest.c | 6 +++--- tests/networkxml2conftest.c | 2 +- tests/networkxml2xmltest.c | 2 +- tests/networkxml2xmlupdatetest.c | 2 +- tests/nodedevxml2xmltest.c | 6 +++--- tests/nodeinfotest.c | 2 +- tests/nwfilterxml2xmltest.c | 2 +- tests/openvzutilstest.c | 2 +- tests/qemuagenttest.c | 4 ++-- tests/qemuargv2xmltest.c | 4 ++-- tests/qemuhelptest.c | 2 +- tests/qemuhotplugtest.c | 2 +- tests/qemumonitorjsontest.c | 8 +++---- tests/qemumonitortest.c | 2 +- tests/qemuxml2argvtest.c | 2 +- tests/qemuxml2xmltest.c | 2 +- tests/qemuxmlnstest.c | 2 +- tests/securityselinuxlabeltest.c | 6 +++--- tests/securityselinuxtest.c | 2 +- tests/sexpr2xmltest.c | 2 +- tests/sockettest.c | 16 +++++++------- tests/statstest.c | 2 +- tests/storagepoolxml2xmltest.c | 6 +++--- tests/storagevolxml2argvtest.c | 2 +- tests/storagevolxml2xmltest.c | 14 ++++++------ tests/sysinfotest.c | 2 +- tests/testutils.c | 45 ++++++++++----------------------------- tests/testutils.h | 1 - tests/utiltest.c | 4 ++-- tests/viratomictest.c | 4 ++-- tests/virauthconfigtest.c | 2 +- tests/virbitmaptest.c | 18 ++++++++-------- tests/virbuftest.c | 2 +- tests/vircgrouptest.c | 22 +++++++++---------- tests/virdbustest.c | 10 ++++----- tests/virdrivermoduletest.c | 2 +- tests/virendiantest.c | 4 ++-- tests/virhashtest.c | 2 +- tests/viridentitytest.c | 4 ++-- tests/virkeycodetest.c | 4 ++-- tests/virkeyfiletest.c | 2 +- tests/virlockspacetest.c | 14 ++++++------ tests/virnetmessagetest.c | 10 ++++----- tests/virnetserverclienttest.c | 2 +- tests/virnetsockettest.c | 30 +++++++++++++------------- tests/virnettlscontexttest.c | 2 +- tests/virnettlssessiontest.c | 4 ++-- tests/virportallocatortest.c | 4 ++-- tests/virshtest.c | 36 +++++++++++++++---------------- tests/virstoragetest.c | 2 +- tests/virstringtest.c | 8 +++---- tests/virsystemdtest.c | 10 ++++----- tests/virtimetest.c | 2 +- tests/viruritest.c | 2 +- tests/vmwarevertest.c | 2 +- tests/vmx2xmltest.c | 2 +- tests/xencapstest.c | 22 +++++++++---------- tests/xmconfigtest.c | 4 ++-- tests/xml2sexprtest.c | 2 +- tests/xml2vmxtest.c | 2 +- 70 files changed, 203 insertions(+), 227 deletions(-) diff --git a/tests/commandtest.c b/tests/commandtest.c index eeb6d1e..4780cf9 100644 --- a/tests/commandtest.c +++ b/tests/commandtest.c @@ -1020,7 +1020,7 @@ mymain(void) # define DO_TEST(NAME) \ if (virtTestRun("Command Exec " #NAME " test", \ - 1, NAME, NULL) < 0) \ + NAME, NULL) < 0) \ ret = -1 DO_TEST(test0); diff --git a/tests/cputest.c b/tests/cputest.c index 408a510..8e3640b 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -472,7 +472,7 @@ cpuTestRun(const char *name, const struct data *data) tmp = virtTestLogContentAndReset(); VIR_FREE(tmp); - if (virtTestRun(label, 1, cpuTest[data->api], data) < 0) { + if (virtTestRun(label, cpuTest[data->api], data) < 0) { if (virTestGetDebug()) { char *log; if ((log = virtTestLogContentAndReset()) && diff --git a/tests/domainsnapshotxml2xmltest.c b/tests/domainsnapshotxml2xmltest.c index defa955..9225119 100644 --- a/tests/domainsnapshotxml2xmltest.c +++ b/tests/domainsnapshotxml2xmltest.c @@ -102,7 +102,7 @@ mymain(void) do { \ const struct testInfo info = {name, uuid, internal}; \ if (virtTestRun("SNAPSHOT XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, &info) < 0) \ + testCompareXMLToXMLHelper, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/esxutilstest.c b/tests/esxutilstest.c index a60c7ec..0576366 100644 --- a/tests/esxutilstest.c +++ b/tests/esxutilstest.c @@ -253,7 +253,7 @@ mymain(void) # define DO_TEST(_name) \ do { \ - if (virtTestRun("VMware "#_name, 1, test##_name, \ + if (virtTestRun("VMware "#_name, test##_name, \ NULL) < 0) { \ result = -1; \ } \ diff --git a/tests/fchosttest.c b/tests/fchosttest.c index 05ff20b..b5291f0 100644 --- a/tests/fchosttest.c +++ b/tests/fchosttest.c @@ -169,15 +169,15 @@ mymain(void) goto cleanup; } - if (virtTestRun("test1", 1, test1, NULL) < 0) + if (virtTestRun("test1", test1, NULL) < 0) ret = -1; - if (virtTestRun("test2", 1, test2, NULL) < 0) + if (virtTestRun("test2", test2, NULL) < 0) ret = -1; - if (virtTestRun("test3", 1, test3, NULL) < 0) + if (virtTestRun("test3", test3, NULL) < 0) ret = -1; - if (virtTestRun("test4", 1, test4, NULL) < 0) + if (virtTestRun("test4", test4, NULL) < 0) ret = -1; - if (virtTestRun("test5", 1, test5, NULL) < 0) + if (virtTestRun("test5", test5, NULL) < 0) ret = -1; cleanup: diff --git a/tests/fdstreamtest.c b/tests/fdstreamtest.c index 7bd6e23..0eeb8a5 100644 --- a/tests/fdstreamtest.c +++ b/tests/fdstreamtest.c @@ -328,13 +328,13 @@ mymain(void) abort(); } - if (virtTestRun("Stream read blocking ", 1, testFDStreamReadBlock, scratchdir) < 0) + if (virtTestRun("Stream read blocking ", testFDStreamReadBlock, scratchdir) < 0) ret = -1; - if (virtTestRun("Stream read non-blocking ", 1, testFDStreamReadNonblock, scratchdir) < 0) + if (virtTestRun("Stream read non-blocking ", testFDStreamReadNonblock, scratchdir) < 0) ret = -1; - if (virtTestRun("Stream write blocking ", 1, testFDStreamWriteBlock, scratchdir) < 0) + if (virtTestRun("Stream write blocking ", testFDStreamWriteBlock, scratchdir) < 0) ret = -1; - if (virtTestRun("Stream write non-blocking ", 1, testFDStreamWriteNonblock, scratchdir) < 0) + if (virtTestRun("Stream write non-blocking ", testFDStreamWriteNonblock, scratchdir) < 0) ret = -1; if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) diff --git a/tests/interfacexml2xmltest.c b/tests/interfacexml2xmltest.c index 8092a59..13f9053 100644 --- a/tests/interfacexml2xmltest.c +++ b/tests/interfacexml2xmltest.c @@ -69,9 +69,9 @@ mymain(void) { int ret = 0; -#define DO_TEST(name) \ - if (virtTestRun("Interface XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, (name)) < 0) \ +#define DO_TEST(name) \ + if (virtTestRun("Interface XML-2-XML " name, \ + testCompareXMLToXMLHelper, (name)) < 0) \ ret = -1 DO_TEST("ethernet-dhcp"); diff --git a/tests/jsontest.c b/tests/jsontest.c index 1d385d4..6add816 100644 --- a/tests/jsontest.c +++ b/tests/jsontest.c @@ -138,7 +138,7 @@ mymain(void) #define DO_TEST_FULL(name, cmd, doc, expect, pass) \ do { \ struct testInfo info = { doc, expect, pass }; \ - if (virtTestRun(name, 1, testJSON ## cmd, &info) < 0) \ + if (virtTestRun(name, testJSON ## cmd, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/libvirtdconftest.c b/tests/libvirtdconftest.c index ba61a0f..fbc0f3f 100644 --- a/tests/libvirtdconftest.c +++ b/tests/libvirtdconftest.c @@ -223,7 +223,7 @@ mymain(void) VIR_DEBUG("Initial config [%s]", filedata); for (i = 0; params[i] != 0; i++) { const struct testCorruptData data = { params, filedata, filename, i }; - if (virtTestRun("Test corruption", 1, testCorrupt, &data) < 0) + if (virtTestRun("Test corruption", testCorrupt, &data) < 0) ret = -1; } diff --git a/tests/lxcxml2xmltest.c b/tests/lxcxml2xmltest.c index aeb3940..5846ab0 100644 --- a/tests/lxcxml2xmltest.c +++ b/tests/lxcxml2xmltest.c @@ -117,8 +117,8 @@ mymain(void) # define DO_TEST_FULL(name, is_different, inactive) \ do { \ const struct testInfo info = {name, is_different, inactive}; \ - if (virtTestRun("LXC XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, &info) < 0) \ + if (virtTestRun("LXC XML-2-XML " name, \ + testCompareXMLToXMLHelper, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/metadatatest.c b/tests/metadatatest.c index 30c43ba..0896c52 100644 --- a/tests/metadatatest.c +++ b/tests/metadatatest.c @@ -231,11 +231,11 @@ mymain(void) virtTestQuiesceLibvirtErrors(false); - if (virtTestRun("Assign metadata ", 1, testAssignMetadata, &test) < 0) + if (virtTestRun("Assign metadata ", testAssignMetadata, &test) < 0) ret = EXIT_FAILURE; - if (virtTestRun("Rewrite Metadata ", 1, testRewriteMetadata, &test) < 0) + if (virtTestRun("Rewrite Metadata ", testRewriteMetadata, &test) < 0) ret = EXIT_FAILURE; - if (virtTestRun("Erase metadata ", 1, testEraseMetadata, &test) < 0) + if (virtTestRun("Erase metadata ", testEraseMetadata, &test) < 0) ret = EXIT_FAILURE; virDomainFree(test.dom); diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c index ad50e88..d968568 100644 --- a/tests/networkxml2conftest.c +++ b/tests/networkxml2conftest.c @@ -130,7 +130,7 @@ mymain(void) info.name = xname; \ info.caps = xcaps; \ if (virtTestRun("Network XML-2-Conf " xname, \ - 1, testCompareXMLToConfHelper, &info) < 0) { \ + testCompareXMLToConfHelper, &info) < 0) { \ ret = -1; \ } \ } while (0) diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c index c4fca08..0a92513 100644 --- a/tests/networkxml2xmltest.c +++ b/tests/networkxml2xmltest.c @@ -90,7 +90,7 @@ mymain(void) do { \ const struct testInfo info = {name, flags}; \ if (virtTestRun("Network XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, &info) < 0) \ + testCompareXMLToXMLHelper, &info) < 0) \ ret = -1; \ } while (0) #define DO_TEST(name) DO_TEST_FULL(name, 0) diff --git a/tests/networkxml2xmlupdatetest.c b/tests/networkxml2xmlupdatetest.c index e5a17b2..6263dac 100644 --- a/tests/networkxml2xmlupdatetest.c +++ b/tests/networkxml2xmlupdatetest.c @@ -130,7 +130,7 @@ mymain(void) command, section, flags, \ parentIndex, expectFailure}; \ if (virtTestRun("Network XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, &info) < 0) \ + testCompareXMLToXMLHelper, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/nodedevxml2xmltest.c b/tests/nodedevxml2xmltest.c index d4f7ee7..2ebdee1 100644 --- a/tests/nodedevxml2xmltest.c +++ b/tests/nodedevxml2xmltest.c @@ -69,9 +69,9 @@ mymain(void) { int ret = 0; -#define DO_TEST(name) \ - if (virtTestRun("Node device XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, (name)) < 0) \ +#define DO_TEST(name) \ + if (virtTestRun("Node device XML-2-XML " name, \ + testCompareXMLToXMLHelper, (name)) < 0) \ ret = -1 DO_TEST("computer"); diff --git a/tests/nodeinfotest.c b/tests/nodeinfotest.c index db637ce..74f6d4d 100644 --- a/tests/nodeinfotest.c +++ b/tests/nodeinfotest.c @@ -142,7 +142,7 @@ mymain(void) return EXIT_FAILURE; for (i = 0; i < ARRAY_CARDINALITY(nodeData); i++) - if (virtTestRun(nodeData[i], 1, linuxTestNodeInfo, nodeData[i]) != 0) + if (virtTestRun(nodeData[i], linuxTestNodeInfo, nodeData[i]) != 0) ret = -1; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/nwfilterxml2xmltest.c b/tests/nwfilterxml2xmltest.c index 84e61da..8318bae 100644 --- a/tests/nwfilterxml2xmltest.c +++ b/tests/nwfilterxml2xmltest.c @@ -104,7 +104,7 @@ mymain(void) .expect_warning = EXPECT_WARN, \ }; \ if (virtTestRun("NWFilter XML-2-XML " NAME, \ - 1, testCompareXMLToXMLHelper, (&tp)) < 0) \ + testCompareXMLToXMLHelper, (&tp)) < 0) \ ret = -1; \ } while (0) diff --git a/tests/openvzutilstest.c b/tests/openvzutilstest.c index ee68c06..3858b42 100644 --- a/tests/openvzutilstest.c +++ b/tests/openvzutilstest.c @@ -148,7 +148,7 @@ mymain(void) # define DO_TEST(_name) \ do { \ - if (virtTestRun("OpenVZ "#_name, 1, test##_name, \ + if (virtTestRun("OpenVZ "#_name, test##_name, \ NULL) < 0) { \ result = -1; \ } \ diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c index 4e27981..7a49b0b 100644 --- a/tests/qemuagenttest.c +++ b/tests/qemuagenttest.c @@ -594,8 +594,8 @@ mymain(void) virEventRegisterDefaultImpl(); -#define DO_TEST(name) \ - if (virtTestRun(# name, 1, testQemuAgent ## name, xmlopt) < 0) \ +#define DO_TEST(name) \ + if (virtTestRun(# name, testQemuAgent ## name, xmlopt) < 0) \ ret = -1 DO_TEST(FSFreeze); diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index 5cf7828..6dd8bb0 100644 --- a/tests/qemuargv2xmltest.c +++ b/tests/qemuargv2xmltest.c @@ -126,11 +126,11 @@ mymain(void) if (!(driver.xmlopt = virQEMUDriverCreateXMLConf(&driver))) return EXIT_FAILURE; -# define DO_TEST_FULL(name, extraFlags, migrateFrom) \ +# define DO_TEST_FULL(name, extraFlags, migrateFrom) \ do { \ const struct testInfo info = { name, extraFlags, migrateFrom }; \ if (virtTestRun("QEMU ARGV-2-XML " name, \ - 1, testCompareXMLToArgvHelper, &info) < 0) \ + testCompareXMLToArgvHelper, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c index a1cf568..3628fbe 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -141,7 +141,7 @@ mymain(void) return EXIT_FAILURE; \ virQEMUCapsSetList(info.flags, __VA_ARGS__, QEMU_CAPS_LAST); \ if (virtTestRun("QEMU Help String Parsing " name, \ - 1, testHelpStrParsing, &info) < 0) \ + testHelpStrParsing, &info) < 0) \ ret = -1; \ virObjectUnref(info.flags); \ } while (0) diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 89480af..5126b74 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -372,7 +372,7 @@ mymain(void) data.mon = my_mon; \ data.keep = kep; \ data.deviceDeletedEvent = event; \ - if (virtTestRun(name, 1, testQemuHotplug, &data) < 0) \ + if (virtTestRun(name, testQemuHotplug, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 0fb8d65..df79a74 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1055,14 +1055,14 @@ mymain(void) virEventRegisterDefaultImpl(); -#define DO_TEST(name) \ - if (virtTestRun(# name, 1, testQemuMonitorJSON ## name, xmlopt) < 0) \ +#define DO_TEST(name) \ + if (virtTestRun(# name, testQemuMonitorJSON ## name, xmlopt) < 0) \ ret = -1 -#define DO_TEST_SIMPLE(CMD, FNC, ...) \ +#define DO_TEST_SIMPLE(CMD, FNC, ...) \ simpleFunc = (testQemuMonitorJSONSimpleFuncData) {.cmd = CMD, .func = FNC, \ .xmlopt = xmlopt, __VA_ARGS__ }; \ - if (virtTestRun(# FNC, 1, testQemuMonitorJSONSimpleFunc, &simpleFunc) < 0) \ + if (virtTestRun(# FNC, testQemuMonitorJSONSimpleFunc, &simpleFunc) < 0) \ ret = -1 DO_TEST(GetStatus); diff --git a/tests/qemumonitortest.c b/tests/qemumonitortest.c index 3851251..1c13a89 100644 --- a/tests/qemumonitortest.c +++ b/tests/qemumonitortest.c @@ -93,7 +93,7 @@ mymain(void) # define DO_TEST(_name) \ do { \ - if (virtTestRun("qemu monitor "#_name, 1, test##_name, \ + if (virtTestRun("qemu monitor "#_name, test##_name, \ NULL) < 0) { \ result = -1; \ } \ diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 0b808a4..5658792 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -332,7 +332,7 @@ mymain(void) return EXIT_FAILURE; \ virQEMUCapsSetList(info.extraFlags, __VA_ARGS__, QEMU_CAPS_LAST);\ if (virtTestRun("QEMU XML-2-ARGV " name, \ - 1, testCompareXMLToArgvHelper, &info) < 0) \ + testCompareXMLToArgvHelper, &info) < 0) \ ret = -1; \ virObjectUnref(info.extraFlags); \ } while (0) diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 9fd3ada..4e308b4 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -120,7 +120,7 @@ mymain(void) do { \ const struct testInfo info = {name, is_different, when}; \ if (virtTestRun("QEMU XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, &info) < 0) \ + testCompareXMLToXMLHelper, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/qemuxmlnstest.c b/tests/qemuxmlnstest.c index 9f4f442..2cc15d1 100644 --- a/tests/qemuxmlnstest.c +++ b/tests/qemuxmlnstest.c @@ -225,7 +225,7 @@ mymain(void) return EXIT_FAILURE; \ virQEMUCapsSetList(info.extraFlags, __VA_ARGS__, QEMU_CAPS_LAST);\ if (virtTestRun("QEMU XML-2-ARGV " name, \ - 1, testCompareXMLToArgvHelper, &info) < 0) \ + testCompareXMLToArgvHelper, &info) < 0) \ ret = -1; \ virObjectUnref(info.extraFlags); \ } while (0) diff --git a/tests/securityselinuxlabeltest.c b/tests/securityselinuxlabeltest.c index fa99f99..d1fd92f 100644 --- a/tests/securityselinuxlabeltest.c +++ b/tests/securityselinuxlabeltest.c @@ -335,9 +335,9 @@ mymain(void) if (!(xmlopt = virQEMUDriverCreateXMLConf(NULL))) return EXIT_FAILURE; -#define DO_TEST_LABELING(name) \ - if (virtTestRun("Labelling " # name, 1, testSELinuxLabeling, name) < 0) \ - ret = -1; \ +#define DO_TEST_LABELING(name) \ + if (virtTestRun("Labelling " # name, testSELinuxLabeling, name) < 0) \ + ret = -1; setcon((security_context_t)"system_r:system_u:libvirtd_t:s0:c0.c1023"); diff --git a/tests/securityselinuxtest.c b/tests/securityselinuxtest.c index e2806c1..99b9b24 100644 --- a/tests/securityselinuxtest.c +++ b/tests/securityselinuxtest.c @@ -291,7 +291,7 @@ mymain(void) user, role, imageRole, type, imageType, \ sensMin, sensMax, catMin, catMax \ }; \ - if (virtTestRun("GenLabel " # desc, 1, testSELinuxGenLabel, &data) < 0) \ + if (virtTestRun("GenLabel " # desc, testSELinuxGenLabel, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c index b939319..f8b0661 100644 --- a/tests/sexpr2xmltest.c +++ b/tests/sexpr2xmltest.c @@ -123,7 +123,7 @@ mymain(void) struct testInfo info = { in, out, version }; \ virResetLastError(); \ if (virtTestRun("Xen SEXPR-2-XML " in " -> " out, \ - 1, testCompareHelper, &info) < 0) \ + testCompareHelper, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/sockettest.c b/tests/sockettest.c index 6842ba4..4b38cdf 100644 --- a/tests/sockettest.c +++ b/tests/sockettest.c @@ -190,7 +190,7 @@ mymain(void) struct testParseData data = { &addr, addrstr, family, pass }; \ memset(&addr, 0, sizeof(addr)); \ if (virtTestRun("Test parse " addrstr, \ - 1, testParseHelper, &data) < 0) \ + testParseHelper, &data) < 0) \ ret = -1; \ } while (0) @@ -200,11 +200,11 @@ mymain(void) struct testParseData data = { &addr, addrstr, family, pass }; \ memset(&addr, 0, sizeof(addr)); \ if (virtTestRun("Test parse " addrstr " family " #family, \ - 1, testParseHelper, &data) < 0) \ + testParseHelper, &data) < 0) \ ret = -1; \ struct testFormatData data2 = { &addr, addrstr, pass }; \ if (virtTestRun("Test format " addrstr " family " #family, \ - 1, testFormatHelper, &data2) < 0) \ + testFormatHelper, &data2) < 0) \ ret = -1; \ } while (0) @@ -214,11 +214,11 @@ mymain(void) struct testParseData data = { &addr, addrstr, family, true}; \ memset(&addr, 0, sizeof(addr)); \ if (virtTestRun("Test parse " addrstr " family " #family, \ - 1, testParseHelper, &data) < 0) \ + testParseHelper, &data) < 0) \ ret = -1; \ struct testFormatData data2 = { &addr, addrformated, pass }; \ if (virtTestRun("Test format " addrstr " family " #family, \ - 1, testFormatHelper, &data2) < 0) \ + testFormatHelper, &data2) < 0) \ ret = -1; \ } while (0) @@ -226,7 +226,7 @@ mymain(void) do { \ struct testRangeData data = { saddr, eaddr, size, pass }; \ if (virtTestRun("Test range " saddr " -> " eaddr " size " #size, \ - 1, testRangeHelper, &data) < 0) \ + testRangeHelper, &data) < 0) \ ret = -1; \ } while (0) @@ -234,14 +234,14 @@ mymain(void) do { \ struct testNetmaskData data = { addr1, addr2, netmask, pass }; \ if (virtTestRun("Test netmask " addr1 " + " addr2 " in " netmask, \ - 1, testNetmaskHelper, &data) < 0) \ + testNetmaskHelper, &data) < 0) \ ret = -1; \ } while (0) #define DO_TEST_WILDCARD(addr, pass) \ do { \ struct testWildcardData data = { addr, pass}; \ - if (virtTestRun("Test wildcard " addr, 1, \ + if (virtTestRun("Test wildcard " addr, \ testWildcardHelper, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/statstest.c b/tests/statstest.c index 94ccd4f..441cedb 100644 --- a/tests/statstest.c +++ b/tests/statstest.c @@ -67,7 +67,7 @@ mymain(void) do { \ struct testInfo info = { dev, num }; \ if (virtTestRun("Device " dev " -> " # num, \ - 1, testDeviceHelper, &info) < 0) \ + testDeviceHelper, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/storagepoolxml2xmltest.c b/tests/storagepoolxml2xmltest.c index d59cff9..0ae9b29 100644 --- a/tests/storagepoolxml2xmltest.c +++ b/tests/storagepoolxml2xmltest.c @@ -79,9 +79,9 @@ mymain(void) { int ret = 0; -#define DO_TEST(name) \ - if (virtTestRun("Storage Pool XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, (name)) < 0) \ +#define DO_TEST(name) \ + if (virtTestRun("Storage Pool XML-2-XML " name, \ + testCompareXMLToXMLHelper, (name)) < 0) \ ret = -1 DO_TEST("pool-dir"); diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c index cafcaad..ed9a520 100644 --- a/tests/storagevolxml2argvtest.c +++ b/tests/storagevolxml2argvtest.c @@ -212,7 +212,7 @@ mymain(void) struct testInfo info = { shouldFail, pool, vol, inputpool, inputvol, \ cmdline, flags, imgformat }; \ if (virtTestRun("Storage Vol XML-2-argv " cmdline, \ - 1, testCompareXMLToArgvHelper, &info) < 0) \ + testCompareXMLToArgvHelper, &info) < 0) \ ret = -1; \ } \ while (0); diff --git a/tests/storagevolxml2xmltest.c b/tests/storagevolxml2xmltest.c index 5b0a60b..1fd01f1 100644 --- a/tests/storagevolxml2xmltest.c +++ b/tests/storagevolxml2xmltest.c @@ -100,13 +100,13 @@ mymain(void) { int ret = 0; -#define DO_TEST(pool, name) \ - do { \ - struct testInfo info = { pool, name }; \ - if (virtTestRun("Storage Vol XML-2-XML " name, \ - 1, testCompareXMLToXMLHelper, &info) < 0) \ - ret = -1; \ - } \ +#define DO_TEST(pool, name) \ + do { \ + struct testInfo info = { pool, name }; \ + if (virtTestRun("Storage Vol XML-2-XML " name, \ + testCompareXMLToXMLHelper, &info) < 0) \ + ret = -1; \ + } \ while (0); DO_TEST("pool-dir", "vol-file"); diff --git a/tests/sysinfotest.c b/tests/sysinfotest.c index ba57a7a..74c4700 100644 --- a/tests/sysinfotest.c +++ b/tests/sysinfotest.c @@ -117,7 +117,7 @@ sysinfotest_run(const char *test, goto error; } - if (virtTestRun(test, 1, testSysinfo, &testdata) < 0) + if (virtTestRun(test, testSysinfo, &testdata) < 0) goto error; ret = EXIT_SUCCESS; diff --git a/tests/testutils.c b/tests/testutils.c index da69d53..7d020db 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -123,16 +123,15 @@ void virtTestResult(const char *name, int ret, const char *msg, ...) } /* - * Runs test and count average time (if the nloops is grater than 1) + * Runs test * * returns: -1 = error, 0 = success */ int -virtTestRun(const char *title, int nloops, int (*body)(const void *data), const void *data) +virtTestRun(const char *title, + int (*body)(const void *data), const void *data) { int ret = 0; - size_t i; - double *ts = NULL; if (testCounter == 0 && !virTestGetVerbose()) fprintf(stderr, " "); @@ -149,37 +148,16 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const if (virTestGetVerbose()) fprintf(stderr, "%2zu) %-65s ... ", testCounter, title); - if (nloops > 1 && (VIR_ALLOC_N(ts, nloops) < 0)) - return -1; - - for (i=0; i < nloops; i++) { - struct timeval before, after; - - if (ts) - GETTIMEOFDAY(&before); - - virResetLastError(); - ret = body(data); - virErrorPtr err = virGetLastError(); - if (err) { - if (virTestGetVerbose() || virTestGetDebug()) - virDispatchError(NULL); - } - - if (ret != 0) { - break; - } - - if (ts) { - GETTIMEOFDAY(&after); - ts[i] = DIFF_MSEC(&after, &before); - } + virResetLastError(); + ret = body(data); + virErrorPtr err = virGetLastError(); + if (err) { + if (virTestGetVerbose() || virTestGetDebug()) + virDispatchError(NULL); } + if (virTestGetVerbose()) { - if (ret == 0 && ts) - fprintf(stderr, "OK [%.5f ms]\n", - virtTestCountAverage(ts, nloops)); - else if (ret == 0) + if (ret == 0) fprintf(stderr, "OK\n"); else if (ret == EXIT_AM_SKIP) fprintf(stderr, "SKIP\n"); @@ -199,7 +177,6 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const fprintf(stderr, "!"); } - VIR_FREE(ts); return ret; } diff --git a/tests/testutils.h b/tests/testutils.h index 2da6424..96edeb9 100644 --- a/tests/testutils.h +++ b/tests/testutils.h @@ -46,7 +46,6 @@ double virtTestCountAverage(double *items, void virtTestResult(const char *name, int ret, const char *msg, ...) ATTRIBUTE_FMT_PRINTF(3,4); int virtTestRun(const char *title, - int nloops, int (*body)(const void *data), const void *data); int virtTestLoadFile(const char *file, char **buf); diff --git a/tests/utiltest.c b/tests/utiltest.c index 422f4e8..89e82aa 100644 --- a/tests/utiltest.c +++ b/tests/utiltest.c @@ -152,9 +152,9 @@ mymain(void) virtTestQuiesceLibvirtErrors(true); -#define DO_TEST(_name) \ +#define DO_TEST(_name) \ do { \ - if (virtTestRun("Util "#_name, 1, test##_name, \ + if (virtTestRun("Util "#_name, test##_name, \ NULL) < 0) { \ result = -1; \ } \ diff --git a/tests/viratomictest.c b/tests/viratomictest.c index 40a05b8..d092b95 100644 --- a/tests/viratomictest.c +++ b/tests/viratomictest.c @@ -167,9 +167,9 @@ mymain(void) if (virThreadInitialize() < 0) return -1; - if (virtTestRun("types", 1, testTypes, NULL) < 0) + if (virtTestRun("types", testTypes, NULL) < 0) ret = -1; - if (virtTestRun("threads", 1, testThreads, NULL) < 0) + if (virtTestRun("threads", testThreads, NULL) < 0) ret = -1; return ret; diff --git a/tests/virauthconfigtest.c b/tests/virauthconfigtest.c index a27bae5..0bed997 100644 --- a/tests/virauthconfigtest.c +++ b/tests/virauthconfigtest.c @@ -96,7 +96,7 @@ mymain(void) config, hostname, service, credname, expect \ }; \ if (virtTestRun("Test Lookup " hostname "-" service "-" credname, \ - 1, testAuthLookup, &data) < 0) \ + testAuthLookup, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/virbitmaptest.c b/tests/virbitmaptest.c index 7ec78fd..64fa769 100644 --- a/tests/virbitmaptest.c +++ b/tests/virbitmaptest.c @@ -502,23 +502,23 @@ mymain(void) { int ret = 0; - if (virtTestRun("test1", 1, test1, NULL) < 0) + if (virtTestRun("test1", test1, NULL) < 0) ret = -1; - if (virtTestRun("test2", 1, test2, NULL) < 0) + if (virtTestRun("test2", test2, NULL) < 0) ret = -1; - if (virtTestRun("test3", 1, test3, NULL) < 0) + if (virtTestRun("test3", test3, NULL) < 0) ret = -1; - if (virtTestRun("test4", 1, test4, NULL) < 0) + if (virtTestRun("test4", test4, NULL) < 0) ret = -1; - if (virtTestRun("test5", 1, test5, NULL) < 0) + if (virtTestRun("test5", test5, NULL) < 0) ret = -1; - if (virtTestRun("test6", 1, test6, NULL) < 0) + if (virtTestRun("test6", test6, NULL) < 0) ret = -1; - if (virtTestRun("test7", 1, test7, NULL) < 0) + if (virtTestRun("test7", test7, NULL) < 0) ret = -1; - if (virtTestRun("test8", 1, test8, NULL) < 0) + if (virtTestRun("test8", test8, NULL) < 0) ret = -1; - if (virtTestRun("test9", 1, test9, NULL) < 0) + if (virtTestRun("test9", test9, NULL) < 0) ret = -1; return ret; diff --git a/tests/virbuftest.c b/tests/virbuftest.c index a6dcae6..1645e76 100644 --- a/tests/virbuftest.c +++ b/tests/virbuftest.c @@ -210,7 +210,7 @@ mymain(void) #define DO_TEST(msg, cb, data) \ do { \ struct testInfo info = { data }; \ - if (virtTestRun("Buf: " msg, 1, cb, &info) < 0) \ + if (virtTestRun("Buf: " msg, cb, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/vircgrouptest.c b/tests/vircgrouptest.c index 570e061..d5ed016 100644 --- a/tests/vircgrouptest.c +++ b/tests/vircgrouptest.c @@ -550,38 +550,38 @@ mymain(void) setenv("LIBVIRT_FAKE_SYSFS_DIR", fakesysfsdir, 1); - if (virtTestRun("New cgroup for self", 1, testCgroupNewForSelf, NULL) < 0) + if (virtTestRun("New cgroup for self", testCgroupNewForSelf, NULL) < 0) ret = -1; - if (virtTestRun("New cgroup for partition", 1, testCgroupNewForPartition, NULL) < 0) + if (virtTestRun("New cgroup for partition", testCgroupNewForPartition, NULL) < 0) ret = -1; - if (virtTestRun("New cgroup for partition nested", 1, testCgroupNewForPartitionNested, NULL) < 0) + if (virtTestRun("New cgroup for partition nested", testCgroupNewForPartitionNested, NULL) < 0) ret = -1; - if (virtTestRun("New cgroup for partition nested deeply", 1, testCgroupNewForPartitionNestedDeep, NULL) < 0) + if (virtTestRun("New cgroup for partition nested deeply", testCgroupNewForPartitionNestedDeep, NULL) < 0) ret = -1; - if (virtTestRun("New cgroup for domain partition", 1, testCgroupNewForPartitionDomain, NULL) < 0) + if (virtTestRun("New cgroup for domain partition", testCgroupNewForPartitionDomain, NULL) < 0) ret = -1; - if (virtTestRun("New cgroup for domain partition escaped", 1, testCgroupNewForPartitionDomainEscaped, NULL) < 0) + if (virtTestRun("New cgroup for domain partition escaped", testCgroupNewForPartitionDomainEscaped, NULL) < 0) ret = -1; - if (virtTestRun("Cgroup available", 1, testCgroupAvailable, (void*)0x1) < 0) + if (virtTestRun("Cgroup available", testCgroupAvailable, (void*)0x1) < 0) ret = -1; setenv("VIR_CGROUP_MOCK_MODE", "allinone", 1); - if (virtTestRun("New cgroup for self (allinone)", 1, testCgroupNewForSelfAllInOne, NULL) < 0) + if (virtTestRun("New cgroup for self (allinone)", testCgroupNewForSelfAllInOne, NULL) < 0) ret = -1; - if (virtTestRun("Cgroup available", 1, testCgroupAvailable, (void*)0x1) < 0) + if (virtTestRun("Cgroup available", testCgroupAvailable, (void*)0x1) < 0) ret = -1; unsetenv("VIR_CGROUP_MOCK_MODE"); setenv("VIR_CGROUP_MOCK_MODE", "logind", 1); - if (virtTestRun("New cgroup for self (logind)", 1, testCgroupNewForSelfLogind, NULL) < 0) + if (virtTestRun("New cgroup for self (logind)", testCgroupNewForSelfLogind, NULL) < 0) ret = -1; - if (virtTestRun("Cgroup available", 1, testCgroupAvailable, (void*)0x0) < 0) + if (virtTestRun("Cgroup available", testCgroupAvailable, (void*)0x0) < 0) ret = -1; unsetenv("VIR_CGROUP_MOCK_MODE"); diff --git a/tests/virdbustest.c b/tests/virdbustest.c index 083202c..cd4edc7 100644 --- a/tests/virdbustest.c +++ b/tests/virdbustest.c @@ -377,15 +377,15 @@ mymain(void) { int ret = 0; - if (virtTestRun("Test message simple ", 1, testMessageSimple, NULL) < 0) + if (virtTestRun("Test message simple ", testMessageSimple, NULL) < 0) ret = -1; - if (virtTestRun("Test message variant ", 1, testMessageVariant, NULL) < 0) + if (virtTestRun("Test message variant ", testMessageVariant, NULL) < 0) ret = -1; - if (virtTestRun("Test message array ", 1, testMessageArray, NULL) < 0) + if (virtTestRun("Test message array ", testMessageArray, NULL) < 0) ret = -1; - if (virtTestRun("Test message struct ", 1, testMessageStruct, NULL) < 0) + if (virtTestRun("Test message struct ", testMessageStruct, NULL) < 0) ret = -1; - if (virtTestRun("Test message dict ", 1, testMessageDict, NULL) < 0) + if (virtTestRun("Test message dict ", testMessageDict, NULL) < 0) ret = -1; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/virdrivermoduletest.c b/tests/virdrivermoduletest.c index 1aae245..ba6e39d 100644 --- a/tests/virdrivermoduletest.c +++ b/tests/virdrivermoduletest.c @@ -59,7 +59,7 @@ mymain(void) #define TEST(name, dep1) \ do { \ const struct testDriverData data = { name, dep1 }; \ - if (virtTestRun("Test driver " # name, 1, testDriverModule, &data) < 0) \ + if (virtTestRun("Test driver " # name, testDriverModule, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/virendiantest.c b/tests/virendiantest.c index 3dde897..4f672ce 100644 --- a/tests/virendiantest.c +++ b/tests/virendiantest.c @@ -91,9 +91,9 @@ mymain(void) { int ret = 0; - if (virtTestRun("test1", 1, test1, NULL) < 0) + if (virtTestRun("test1", test1, NULL) < 0) ret = -1; - if (virtTestRun("test2", 1, test2, NULL) < 0) + if (virtTestRun("test2", test2, NULL) < 0) ret = -1; return ret; diff --git a/tests/virhashtest.c b/tests/virhashtest.c index dd2c948..5119781 100644 --- a/tests/virhashtest.c +++ b/tests/virhashtest.c @@ -668,7 +668,7 @@ mymain(void) #define DO_TEST_FULL(name, cmd, data, count) \ do { \ struct testInfo info = { data, count }; \ - if (virtTestRun(name, 1, testHash ## cmd, &info) < 0) \ + if (virtTestRun(name, testHash ## cmd, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/viridentitytest.c b/tests/viridentitytest.c index 269a57d..814db4f 100644 --- a/tests/viridentitytest.c +++ b/tests/viridentitytest.c @@ -164,9 +164,9 @@ mymain(void) { int ret = 0; - if (virtTestRun("Identity attributes ", 1, testIdentityAttrs, NULL) < 0) + if (virtTestRun("Identity attributes ", testIdentityAttrs, NULL) < 0) ret = -1; - if (virtTestRun("Identity equality ", 1, testIdentityEqual, NULL) < 0) + if (virtTestRun("Identity equality ", testIdentityEqual, NULL) < 0) ret = -1; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/virkeycodetest.c b/tests/virkeycodetest.c index 53f9d48..5d1a87b 100644 --- a/tests/virkeycodetest.c +++ b/tests/virkeycodetest.c @@ -96,9 +96,9 @@ mymain(void) { int ret = 0; - if (virtTestRun("Keycode mapping ", 1, testKeycodeMapping, NULL) < 0) + if (virtTestRun("Keycode mapping ", testKeycodeMapping, NULL) < 0) ret = -1; - if (virtTestRun("Keycode strings ", 1, testKeycodeStrings, NULL) < 0) + if (virtTestRun("Keycode strings ", testKeycodeStrings, NULL) < 0) ret = -1; return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/virkeyfiletest.c b/tests/virkeyfiletest.c index 8fe7e38..1570ad6 100644 --- a/tests/virkeyfiletest.c +++ b/tests/virkeyfiletest.c @@ -113,7 +113,7 @@ mymain(void) signal(SIGPIPE, SIG_IGN); - if (virtTestRun("Test parse", 1, testParse, NULL) < 0) + if (virtTestRun("Test parse", testParse, NULL) < 0) ret = -1; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/virlockspacetest.c b/tests/virlockspacetest.c index 1985a4a..78094ef 100644 --- a/tests/virlockspacetest.c +++ b/tests/virlockspacetest.c @@ -345,25 +345,25 @@ mymain(void) signal(SIGPIPE, SIG_IGN); - if (virtTestRun("Lockspace creation", 1, testLockSpaceCreate, NULL) < 0) + if (virtTestRun("Lockspace creation", testLockSpaceCreate, NULL) < 0) ret = -1; - if (virtTestRun("Lockspace res lifecycle", 1, testLockSpaceResourceLifecycle, NULL) < 0) + if (virtTestRun("Lockspace res lifecycle", testLockSpaceResourceLifecycle, NULL) < 0) ret = -1; - if (virtTestRun("Lockspace res lock excl", 1, testLockSpaceResourceLockExcl, NULL) < 0) + if (virtTestRun("Lockspace res lock excl", testLockSpaceResourceLockExcl, NULL) < 0) ret = -1; - if (virtTestRun("Lockspace res lock shr", 1, testLockSpaceResourceLockShr, NULL) < 0) + if (virtTestRun("Lockspace res lock shr", testLockSpaceResourceLockShr, NULL) < 0) ret = -1; - if (virtTestRun("Lockspace res lock excl auto", 1, testLockSpaceResourceLockExclAuto, NULL) < 0) + if (virtTestRun("Lockspace res lock excl auto", testLockSpaceResourceLockExclAuto, NULL) < 0) ret = -1; - if (virtTestRun("Lockspace res lock shr auto", 1, testLockSpaceResourceLockShrAuto, NULL) < 0) + if (virtTestRun("Lockspace res lock shr auto", testLockSpaceResourceLockShrAuto, NULL) < 0) ret = -1; - if (virtTestRun("Lockspace res full path", 1, testLockSpaceResourceLockPath, NULL) < 0) + if (virtTestRun("Lockspace res full path", testLockSpaceResourceLockPath, NULL) < 0) ret = -1; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/virnetmessagetest.c b/tests/virnetmessagetest.c index eabc609..ad619de 100644 --- a/tests/virnetmessagetest.c +++ b/tests/virnetmessagetest.c @@ -527,19 +527,19 @@ mymain(void) signal(SIGPIPE, SIG_IGN); - if (virtTestRun("Message Header Encode", 1, testMessageHeaderEncode, NULL) < 0) + if (virtTestRun("Message Header Encode", testMessageHeaderEncode, NULL) < 0) ret = -1; - if (virtTestRun("Message Header Decode", 1, testMessageHeaderDecode, NULL) < 0) + if (virtTestRun("Message Header Decode", testMessageHeaderDecode, NULL) < 0) ret = -1; - if (virtTestRun("Message Payload Encode", 1, testMessagePayloadEncode, NULL) < 0) + if (virtTestRun("Message Payload Encode", testMessagePayloadEncode, NULL) < 0) ret = -1; - if (virtTestRun("Message Payload Decode", 1, testMessagePayloadDecode, NULL) < 0) + if (virtTestRun("Message Payload Decode", testMessagePayloadDecode, NULL) < 0) ret = -1; - if (virtTestRun("Message Payload Stream Encode", 1, testMessagePayloadStreamEncode, NULL) < 0) + if (virtTestRun("Message Payload Stream Encode", testMessagePayloadStreamEncode, NULL) < 0) ret = -1; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/virnetserverclienttest.c b/tests/virnetserverclienttest.c index eb5803f..9c4b4c6 100644 --- a/tests/virnetserverclienttest.c +++ b/tests/virnetserverclienttest.c @@ -143,7 +143,7 @@ mymain(void) int ret = 0; - if (virtTestRun("Identity", 1, + if (virtTestRun("Identity", testIdentity, NULL) < 0) ret = -1; diff --git a/tests/virnetsockettest.c b/tests/virnetsockettest.c index 5b434ba..b3e12f9 100644 --- a/tests/virnetsockettest.c +++ b/tests/virnetsockettest.c @@ -471,35 +471,35 @@ mymain(void) if (hasIPv4) { struct testTCPData tcpData = { "127.0.0.1", freePort, "127.0.0.1" }; - if (virtTestRun("Socket TCP/IPv4 Accept", 1, testSocketTCPAccept, &tcpData) < 0) + if (virtTestRun("Socket TCP/IPv4 Accept", testSocketTCPAccept, &tcpData) < 0) ret = -1; } if (hasIPv6) { struct testTCPData tcpData = { "::1", freePort, "::1" }; - if (virtTestRun("Socket TCP/IPv6 Accept", 1, testSocketTCPAccept, &tcpData) < 0) + if (virtTestRun("Socket TCP/IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) ret = -1; } if (hasIPv6 && hasIPv4) { struct testTCPData tcpData = { NULL, freePort, "127.0.0.1" }; - if (virtTestRun("Socket TCP/IPv4+IPv6 Accept", 1, testSocketTCPAccept, &tcpData) < 0) + if (virtTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) ret = -1; tcpData.cnode = "::1"; - if (virtTestRun("Socket TCP/IPv4+IPv6 Accept", 1, testSocketTCPAccept, &tcpData) < 0) + if (virtTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) ret = -1; } #endif #ifndef WIN32 - if (virtTestRun("Socket UNIX Accept", 1, testSocketUNIXAccept, NULL) < 0) + if (virtTestRun("Socket UNIX Accept", testSocketUNIXAccept, NULL) < 0) ret = -1; - if (virtTestRun("Socket UNIX Addrs", 1, testSocketUNIXAddrs, NULL) < 0) + if (virtTestRun("Socket UNIX Addrs", testSocketUNIXAddrs, NULL) < 0) ret = -1; - if (virtTestRun("Socket External Command /dev/zero", 1, testSocketCommandNormal, NULL) < 0) + if (virtTestRun("Socket External Command /dev/zero", testSocketCommandNormal, NULL) < 0) ret = -1; - if (virtTestRun("Socket External Command /dev/does-not-exist", 1, testSocketCommandFail, NULL) < 0) + if (virtTestRun("Socket External Command /dev/does-not-exist", testSocketCommandFail, NULL) < 0) ret = -1; struct testSSHData sshData1 = { @@ -512,7 +512,7 @@ mymain(void) "fi;" "'nc' $ARG -U /tmp/socket'\n", }; - if (virtTestRun("SSH test 1", 1, testSocketSSH, &sshData1) < 0) + if (virtTestRun("SSH test 1", testSocketSSH, &sshData1) < 0) ret = -1; struct testSSHData sshData2 = { @@ -531,7 +531,7 @@ mymain(void) "fi;" "'netcat' $ARG -U /tmp/socket'\n", }; - if (virtTestRun("SSH test 2", 1, testSocketSSH, &sshData2) < 0) + if (virtTestRun("SSH test 2", testSocketSSH, &sshData2) < 0) ret = -1; struct testSSHData sshData3 = { @@ -550,7 +550,7 @@ mymain(void) "fi;" "'netcat' $ARG -U /tmp/socket'\n", }; - if (virtTestRun("SSH test 3", 1, testSocketSSH, &sshData3) < 0) + if (virtTestRun("SSH test 3", testSocketSSH, &sshData3) < 0) ret = -1; struct testSSHData sshData4 = { @@ -558,7 +558,7 @@ mymain(void) .path = "/tmp/socket", .failConnect = true, }; - if (virtTestRun("SSH test 4", 1, testSocketSSH, &sshData4) < 0) + if (virtTestRun("SSH test 4", testSocketSSH, &sshData4) < 0) ret = -1; struct testSSHData sshData5 = { @@ -573,7 +573,7 @@ mymain(void) "'nc' $ARG -U /tmp/socket'\n", .dieEarly = true, }; - if (virtTestRun("SSH test 5", 1, testSocketSSH, &sshData5) < 0) + if (virtTestRun("SSH test 5", testSocketSSH, &sshData5) < 0) ret = -1; struct testSSHData sshData6 = { @@ -589,7 +589,7 @@ mymain(void) "fi;" "'nc' $ARG -U /tmp/socket'\n", }; - if (virtTestRun("SSH test 6", 1, testSocketSSH, &sshData6) < 0) + if (virtTestRun("SSH test 6", testSocketSSH, &sshData6) < 0) ret = -1; struct testSSHData sshData7 = { @@ -603,7 +603,7 @@ mymain(void) "fi;" "''nc -4'' $ARG -U /tmp/socket'\n", }; - if (virtTestRun("SSH test 7", 1, testSocketSSH, &sshData7) < 0) + if (virtTestRun("SSH test 7", testSocketSSH, &sshData7) < 0) ret = -1; #endif diff --git a/tests/virnettlscontexttest.c b/tests/virnettlscontexttest.c index 33f239c..fc512fc 100644 --- a/tests/virnettlscontexttest.c +++ b/tests/virnettlscontexttest.c @@ -120,7 +120,7 @@ mymain(void) data.cacrt = _caCrt; \ data.crt = _crt; \ data.expectFail = _expectFail; \ - if (virtTestRun("TLS Context " #_caCrt " + " #_crt, 1, \ + if (virtTestRun("TLS Context " #_caCrt " + " #_crt, \ testTLSContextInit, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/virnettlssessiontest.c b/tests/virnettlssessiontest.c index f5f7212..6d77d35 100644 --- a/tests/virnettlssessiontest.c +++ b/tests/virnettlssessiontest.c @@ -253,7 +253,7 @@ mymain(void) data.hostname = _hostname; \ data.wildcards = _wildcards; \ if (virtTestRun("TLS Session " #_serverCrt " + " #_clientCrt, \ - 1, testTLSSessionInit, &data) < 0) \ + testTLSSessionInit, &data) < 0) \ ret = -1; \ } while (0) @@ -271,7 +271,7 @@ mymain(void) data.hostname = _hostname; \ data.wildcards = _wildcards; \ if (virtTestRun("TLS Session " #_serverCrt " + " #_clientCrt, \ - 1, testTLSSessionInit, &data) < 0) \ + testTLSSessionInit, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/virportallocatortest.c b/tests/virportallocatortest.c index 615fa15..4d0518a 100644 --- a/tests/virportallocatortest.c +++ b/tests/virportallocatortest.c @@ -191,10 +191,10 @@ mymain(void) { int ret = 0; - if (virtTestRun("Test alloc all", 1, testAllocAll, NULL) < 0) + if (virtTestRun("Test alloc all", testAllocAll, NULL) < 0) ret = -1; - if (virtTestRun("Test alloc reuse", 1, testAllocReuse, NULL) < 0) + if (virtTestRun("Test alloc reuse", testAllocReuse, NULL) < 0) ret = -1; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/virshtest.c b/tests/virshtest.c index ca35bb0..9dc9898 100644 --- a/tests/virshtest.c +++ b/tests/virshtest.c @@ -241,77 +241,77 @@ mymain(void) return EXIT_FAILURE; if (virtTestRun("virsh list (default)", - 1, testCompareListDefault, NULL) != 0) + testCompareListDefault, NULL) != 0) ret = -1; if (virtTestRun("virsh list (custom)", - 1, testCompareListCustom, NULL) != 0) + testCompareListCustom, NULL) != 0) ret = -1; if (virtTestRun("virsh nodeinfo (default)", - 1, testCompareNodeinfoDefault, NULL) != 0) + testCompareNodeinfoDefault, NULL) != 0) ret = -1; if (virtTestRun("virsh nodeinfo (custom)", - 1, testCompareNodeinfoCustom, NULL) != 0) + testCompareNodeinfoCustom, NULL) != 0) ret = -1; if (virtTestRun("virsh dominfo (by id)", - 1, testCompareDominfoByID, NULL) != 0) + testCompareDominfoByID, NULL) != 0) ret = -1; if (virtTestRun("virsh dominfo (by uuid)", - 1, testCompareDominfoByUUID, NULL) != 0) + testCompareDominfoByUUID, NULL) != 0) ret = -1; if (virtTestRun("virsh dominfo (by name)", - 1, testCompareDominfoByName, NULL) != 0) + testCompareDominfoByName, NULL) != 0) ret = -1; if (virtTestRun("virsh domid (by name)", - 1, testCompareDomidByName, NULL) != 0) + testCompareDomidByName, NULL) != 0) ret = -1; if (virtTestRun("virsh domid (by uuid)", - 1, testCompareDomidByUUID, NULL) != 0) + testCompareDomidByUUID, NULL) != 0) ret = -1; if (virtTestRun("virsh domuuid (by id)", - 1, testCompareDomuuidByID, NULL) != 0) + testCompareDomuuidByID, NULL) != 0) ret = -1; if (virtTestRun("virsh domuuid (by name)", - 1, testCompareDomuuidByName, NULL) != 0) + testCompareDomuuidByName, NULL) != 0) ret = -1; if (virtTestRun("virsh domname (by id)", - 1, testCompareDomnameByID, NULL) != 0) + testCompareDomnameByID, NULL) != 0) ret = -1; if (virtTestRun("virsh domname (by uuid)", - 1, testCompareDomnameByUUID, NULL) != 0) + testCompareDomnameByUUID, NULL) != 0) ret = -1; if (virtTestRun("virsh domstate (by id)", - 1, testCompareDomstateByID, NULL) != 0) + testCompareDomstateByID, NULL) != 0) ret = -1; if (virtTestRun("virsh domstate (by uuid)", - 1, testCompareDomstateByUUID, NULL) != 0) + testCompareDomstateByUUID, NULL) != 0) ret = -1; if (virtTestRun("virsh domstate (by name)", - 1, testCompareDomstateByName, NULL) != 0) + testCompareDomstateByName, NULL) != 0) ret = -1; /* It's a bit awkward listing result before argument, but that's a * limitation of C99 vararg macros. */ -# define DO_TEST(i, result, ...) \ +# define DO_TEST(i, result, ...) \ do { \ const char *myargv[] = { VIRSH_DEFAULT, __VA_ARGS__, NULL }; \ const struct testInfo info = { myargv, result }; \ if (virtTestRun("virsh echo " #i, \ - 1, testCompareEcho, &info) < 0) \ + testCompareEcho, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c index a3c59ef..e5c73f5 100644 --- a/tests/virstoragetest.c +++ b/tests/virstoragetest.c @@ -311,7 +311,7 @@ mymain(void) struct testChainData data = { \ start, format, chain, ARRAY_CARDINALITY(chain), flags, \ }; \ - if (virtTestRun("Storage backing chain " id, 1, \ + if (virtTestRun("Storage backing chain " id, \ testStorageChain, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/virstringtest.c b/tests/virstringtest.c index 30803d4..32a1e72 100644 --- a/tests/virstringtest.c +++ b/tests/virstringtest.c @@ -249,9 +249,9 @@ mymain(void) .delim = del, \ .tokens = toks, \ }; \ - if (virtTestRun("Split " #str, 1, testSplit, &splitData) < 0) \ + if (virtTestRun("Split " #str, testSplit, &splitData) < 0) \ ret = -1; \ - if (virtTestRun("Join " #str, 1, testJoin, &joinData) < 0) \ + if (virtTestRun("Join " #str, testJoin, &joinData) < 0) \ ret = -1; \ } while (0) @@ -276,10 +276,10 @@ mymain(void) const char *tokens7[] = { "The", "quick", "brown", "fox", "", NULL }; TEST_SPLIT("The quick brown fox ", " ", 0, tokens7); - if (virtTestRun("strdup", 1, testStrdup, NULL) < 0) + if (virtTestRun("strdup", testStrdup, NULL) < 0) ret = -1; - if (virtTestRun("strdup", 1, testStrndupNegative, NULL) < 0) + if (virtTestRun("strdup", testStrndupNegative, NULL) < 0) ret = -1; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/virsystemdtest.c b/tests/virsystemdtest.c index e68b3ac..18e7fc1 100644 --- a/tests/virsystemdtest.c +++ b/tests/virsystemdtest.c @@ -182,13 +182,13 @@ mymain(void) { int ret = 0; - if (virtTestRun("Test create container ", 1, testCreateContainer, NULL) < 0) + if (virtTestRun("Test create container ", testCreateContainer, NULL) < 0) ret = -1; - if (virtTestRun("Test create machine ", 1, testCreateMachine, NULL) < 0) + if (virtTestRun("Test create machine ", testCreateMachine, NULL) < 0) ret = -1; - if (virtTestRun("Test create no systemd ", 1, testCreateNoSystemd, NULL) < 0) + if (virtTestRun("Test create no systemd ", testCreateNoSystemd, NULL) < 0) ret = -1; - if (virtTestRun("Test create bad systemd ", 1, testCreateBadSystemd, NULL) < 0) + if (virtTestRun("Test create bad systemd ", testCreateBadSystemd, NULL) < 0) ret = -1; # define TEST_SCOPE(name, partition, unitname) \ @@ -196,7 +196,7 @@ mymain(void) struct testScopeData data = { \ name, partition, unitname \ }; \ - if (virtTestRun("Test scopename", 1, testScopeName, &data) < 0) \ + if (virtTestRun("Test scopename", testScopeName, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/virtimetest.c b/tests/virtimetest.c index 7768ecb..c1f8f4b 100644 --- a/tests/virtimetest.c +++ b/tests/virtimetest.c @@ -93,7 +93,7 @@ mymain(void) .tm_isdst = 0, \ }, \ }; \ - if (virtTestRun("Test fields " #ts " " #year " ", 1, testTimeFields, &data) < 0) \ + if (virtTestRun("Test fields " #ts " " #year " ", testTimeFields, &data) < 0) \ ret = -1; \ } while (0) diff --git a/tests/viruritest.c b/tests/viruritest.c index dab8129..41a8ca7 100644 --- a/tests/viruritest.c +++ b/tests/viruritest.c @@ -149,7 +149,7 @@ mymain(void) uri, (uri_out) ? (uri_out) : (uri), scheme, server, port, \ path, query, fragment, user, params \ }; \ - if (virtTestRun("Test URI " # uri, 1, testURIParse, &data) < 0) \ + if (virtTestRun("Test URI " # uri, testURIParse, &data) < 0) \ ret = -1; \ } while (0) #define TEST_PARSE(uri, scheme, server, port, path, query, fragment, user, params) \ diff --git a/tests/vmwarevertest.c b/tests/vmwarevertest.c index f5ccb06..21a2a6c 100644 --- a/tests/vmwarevertest.c +++ b/tests/vmwarevertest.c @@ -83,7 +83,7 @@ mymain(void) vmware_type, name, version \ }; \ if (virtTestRun("VMware Version String Parsing " name, \ - 1, testVerStrParse, &info) < 0) \ + testVerStrParse, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index da8da3a..13515f0 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -188,7 +188,7 @@ mymain(void) do { \ struct testInfo info = { _in, _out }; \ virResetLastError(); \ - if (virtTestRun("VMware VMX-2-XML "_in" -> "_out, 1, \ + if (virtTestRun("VMware VMX-2-XML "_in" -> "_out, \ testCompareHelper, &info) < 0) { \ ret = -1; \ } \ diff --git a/tests/xencapstest.c b/tests/xencapstest.c index 9de3919..ed1fee5 100644 --- a/tests/xencapstest.c +++ b/tests/xencapstest.c @@ -167,50 +167,50 @@ mymain(void) return EXIT_FAILURE; if (virtTestRun("Capabilities for i686, no PAE, no HVM", - 1, testXeni686, NULL) != 0) + testXeni686, NULL) != 0) ret = -1; if (virtTestRun("Capabilities for i686, PAE, no HVM", - 1, testXeni686PAE, NULL) != 0) + testXeni686PAE, NULL) != 0) ret = -1; /* No PAE + HVM is non-sensical - all VMX capable CPUs have PAE */ /*if (virtTestRun("Capabilities for i686, no PAE, HVM", - 1, testXeni686HVM, NULL) != 0) + testXeni686HVM, NULL) != 0) ret = -1; */ if (virtTestRun("Capabilities for i686, PAE, HVM", - 1, testXeni686PAEHVM, NULL) != 0) + testXeni686PAEHVM, NULL) != 0) ret = -1; if (virtTestRun("Capabilities for x86_64, no HVM", - 1, testXenx86_64, NULL) != 0) + testXenx86_64, NULL) != 0) ret = -1; if (virtTestRun("Capabilities for x86_64, HVM", - 1, testXenx86_64HVM, NULL) != 0) + testXenx86_64HVM, NULL) != 0) ret = -1; if (virtTestRun("Capabilities for ia64, no HVM, LE", - 1, testXenia64, NULL) != 0) + testXenia64, NULL) != 0) ret = -1; if (virtTestRun("Capabilities for ia64, HVM, LE", - 1, testXenia64HVM, NULL) != 0) + testXenia64HVM, NULL) != 0) ret = -1; if (virtTestRun("Capabilities for ia64, no HVM, BE", - 1, testXenia64BE, NULL) != 0) + testXenia64BE, NULL) != 0) ret = -1; if (virtTestRun("Capabilities for ia64, HVM, BE", - 1, testXenia64BEHVM, NULL) != 0) + testXenia64BEHVM, NULL) != 0) ret = -1; if (virtTestRun("Capabilities for ppc64", - 1, testXenppc64, NULL) != 0) + testXenppc64, NULL) != 0) ret = -1; diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c index 73e4a2d..c8014e1 100644 --- a/tests/xmconfigtest.c +++ b/tests/xmconfigtest.c @@ -207,10 +207,10 @@ mymain(void) struct testInfo info0 = { name, version, 0 }; \ struct testInfo info1 = { name, version, 1 }; \ if (virtTestRun("Xen XM-2-XML Parse " name, \ - 1, testCompareHelper, &info0) < 0) \ + testCompareHelper, &info0) < 0) \ ret = -1; \ if (virtTestRun("Xen XM-2-XML Format " name, \ - 1, testCompareHelper, &info1) < 0) \ + testCompareHelper, &info1) < 0) \ ret = -1; \ } while (0) diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c index 87ac2c3..a4d2b14 100644 --- a/tests/xml2sexprtest.c +++ b/tests/xml2sexprtest.c @@ -101,7 +101,7 @@ mymain(void) struct testInfo info = { in, out, name, version }; \ virResetLastError(); \ if (virtTestRun("Xen XML-2-SEXPR " in " -> " out, \ - 1, testCompareHelper, &info) < 0) \ + testCompareHelper, &info) < 0) \ ret = -1; \ } while (0) diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index a8adc82..2f2db60 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -220,7 +220,7 @@ mymain(void) do { \ struct testInfo info = { _in, _out, _version }; \ virResetLastError(); \ - if (virtTestRun("VMware XML-2-VMX "_in" -> "_out, 1, \ + if (virtTestRun("VMware XML-2-VMX "_in" -> "_out, \ testCompareHelper, &info) < 0) { \ result = -1; \ } \ -- 1.8.3.1

On 09/25/2013 11:23 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> ---
tests/testutils.c | 45 ++++++++++----------------------------- tests/testutils.h | 1 -
Largely mechanical; this is the interesting part.
+++ b/tests/testutils.c @@ -123,16 +123,15 @@ void virtTestResult(const char *name, int ret, const char *msg, ...) }
/* - * Runs test and count average time (if the nloops is grater than 1)
Bonus: you are fixing the s/grater/greater/ typo by deleting it :)
+ * Runs test * * returns: -1 = error, 0 = success */ int -virtTestRun(const char *title, int nloops, int (*body)(const void *data), const void *data) +virtTestRun(const char *title, + int (*body)(const void *data), const void *data) { int ret = 0; - size_t i; - double *ts = NULL;
if (testCounter == 0 && !virTestGetVerbose()) fprintf(stderr, " "); @@ -149,37 +148,16 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const if (virTestGetVerbose()) fprintf(stderr, "%2zu) %-65s ... ", testCounter, title);
- if (nloops > 1 && (VIR_ALLOC_N(ts, nloops) < 0)) - return -1; - - for (i=0; i < nloops; i++) { - struct timeval before, after; - - if (ts) - GETTIMEOFDAY(&before); - - virResetLastError(); - ret = body(data); - virErrorPtr err = virGetLastError(); - if (err) { - if (virTestGetVerbose() || virTestGetDebug()) - virDispatchError(NULL); - } - - if (ret != 0) { - break; - } - - if (ts) { - GETTIMEOFDAY(&after); - ts[i] = DIFF_MSEC(&after, &before); - } + virResetLastError(); + ret = body(data); + virErrorPtr err = virGetLastError(); + if (err) { + if (virTestGetVerbose() || virTestGetDebug()) + virDispatchError(NULL); } + if (virTestGetVerbose()) { - if (ret == 0 && ts) - fprintf(stderr, "OK [%.5f ms]\n", - virtTestCountAverage(ts, nloops)); - else if (ret == 0) + if (ret == 0) fprintf(stderr, "OK\n"); else if (ret == EXIT_AM_SKIP) fprintf(stderr, "SKIP\n"); @@ -199,7 +177,6 @@ virtTestRun(const char *title, int nloops, int (*body)(const void *data), const fprintf(stderr, "!"); }
- VIR_FREE(ts); return ret; }
ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

From: "Daniel P. Berrange" <berrange@redhat.com> The previous OOM testing support would re-run the entire "main" method each iteration, failing a different malloc each time. When a test suite has 'n' allocations, the number of repeats requires is (n * (n + 1) ) / 2. This gets very large, very quickly. This new OOM testing support instead integrates at the virtTestRun level, so each individual test case gets repeated, instead of the entire test suite. This means the values of 'n' are orders of magnitude smaller. The simple usage is $ VIR_TEST_OOM=1 ./qemuxml2argvtest ... 29) QEMU XML-2-ARGV clock-utc ... OK Test OOM for nalloc=36 .................................... OK 30) QEMU XML-2-ARGV clock-localtime ... OK Test OOM for nalloc=36 .................................... OK 31) QEMU XML-2-ARGV clock-france ... OK Test OOM for nalloc=38 ...................................... OK ... the second lines reports how many mallocs have to be failed, and thus how many repeats of the test wil be run. If it crashes, then running under valgrind will often show the problem $ VIR_TEST_OOM=1 ../run valgrind ./qemuxml2argvtest When debugging problems it is also helpful to select an individual test case $ VIR_TEST_RANGE=30 VIR_TEST_OOM=1 ../run valgrind ./qemuxml2argvtest When things get really tricky, it is possible to request that just specific allocs are failed. eg to fail allocs 5 -> 12, use $ VIR_TEST_RANGE=30 VIR_TEST_OOM=1:5-12 ../run valgrind ./qemuxml2argvtest In the worse case, you might want to know the stack trace of the alloc which was failed then VIR_TEST_OOM_TRACE can be set. If it is set to 1 then it will only print if it things a mistake happened. This is often not reliable, so setting it to 2 will make it print the stack trace for every alloc that is failed. $ VIR_TEST_OOM_TRACE=2 VIR_TEST_RANGE=30 VIR_TEST_OOM=1:5-5 ../run valgrind ./qemuxml2argvtest 30) QEMU XML-2-ARGV clock-localtime ... OK Test OOM for nalloc=36 !virAllocN /home/berrange/src/virt/libvirt/src/util/viralloc.c:180 virHashCreateFull /home/berrange/src/virt/libvirt/src/util/virhash.c:144 virDomainDefParseXML /home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11745 virDomainDefParseNode /home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12646 virDomainDefParse /home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12590 testCompareXMLToArgvFiles /home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:106 virtTestRun /home/berrange/src/virt/libvirt/tests/testutils.c:250 mymain /home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:418 (discriminator 2) virtTestMain /home/berrange/src/virt/libvirt/tests/testutils.c:750 ?? ??:0 _start ??:? FAILED Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/cputest.c | 3 +- tests/qemuargv2xmltest.c | 14 ++-- tests/qemuxml2argvtest.c | 12 ++- tests/qemuxmlnstest.c | 18 +++-- tests/testutils.c | 189 ++++++++++++++++++++++++++++++++++++++++++++++- tests/testutils.h | 2 + 6 files changed, 216 insertions(+), 22 deletions(-) diff --git a/tests/cputest.c b/tests/cputest.c index 8e3640b..17cb6af 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -476,7 +476,8 @@ cpuTestRun(const char *name, const struct data *data) if (virTestGetDebug()) { char *log; if ((log = virtTestLogContentAndReset()) && - strlen(log) > 0) + log != NULL && + strlen(log) > 0) fprintf(stderr, "\n%s\n", log); VIR_FREE(log); } diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index 6dd8bb0..92fc89a 100644 --- a/tests/qemuargv2xmltest.c +++ b/tests/qemuargv2xmltest.c @@ -42,7 +42,6 @@ static int testCompareXMLToArgvFiles(const char *xml, char *cmd = NULL; int ret = -1; virDomainDefPtr vmdef = NULL; - char *log; if (virtTestLoadFile(cmdfile, &cmd) < 0) goto fail; @@ -53,13 +52,16 @@ static int testCompareXMLToArgvFiles(const char *xml, cmd, NULL, NULL, NULL))) goto fail; - if ((log = virtTestLogContentAndReset()) == NULL) - goto fail; - if ((*log != '\0') != expect_warning) { + if (!virtTestOOMActive()) { + char *log; + if ((log = virtTestLogContentAndReset()) == NULL) + goto fail; + if ((*log != '\0') != expect_warning) { + VIR_FREE(log); + goto fail; + } VIR_FREE(log); - goto fail; } - VIR_FREE(log); if (!(actualxml = virDomainDefFormat(vmdef, 0))) goto fail; diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5658792..4feae7c 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -106,7 +106,8 @@ static int testCompareXMLToArgvFiles(const char *xml, if (!(vmdef = virDomainDefParseFile(xml, driver.caps, driver.xmlopt, QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) { - if (flags & FLAG_EXPECT_PARSE_ERROR) + if (!virtTestOOMActive() && + (flags & FLAG_EXPECT_PARSE_ERROR)) goto ok; goto out; } @@ -159,7 +160,8 @@ static int testCompareXMLToArgvFiles(const char *xml, migrateFrom, migrateFd, NULL, VIR_NETDEV_VPORT_PROFILE_OP_NO_OP, &testCallbacks))) { - if (flags & FLAG_EXPECT_FAILURE) { + if (!virtTestOOMActive() && + (flags & FLAG_EXPECT_FAILURE)) { ret = 0; if (virTestGetDebug() > 1) fprintf(stderr, "Got expected error: %s\n", @@ -173,7 +175,8 @@ static int testCompareXMLToArgvFiles(const char *xml, goto out; } - if (!!virGetLastError() != !!(flags & FLAG_EXPECT_ERROR)) { + if (!virtTestOOMActive() && + (!!virGetLastError() != !!(flags & FLAG_EXPECT_ERROR))) { if (virTestGetDebug() && (log = virtTestLogContentAndReset())) fprintf(stderr, "\n%s", log); goto out; @@ -194,7 +197,8 @@ static int testCompareXMLToArgvFiles(const char *xml, } ok: - if (flags & FLAG_EXPECT_ERROR) { + if (!virtTestOOMActive() && + (flags & FLAG_EXPECT_ERROR)) { /* need to suppress the errors */ virResetLastError(); } diff --git a/tests/qemuxmlnstest.c b/tests/qemuxmlnstest.c index 2cc15d1..38c98bd 100644 --- a/tests/qemuxmlnstest.c +++ b/tests/qemuxmlnstest.c @@ -117,15 +117,17 @@ static int testCompareXMLToArgvFiles(const char *xml, &testCallbacks))) goto fail; - if (!!virGetLastError() != expectError) { - if (virTestGetDebug() && (log = virtTestLogContentAndReset())) - fprintf(stderr, "\n%s", log); - goto fail; - } + if (!virtTestOOMActive()) { + if (!!virGetLastError() != expectError) { + if (virTestGetDebug() && (log = virtTestLogContentAndReset())) + fprintf(stderr, "\n%s", log); + goto fail; + } - if (expectError) { - /* need to suppress the errors */ - virResetLastError(); + if (expectError) { + /* need to suppress the errors */ + virResetLastError(); + } } if (!(actualargv = virCommandToString(cmd))) diff --git a/tests/testutils.c b/tests/testutils.c index 7d020db..56728e0 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -47,6 +47,9 @@ #include "virprocess.h" #include "virstring.h" +#include <dlfcn.h> +#include <execinfo.h> + #ifdef HAVE_PATHS_H # include <paths.h> #endif @@ -64,6 +67,18 @@ static unsigned int testDebug = -1; static unsigned int testVerbose = -1; static unsigned int testExpensive = -1; +#ifdef TEST_OOM +static unsigned int testOOM = 0; +static unsigned int testOOMStart = -1; +static unsigned int testOOMEnd = -1; +static unsigned int testOOMTrace = 0; +# ifdef TEST_OOM_TRACE +void *testAllocStack[30]; +int ntestAllocStack; +# endif +#endif +static bool testOOMActive = false; + static size_t testCounter = 0; static size_t testStart = 0; static size_t testEnd = 0; @@ -71,6 +86,20 @@ static size_t testEnd = 0; char *progname; char *abs_srcdir; + +bool virtTestOOMActive(void) +{ + return testOOMActive; +} + +#ifdef TEST_OOM_TRACE +static void virTestAllocHook(int nalloc ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) +{ + ntestAllocStack = backtrace(testAllocStack, ARRAY_CARDINALITY(testAllocStack)); +} +#endif + double virtTestCountAverage(double *items, int nitems) { @@ -122,6 +151,35 @@ void virtTestResult(const char *name, int ret, const char *msg, ...) va_end(vargs); } +#ifdef TEST_OOM_TRACE +static void +virTestShowTrace(void) +{ + size_t j; + for (j = 2; j < ntestAllocStack; j++) { + Dl_info info; + char *cmd; + + dladdr(testAllocStack[j], &info); + if (info.dli_fname && + strstr(info.dli_fname, ".so")) { + if (virAsprintf(&cmd, "addr2line -f -e %s %p", + info.dli_fname, + ((void*)((unsigned long long)testAllocStack[j] + - (unsigned long long)info.dli_fbase))) < 0) + continue; + } else { + if (virAsprintf(&cmd, "addr2line -f -e %s %p", + (char*)(info.dli_fname ? info.dli_fname : "<unknown>"), + testAllocStack[j]) < 0) + continue; + } + ignore_value(system(cmd)); + VIR_FREE(cmd); + } +} +#endif + /* * Runs test * @@ -168,7 +226,7 @@ virtTestRun(const char *title, !((testCounter-1) % 40)) { fprintf(stderr, " %-3zu\n", (testCounter-1)); fprintf(stderr, " "); - } + } if (ret == 0) fprintf(stderr, "."); else if (ret == EXIT_AM_SKIP) @@ -177,6 +235,77 @@ virtTestRun(const char *title, fprintf(stderr, "!"); } +#ifdef TEST_OOM + if (testOOM && ret != EXIT_AM_SKIP) { + int nalloc; + int oomret; + int start, end; + size_t i; + virResetLastError(); + virAllocTestInit(); +# ifdef TEST_OOM_TRACE + virAllocTestHook(virTestAllocHook, NULL); +# endif + oomret = body(data); + nalloc = virAllocTestCount(); + fprintf(stderr, " Test OOM for nalloc=%d ", nalloc); + if (testOOMStart == -1 || + testOOMEnd == -1) { + start = 0; + end = nalloc; + } else { + start = testOOMStart; + end = testOOMEnd + 1; + } + testOOMActive = true; + for (i = start; i < end; i++) { + bool missingFail = false; +# ifdef TEST_OOM_TRACE + memset(testAllocStack, 0, ARRAY_CARDINALITY(testAllocStack)); + ntestAllocStack = 0; +# endif + virAllocTestOOM(i+1, 1); + oomret = body(data); + + /* fprintf() disabled because XML parsing APIs don't allow + * distinguish between element / attribute not present + * in the XML (which is non-fatal), vs OOM / malformed + * which should be fatal. Thus error reporting for + * optionally present XML is mostly broken. + */ + if (oomret == 0) { + missingFail = true; +# if 0 + fprintf(stderr, " alloc %zu failed but no err status\n", i + 1); +# endif + } else { + virErrorPtr lerr = virGetLastError(); + if (!lerr) { +# if 0 + fprintf(stderr, " alloc %zu failed but no error report\n", i + 1); +# endif + missingFail = true; + } + } + if ((missingFail && testOOMTrace) || (testOOMTrace > 1)) { + fprintf(stderr, "%s", "!"); +# ifdef TEST_OOM_TRACE + virTestShowTrace(); +# endif + ret = -1; + } else { + fprintf(stderr, "%s", "."); + } + } + testOOMActive = false; + if (ret == 0) + fprintf(stderr, " OK\n"); + else + fprintf(stderr, " FAILED\n"); + virAllocTestInit(); + } +#endif /* TEST_OOM */ + return ret; } @@ -205,7 +334,7 @@ virtTestLoadFile(const char *file, char **buf) tmplen = buflen = st.st_size + 1; if (VIR_ALLOC_N(*buf, buflen) < 0) { - fprintf(stderr, "%s: larger than available memory (> %d)\n", file, buflen); + //fprintf(stderr, "%s: larger than available memory (> %d)\n", file, buflen); VIR_FORCE_FCLOSE(fp); return -1; } @@ -481,7 +610,8 @@ virtTestLogOutput(virLogSource source ATTRIBUTE_UNUSED, { struct virtTestLogData *log = data; virCheckFlags(VIR_LOG_STACK_TRACE,); - virBufferAsprintf(&log->buf, "%s: %s", timestamp, str); + if (!testOOMActive) + virBufferAsprintf(&log->buf, "%s: %s", timestamp, str); } static void @@ -550,6 +680,9 @@ int virtTestMain(int argc, int ret; bool abs_srcdir_cleanup = false; char *testRange = NULL; +#ifdef TEST_OOM + char *oomstr; +#endif abs_srcdir = getenv("abs_srcdir"); if (!abs_srcdir) { @@ -610,6 +743,56 @@ int virtTestMain(int argc, } } +#ifdef TEST_OOM + if ((oomstr = getenv("VIR_TEST_OOM")) != NULL) { + char *next; + if (testDebug == -1) + testDebug = 1; + testOOM = 1; + if (oomstr[0] != '\0' && + oomstr[1] == ':') { + if (virStrToLong_ui(oomstr + 2, &next, 10, &testOOMStart) < 0) { + fprintf(stderr, "Cannot parse range %s\n", oomstr); + return EXIT_FAILURE; + } + if (*next != '-') { + fprintf(stderr, "Cannot parse range %s\n", oomstr); + return EXIT_FAILURE; + } + if (virStrToLong_ui(next+1, NULL, 10, &testOOMEnd) < 0) { + fprintf(stderr, "Cannot parse range %s\n", oomstr); + return EXIT_FAILURE; + } + } else { + testOOMStart = -1; + testOOMEnd = -1; + } + } + +# ifdef TEST_OOM_TRACE + if ((oomstr = getenv("VIR_TEST_OOM_TRACE")) != NULL) { + if (virStrToLong_ui(oomstr, NULL, 10, &testOOMTrace) < 0) { + fprintf(stderr, "Cannot parse oom trace %s\n", oomstr); + return EXIT_FAILURE; + } + } +# else + if (getenv("VIR_TEST_OOM_TRACE")) { + fprintf(stderr, "%s", "OOM test tracing not enabled in this build\n"); + return EXIT_FAILURE; + } +# endif +#else /* TEST_OOM */ + if (getenv("VIR_TEST_OOM")) { + fprintf(stderr, "%s", "OOM testing not enabled in this build\n"); + return EXIT_FAILURE; + } + if (getenv("VIR_TEST_OOM_TRACE")) { + fprintf(stderr, "%s", "OOM test tracing not enabled in this build\n"); + return EXIT_FAILURE; + } +#endif /* TEST_OOM */ + ret = (func)(); if (abs_srcdir_cleanup) diff --git a/tests/testutils.h b/tests/testutils.h index 96edeb9..62caacd 100644 --- a/tests/testutils.h +++ b/tests/testutils.h @@ -40,6 +40,8 @@ extern char *progname; extern char *abs_srcdir; +bool virtTestOOMActive(void); + double virtTestCountAverage(double *items, int nitems); -- 1.8.3.1

On 09/25/2013 11:23 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The previous OOM testing support would re-run the entire "main" method each iteration, failing a different malloc each time. When a test suite has 'n' allocations, the number of repeats requires is (n * (n + 1) ) / 2. This gets very large, very quickly.
This new OOM testing support instead integrates at the virtTestRun level, so each individual test case gets repeated, instead of the entire test suite. This means the values of 'n' are orders of magnitude smaller.
Still O(n^2) - but yes, a smaller n makes for a NOTICEABLE speedup [that is, 30 alloc's per test on a main() that runs 30 tests is much nicer than 900 alloc's per main()] :)
The simple usage is
$ VIR_TEST_OOM=1 ./qemuxml2argvtest ... 29) QEMU XML-2-ARGV clock-utc ... OK Test OOM for nalloc=36 .................................... OK 30) QEMU XML-2-ARGV clock-localtime ... OK Test OOM for nalloc=36 .................................... OK 31) QEMU XML-2-ARGV clock-france ... OK Test OOM for nalloc=38 ...................................... OK ...
the second lines reports how many mallocs have to be failed, and thus how many repeats of the test wil be run.
s/wil/will/
If it crashes, then running under valgrind will often show the problem
$ VIR_TEST_OOM=1 ../run valgrind ./qemuxml2argvtest
When debugging problems it is also helpful to select an individual test case
$ VIR_TEST_RANGE=30 VIR_TEST_OOM=1 ../run valgrind ./qemuxml2argvtest
When things get really tricky, it is possible to request that just specific allocs are failed. eg to fail allocs 5 -> 12, use
$ VIR_TEST_RANGE=30 VIR_TEST_OOM=1:5-12 ../run valgrind ./qemuxml2argvtest
Please document VIR_TEST_OOM in docs/hacking.html.in (and thus HACKING). Does it require building with './configure --enable-test-oom'?
In the worse case, you might want to know the stack trace of the alloc which was failed then VIR_TEST_OOM_TRACE can be set. If it is set to 1 then it will only print if it things a mistake happened.
s/things/thinks/
This is often not reliable, so setting it to 2 will make it print the stack trace for every alloc that is failed.
$ VIR_TEST_OOM_TRACE=2 VIR_TEST_RANGE=30 VIR_TEST_OOM=1:5-5 ../run valgrind ./qemuxml2argvtest 30) QEMU XML-2-ARGV clock-localtime ... OK Test OOM for nalloc=36 !virAllocN /home/berrange/src/virt/libvirt/src/util/viralloc.c:180 virHashCreateFull /home/berrange/src/virt/libvirt/src/util/virhash.c:144 virDomainDefParseXML /home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11745 virDomainDefParseNode /home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12646 virDomainDefParse /home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12590 testCompareXMLToArgvFiles /home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:106 virtTestRun /home/berrange/src/virt/libvirt/tests/testutils.c:250 mymain /home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:418 (discriminator 2) virtTestMain /home/berrange/src/virt/libvirt/tests/testutils.c:750 ?? ??:0 _start ??:? FAILED
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- tests/cputest.c | 3 +- tests/qemuargv2xmltest.c | 14 ++-- tests/qemuxml2argvtest.c | 12 ++- tests/qemuxmlnstest.c | 18 +++-- tests/testutils.c | 189 ++++++++++++++++++++++++++++++++++++++++++++++- tests/testutils.h | 2 + 6 files changed, 216 insertions(+), 22 deletions(-)
diff --git a/tests/cputest.c b/tests/cputest.c index 8e3640b..17cb6af 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -476,7 +476,8 @@ cpuTestRun(const char *name, const struct data *data) if (virTestGetDebug()) { char *log; if ((log = virtTestLogContentAndReset()) && - strlen(log) > 0) + log != NULL && + strlen(log) > 0)
Spurious change adding dead code. You already checked that log was non-null in the left half of the &&.
+++ b/tests/testutils.c @@ -47,6 +47,9 @@ #include "virprocess.h" #include "virstring.h"
+#include <dlfcn.h> +#include <execinfo.h>
Needs to be conditional (these are not universal headers; gnulib won't help you).
+#ifdef TEST_OOM +static unsigned int testOOM = 0; +static unsigned int testOOMStart = -1; +static unsigned int testOOMEnd = -1; +static unsigned int testOOMTrace = 0; +# ifdef TEST_OOM_TRACE
Why the two conditions? Or is TEST_OOM_TRACE based on whether <execinfo.h> is present?
+virTestShowTrace(void) +{ + size_t j; + for (j = 2; j < ntestAllocStack; j++) { + Dl_info info; + char *cmd; + + dladdr(testAllocStack[j], &info); + if (info.dli_fname && + strstr(info.dli_fname, ".so")) { + if (virAsprintf(&cmd, "addr2line -f -e %s %p", + info.dli_fname, + ((void*)((unsigned long long)testAllocStack[j] + - (unsigned long long)info.dli_fbase))) < 0) + continue; + } else { + if (virAsprintf(&cmd, "addr2line -f -e %s %p", + (char*)(info.dli_fname ? info.dli_fname : "<unknown>"), + testAllocStack[j]) < 0) + continue; + } + ignore_value(system(cmd));
configure.ac defined TEST_OOM_TRACE solely based on whether 'backtrace()' exists; but as you are also using addr2line and looking for .so files, which starts to feel specific to Linux, is it more conservative to disable this option on non-Linux?
@@ -168,7 +226,7 @@ virtTestRun(const char *title, !((testCounter-1) % 40)) { fprintf(stderr, " %-3zu\n", (testCounter-1)); fprintf(stderr, " "); - } + }
Missed in patch 3/4?
+ testOOMActive = true; + for (i = start; i < end; i++) { + bool missingFail = false; +# ifdef TEST_OOM_TRACE + memset(testAllocStack, 0, ARRAY_CARDINALITY(testAllocStack)); + ntestAllocStack = 0; +# endif + virAllocTestOOM(i+1, 1);
spaces around +
+ oomret = body(data); + + /* fprintf() disabled because XML parsing APIs don't allow + * distinguish between element / attribute not present + * in the XML (which is non-fatal), vs OOM / malformed + * which should be fatal. Thus error reporting for + * optionally present XML is mostly broken. + */ + if (oomret == 0) { + missingFail = true; +# if 0 + fprintf(stderr, " alloc %zu failed but no err status\n", i + 1); +# endif + } else { + virErrorPtr lerr = virGetLastError(); + if (!lerr) { +# if 0 + fprintf(stderr, " alloc %zu failed but no error report\n", i + 1); +# endif + missingFail = true; + } + } + if ((missingFail && testOOMTrace) || (testOOMTrace > 1)) {
Safe to drop () around 'testOOMTrace > 1'
+ fprintf(stderr, "%s", "!"); +# ifdef TEST_OOM_TRACE + virTestShowTrace(); +# endif + ret = -1; + } else { + fprintf(stderr, "%s", "."); + } + } + testOOMActive = false; + if (ret == 0) + fprintf(stderr, " OK\n"); + else + fprintf(stderr, " FAILED\n"); + virAllocTestInit(); + } +#endif /* TEST_OOM */ + return ret; }
@@ -205,7 +334,7 @@ virtTestLoadFile(const char *file, char **buf) tmplen = buflen = st.st_size + 1;
if (VIR_ALLOC_N(*buf, buflen) < 0) { - fprintf(stderr, "%s: larger than available memory (> %d)\n", file, buflen); + //fprintf(stderr, "%s: larger than available memory (> %d)\n", file, buflen);
Is this hunk intentional?
VIR_FORCE_FCLOSE(fp); return -1; } @@ -481,7 +610,8 @@ virtTestLogOutput(virLogSource source ATTRIBUTE_UNUSED, { struct virtTestLogData *log = data; virCheckFlags(VIR_LOG_STACK_TRACE,); - virBufferAsprintf(&log->buf, "%s: %s", timestamp, str); + if (!testOOMActive) + virBufferAsprintf(&log->buf, "%s: %s", timestamp, str); }
static void @@ -550,6 +680,9 @@ int virtTestMain(int argc, int ret; bool abs_srcdir_cleanup = false; char *testRange = NULL; +#ifdef TEST_OOM + char *oomstr; +#endif
abs_srcdir = getenv("abs_srcdir"); if (!abs_srcdir) { @@ -610,6 +743,56 @@ int virtTestMain(int argc, } }
+#ifdef TEST_OOM + if ((oomstr = getenv("VIR_TEST_OOM")) != NULL) { + char *next; + if (testDebug == -1) + testDebug = 1; + testOOM = 1; + if (oomstr[0] != '\0' && + oomstr[1] == ':') { + if (virStrToLong_ui(oomstr + 2, &next, 10, &testOOMStart) < 0) { + fprintf(stderr, "Cannot parse range %s\n", oomstr); + return EXIT_FAILURE; + } + if (*next != '-') { + fprintf(stderr, "Cannot parse range %s\n", oomstr); + return EXIT_FAILURE; + }
Worth accepting VIR_TEST_OOM=1:1 as shorthand for 1:1-1? I like where it's headed. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
participants (2)
-
Daniel P. Berrange
-
Eric Blake