On 07/20/2016 09:50 AM, Jovanka Gulicoska wrote: > Also includes unittests for node device lifecycle events API > --- > src/test/test_driver.c | 49 +++++++++++++++++++++++++++++++++ > tests/objecteventtest.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 121 insertions(+) > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > index 672c163..8233d74 100644 > --- a/src/test/test_driver.c > +++ b/src/test/test_driver.c > @@ -51,6 +51,7 @@ > #include "storage_conf.h" > #include "storage_event.h" > #include "node_device_conf.h" > +#include "node_device_event.h" > #include "virxml.h" > #include "virthread.h" > #include "virlog.h" > @@ -504,6 +505,7 @@ static const char *defaultPoolSourcesNetFSXML = > " </source>\n" > "</sources>\n"; > > + Stray whitespace change, please drop this > static const unsigned long long defaultPoolCap = (100 * 1024 * 1024 * 1024ull); > static const unsigned long long defaultPoolAlloc; > > @@ -5427,6 +5429,7 @@ testNodeDeviceCreateXML(virConnectPtr conn, > int parent_host = -1; > virNodeDevicePtr dev = NULL; > virNodeDevCapsDefPtr caps; > + virObjectEventPtr event = NULL; > > virCheckFlags(0, NULL); > > @@ -5470,11 +5473,16 @@ testNodeDeviceCreateXML(virConnectPtr conn, > goto cleanup; > virNodeDeviceObjUnlock(obj); > > + event = virNodeDeviceEventLifecycleNew(def->name, > + VIR_NODE_DEVICE_EVENT_CREATED, > + 0); > + > dev = virGetNodeDevice(conn, def->name); > def = NULL; > cleanup: > testDriverUnlock(driver); > virNodeDeviceDefFree(def); > + testObjectEventQueue(driver, event); > VIR_FREE(wwnn); > VIR_FREE(wwpn); > return dev; > @@ -5488,6 +5496,7 @@ testNodeDeviceDestroy(virNodeDevicePtr dev) > virNodeDeviceObjPtr obj = NULL; > char *parent_name = NULL, *wwnn = NULL, *wwpn = NULL; > int parent_host = -1; > + virObjectEventPtr event = NULL; > > testDriverLock(driver); > obj = virNodeDeviceFindByName(&driver->devs, dev->name); > @@ -5521,12 +5530,17 @@ testNodeDeviceDestroy(virNodeDevicePtr dev) > goto out; > } > > + event = virNodeDeviceEventLifecycleNew(dev->name, > + VIR_NODE_DEVICE_EVENT_DELETED, > + 0); > + > virNodeDeviceObjLock(obj); > virNodeDeviceObjRemove(&driver->devs, obj); > > out: > if (obj) > virNodeDeviceObjUnlock(obj); > + testObjectEventQueue(driver, event); > VIR_FREE(parent_name); > VIR_FREE(wwnn); > VIR_FREE(wwpn); > @@ -5667,6 +5681,39 @@ testConnectStoragePoolEventDeregisterAny(virConnectPtr conn, > return ret; > } > > +static int > +testConnectNodeDeviceEventRegisterAny(virConnectPtr conn, > + virNodeDevicePtr dev, > + int eventID, > + virConnectNodeDeviceEventGenericCallback callback, > + void *opaque, > + virFreeCallback freecb) > +{ > + testDriverPtr driver = conn->privateData; > + int ret; > + > + if (virNodeDeviceEventStateRegisterID(conn, driver->eventState, > + dev, eventID, callback, > + opaque, freecb, &ret) < 0) > + ret = -1; > + > + return ret; > +} > + > +static int > +testConnectNodeDeviceEventDeregisterAny(virConnectPtr conn, > + int callbackID) > +{ > + testDriverPtr driver = conn->privateData; > + int ret = 0; > + > + if (virObjectEventStateDeregisterID(conn, driver->eventState, > + callbackID) < 0) > + ret = -1; > + > + return ret; > +} > + > static int testConnectListAllDomains(virConnectPtr conn, > virDomainPtr **domains, > unsigned int flags) > @@ -6809,6 +6856,8 @@ static virStorageDriver testStorageDriver = { > }; > > static virNodeDeviceDriver testNodeDeviceDriver = { > + .connectNodeDeviceEventRegisterAny = testConnectNodeDeviceEventRegisterAny, /* 2.1.0 */ > + .connectNodeDeviceEventDeregisterAny = testConnectNodeDeviceEventDeregisterAny, /* 2.1.0 */ > .nodeNumOfDevices = testNodeNumOfDevices, /* 0.7.2 */ > .nodeListDevices = testNodeListDevices, /* 0.7.2 */ > .nodeDeviceLookupByName = testNodeDeviceLookupByName, /* 0.7.2 */ These versions will need to be updated to 2.2.0 > diff --git a/tests/objecteventtest.c b/tests/objecteventtest.c > index 5e8087b..d25a9e2 100644 > --- a/tests/objecteventtest.c > +++ b/tests/objecteventtest.c > @@ -61,12 +61,25 @@ static const char storagePoolDef[] = > " </target>\n" > "</pool>\n"; > > +static const char nodeDeviceDef[] = > +"<device>\n" > +" <parent>test-scsi-host-vport</parent>\n" > +" <capability type='scsi_host'>\n" > +" <capability type='fc_host'>\n" > +" <wwpn>1111222233334444</wwpn>\n" > +" <wwnn>5555666677778888</wwnn>\n" > +" </capability>\n" > +" </capability>\n" > +"</device>\n"; > + > typedef struct { > int startEvents; > int stopEvents; > int defineEvents; > int undefineEvents; > int unexpectedEvents; > + int createdEvents; > + int deletedEvents; > } lifecycleEventCounter; > > static void > @@ -77,12 +90,15 @@ lifecycleEventCounter_reset(lifecycleEventCounter *counter) > counter->defineEvents = 0; > counter->undefineEvents = 0; > counter->unexpectedEvents = 0; > + counter->createdEvents = 0; > + counter->deletedEvents = 0; > } > > typedef struct { > virConnectPtr conn; > virNetworkPtr net; > virStoragePoolPtr pool; > + virNodeDevicePtr dev; > } objecteventTest; > > > @@ -163,6 +179,21 @@ storagePoolRefreshCb(virConnectPtr conn ATTRIBUTE_UNUSED, > (*counter)++; > } > > +static void > +nodeDeviceLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED, > + virNodeDevicePtr dev ATTRIBUTE_UNUSED, > + int event, > + int detail ATTRIBUTE_UNUSED, > + void* opaque) > +{ > + lifecycleEventCounter *counter = opaque; > + > + if (event == VIR_NODE_DEVICE_EVENT_CREATED) > + counter->createdEvents++; > + else if (event == VIR_NODE_DEVICE_EVENT_DELETED) > + counter->deletedEvents++; > +} > + > static int > testDomainCreateXMLOld(const void *data) > { > @@ -691,6 +722,42 @@ testStoragePoolStartStopEvent(const void *data) > return ret; > } > > +static int > +testNodeDeviceCreateXML(const void *data) > +{ > + const objecteventTest *test = data; > + lifecycleEventCounter counter; > + virNodeDevicePtr dev; > + int id; > + int ret = 0; > + > + lifecycleEventCounter_reset(&counter); > + > + id = virConnectNodeDeviceEventRegisterAny(test->conn, NULL, > + VIR_NODE_DEVICE_EVENT_ID_LIFECYCLE, > + VIR_NODE_DEVICE_EVENT_CALLBACK(&nodeDeviceLifecycleCb), > + &counter, NULL); > + dev = virNodeDeviceCreateXML(test->conn, nodeDeviceDef, 0); > + virNodeDeviceDestroy(dev); > + > + if (!dev || virEventRunDefaultImpl() < 0) { > + ret = -1; > + goto cleanup; > + } > + > + if (counter.createdEvents != 1 || counter.deletedEvents != 1 || > + counter.unexpectedEvents > 0) { > + ret = -1; > + goto cleanup; > + } > + > + cleanup: > + virConnectNodeDeviceEventDeregisterAny(test->conn, id); > + if (dev) > + virNodeDeviceFree(dev); > + return ret; > +} > + > static void > timeout(int id ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) > { > @@ -765,6 +832,11 @@ mymain(void) > testStoragePoolStartStopEvent, &test) < 0) > ret = EXIT_FAILURE; > > + /* Node device event tests */ > + if (virTestRun("Node device createXML add event ", > + testNodeDeviceCreateXML, &test) < 0) > + ret = EXIT_FAILURE; > + > /* Cleanup */ > if (test.pool) { > virStoragePoolUndefine(test.pool); > Rest looks good to me Thanks, Cole -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list