diff --git a/tests/objecteventtest.c b/tests/objecteventtest.c index 33e2551f48..ae29792abf 100644 --- a/tests/objecteventtest.c +++ b/tests/objecteventtest.c @@ -40,6 +40,18 @@ static const char domainDef[] = " " ""; +static const char networkDef[] = +"\n" +" test\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"\n"; + typedef struct { int startEvents; int stopEvents; @@ -60,6 +72,7 @@ lifecycleEventCounter_reset(lifecycleEventCounter *counter) typedef struct { virConnectPtr conn; + virNetworkPtr net; } objecteventTest; @@ -92,6 +105,26 @@ domainLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } +static void +networkLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED, + virNetworkPtr net ATTRIBUTE_UNUSED, + int event, + int detail ATTRIBUTE_UNUSED, + void* opaque) +{ + lifecycleEventCounter *counter = opaque; + + if (event == VIR_NETWORK_EVENT_STARTED) + counter->startEvents++; + else if (event == VIR_NETWORK_EVENT_STOPPED) + counter->stopEvents++; + else if (event == VIR_NETWORK_EVENT_DEFINED) + counter->defineEvents++; + else if (event == VIR_NETWORK_EVENT_UNDEFINED) + counter->undefineEvents++; +} + + static int testDomainCreateXML(const void *data) { @@ -222,6 +255,125 @@ cleanup: return ret; } +static int +testNetworkCreateXML(const void *data) +{ + const objecteventTest *test = data; + lifecycleEventCounter counter; + virNetworkPtr net; + int id; + int ret = 0; + + lifecycleEventCounter_reset(&counter); + + id = virConnectNetworkEventRegisterAny(test->conn, NULL, + VIR_NETWORK_EVENT_ID_LIFECYCLE, + VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb), + &counter, NULL); + net = virNetworkCreateXML(test->conn, networkDef); + + if (virEventRunDefaultImpl() < 0) { + ret = -1; + goto cleanup; + } + + if (counter.startEvents != 1 || counter.unexpectedEvents > 0) { + ret = -1; + goto cleanup; + } + +cleanup: + virConnectNetworkEventDeregisterAny(test->conn, id); + virNetworkDestroy(net); + + virNetworkFree(net); + + return ret; +} + +static int +testNetworkDefine(const void *data) +{ + const objecteventTest *test = data; + lifecycleEventCounter counter; + virNetworkPtr net; + int id; + int ret = 0; + + lifecycleEventCounter_reset(&counter); + + id = virConnectNetworkEventRegisterAny(test->conn, NULL, + VIR_NETWORK_EVENT_ID_LIFECYCLE, + VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb), + &counter, NULL); + + /* Make sure the define event is triggered */ + net = virNetworkDefineXML(test->conn, networkDef); + + if (virEventRunDefaultImpl() < 0) { + ret = -1; + goto cleanup; + } + + if (counter.defineEvents != 1 || counter.unexpectedEvents > 0) { + ret = -1; + goto cleanup; + } + + /* Make sure the undefine event is triggered */ + virNetworkUndefine(net); + + if (virEventRunDefaultImpl() < 0) { + ret = -1; + goto cleanup; + } + + if (counter.undefineEvents != 1 || counter.unexpectedEvents > 0) { + ret = -1; + goto cleanup; + } + + +cleanup: + virConnectNetworkEventDeregisterAny(test->conn, id); + virNetworkFree(net); + + return ret; +} + +static int +testNetworkStartStopEvent(const void *data) +{ + const objecteventTest *test = data; + lifecycleEventCounter counter; + int id; + int ret = 0; + + lifecycleEventCounter_reset(&counter); + + id = virConnectNetworkEventRegisterAny(test->conn, test->net, + VIR_NETWORK_EVENT_ID_LIFECYCLE, + VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb), + &counter, NULL); + virNetworkCreate(test->net); + virNetworkDestroy(test->net); + + if (virEventRunDefaultImpl() < 0) { + ret = -1; + goto cleanup; + } + + if (counter.startEvents != 1 || counter.stopEvents != 1 || + counter.unexpectedEvents > 0) { + ret = -1; + goto cleanup; + } +cleanup: + virConnectNetworkEventDeregisterAny(test->conn, id); + + return ret; +} + static int mymain(void) { @@ -243,6 +395,21 @@ mymain(void) if (virtTestRun("Domain start stop events", testDomainStartStopEvent, &test) < 0) ret = EXIT_FAILURE; + /* Network event tests */ + /* Tests requiring the test network not to be set up*/ + if (virtTestRun("Network createXML start event ", testNetworkCreateXML, &test) < 0) + ret = EXIT_FAILURE; + if (virtTestRun("Network (un)define events", testNetworkDefine, &test) < 0) + ret = EXIT_FAILURE; + + /* Define a test network */ + test.net = virNetworkDefineXML(test.conn, networkDef); + if (virtTestRun("Network start stop events ", testNetworkStartStopEvent, &test) < 0) + ret = EXIT_FAILURE; + + /* Cleanup */ + virNetworkUndefine(test.net); + virNetworkFree(test.net); virConnectClose(test.conn); return ret;