Done as a separate patch from 5/2 so that I can prove it flushes out the flaw; but will be squashed when I push. Valgrind didn't report any leaks when running this test plus the fixed source. * tests/objecteventtest.c (testDomainStartStopEvent): Enhance to cover this. (timeout, mymain): Ensure test fails rather than blocks. Signed-off-by: Eric Blake <eblake@xxxxxxxxxx> --- tests/objecteventtest.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/tests/objecteventtest.c b/tests/objecteventtest.c index f7b60cd..8bd1bab 100644 --- a/tests/objecteventtest.c +++ b/tests/objecteventtest.c @@ -265,8 +265,10 @@ testDomainStartStopEvent(const void *data) lifecycleEventCounter counter; int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE; int id; - int ret = 0; + int ret = -1; virDomainPtr dom; + virConnectPtr conn2 = NULL; + virDomainPtr dom2 = NULL; lifecycleEventCounter_reset(&counter); @@ -282,20 +284,40 @@ testDomainStartStopEvent(const void *data) virDomainDestroy(dom); virDomainCreate(dom); - if (virEventRunDefaultImpl() < 0) { - ret = -1; + if (virEventRunDefaultImpl() < 0) goto cleanup; - } if (counter.startEvents != 1 || counter.stopEvents != 1 || - counter.unexpectedEvents > 0) { - ret = -1; + counter.unexpectedEvents > 0) + goto cleanup; + + /* Repeat the test, but this time, trigger the events via an + * alternate connection. */ + if (!(conn2 = virConnectOpen("test:///default"))) + goto cleanup; + if (!(dom2 = virDomainLookupByName(conn2, "test"))) goto cleanup; - } + if (virDomainDestroy(dom2) < 0) + goto cleanup; + if (virDomainCreate(dom2) < 0) + goto cleanup; + + if (virEventRunDefaultImpl() < 0) + goto cleanup; + + if (counter.startEvents != 2 || counter.stopEvents != 2 || + counter.unexpectedEvents > 0) + goto cleanup; + + ret = 0; cleanup: virConnectDomainEventDeregisterAny(test->conn, id); virDomainFree(dom); + if (dom2) + virDomainFree(dom2); + if (conn2) + virConnectClose(conn2); return ret; } @@ -419,14 +441,26 @@ cleanup: return ret; } +static void +timeout(int id ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) +{ + fputs("test taking too long; giving up", stderr); + _exit(EXIT_FAILURE); +} + static int mymain(void) { objecteventTest test; int ret = EXIT_SUCCESS; + int timer; virEventRegisterDefaultImpl(); + /* Set up a timer to abort this test if it takes 10 seconds. */ + if ((timer = virEventAddTimeout(10 * 1000, timeout, NULL, NULL)) < 0) + return EXIT_FAILURE; + if (!(test.conn = virConnectOpen("test:///default"))) return EXIT_FAILURE; @@ -460,6 +494,7 @@ mymain(void) virNetworkUndefine(test.net); virNetworkFree(test.net); virConnectClose(test.conn); + virEventRemoveTimeout(timer); return ret; } -- 1.8.4.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list