2 * Copyright (C) 2014 Red Hat, Inc.
3 * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; If not, see
17 * <http://www.gnu.org/licenses/>.
22 #include "testutils.h"
27 #define VIR_FROM_THIS VIR_FROM_NONE
30 static const char domainDef
[] =
31 "<domain type='test'>"
32 " <name>test-domain</name>"
33 " <uuid>77a6fc12-07b5-9415-8abb-a803613f2a40</uuid>"
34 " <memory>8388608</memory>"
35 " <currentMemory>2097152</currentMemory>"
42 static const char networkDef
[] =
44 " <name>test</name>\n"
45 " <bridge name=\"virbr0\"/>\n"
47 " <ip address=\"192.168.122.1\" netmask=\"255.255.255.0\">\n"
49 " <range start=\"192.168.122.2\" end=\"192.168.122.254\"/>\n"
54 static const char storagePoolDef
[] =
58 " <path>/target-path</path>\n"
62 static const char nodeDeviceDef
[] =
64 " <parent>scsi_host1</parent>\n"
65 " <capability type='scsi_host'>\n"
66 " <capability type='fc_host'>\n"
67 " <wwpn>1000000023452345</wwpn>\n"
68 " <wwnn>2000000023452345</wwnn>\n"
81 } lifecycleEventCounter
;
84 lifecycleEventCounter_reset(lifecycleEventCounter
*counter
)
86 counter
->startEvents
= 0;
87 counter
->stopEvents
= 0;
88 counter
->defineEvents
= 0;
89 counter
->undefineEvents
= 0;
90 counter
->unexpectedEvents
= 0;
91 counter
->createdEvents
= 0;
92 counter
->deletedEvents
= 0;
98 virStoragePoolPtr pool
;
104 domainLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED
,
105 virDomainPtr dom ATTRIBUTE_UNUSED
,
107 int detail ATTRIBUTE_UNUSED
,
110 lifecycleEventCounter
*counter
= opaque
;
113 case VIR_DOMAIN_EVENT_STARTED
:
114 counter
->startEvents
++;
116 case VIR_DOMAIN_EVENT_STOPPED
:
117 counter
->stopEvents
++;
119 case VIR_DOMAIN_EVENT_DEFINED
:
120 counter
->defineEvents
++;
122 case VIR_DOMAIN_EVENT_UNDEFINED
:
123 counter
->undefineEvents
++;
126 /* Ignore other events */
133 networkLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED
,
134 virNetworkPtr net ATTRIBUTE_UNUSED
,
136 int detail ATTRIBUTE_UNUSED
,
139 lifecycleEventCounter
*counter
= opaque
;
141 if (event
== VIR_NETWORK_EVENT_STARTED
)
142 counter
->startEvents
++;
143 else if (event
== VIR_NETWORK_EVENT_STOPPED
)
144 counter
->stopEvents
++;
145 else if (event
== VIR_NETWORK_EVENT_DEFINED
)
146 counter
->defineEvents
++;
147 else if (event
== VIR_NETWORK_EVENT_UNDEFINED
)
148 counter
->undefineEvents
++;
152 storagePoolLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED
,
153 virStoragePoolPtr pool ATTRIBUTE_UNUSED
,
155 int detail ATTRIBUTE_UNUSED
,
158 lifecycleEventCounter
*counter
= opaque
;
160 if (event
== VIR_STORAGE_POOL_EVENT_STARTED
)
161 counter
->startEvents
++;
162 else if (event
== VIR_STORAGE_POOL_EVENT_STOPPED
)
163 counter
->stopEvents
++;
164 else if (event
== VIR_STORAGE_POOL_EVENT_DEFINED
)
165 counter
->defineEvents
++;
166 else if (event
== VIR_STORAGE_POOL_EVENT_UNDEFINED
)
167 counter
->undefineEvents
++;
168 else if (event
== VIR_STORAGE_POOL_EVENT_CREATED
)
169 counter
->createdEvents
++;
170 else if (event
== VIR_STORAGE_POOL_EVENT_DELETED
)
171 counter
->deletedEvents
++;
175 storagePoolRefreshCb(virConnectPtr conn ATTRIBUTE_UNUSED
,
176 virStoragePoolPtr pool ATTRIBUTE_UNUSED
,
179 int *counter
= opaque
;
185 nodeDeviceLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED
,
186 virNodeDevicePtr dev ATTRIBUTE_UNUSED
,
188 int detail ATTRIBUTE_UNUSED
,
191 lifecycleEventCounter
*counter
= opaque
;
193 if (event
== VIR_NODE_DEVICE_EVENT_CREATED
)
194 counter
->createdEvents
++;
195 else if (event
== VIR_NODE_DEVICE_EVENT_DELETED
)
196 counter
->deletedEvents
++;
200 testDomainCreateXMLOld(const void *data
)
202 const objecteventTest
*test
= data
;
203 lifecycleEventCounter counter
;
204 virDomainPtr dom
= NULL
;
206 bool registered
= false;
208 lifecycleEventCounter_reset(&counter
);
210 if (virConnectDomainEventRegister(test
->conn
,
212 &counter
, NULL
) != 0)
215 dom
= virDomainCreateXML(test
->conn
, domainDef
, 0);
217 if (dom
== NULL
|| virEventRunDefaultImpl() < 0)
220 if (counter
.startEvents
!= 1 || counter
.unexpectedEvents
> 0)
223 if (virConnectDomainEventDeregister(test
->conn
, domainLifecycleCb
) != 0)
230 virConnectDomainEventDeregister(test
->conn
, domainLifecycleCb
);
232 virDomainDestroy(dom
);
240 testDomainCreateXMLNew(const void *data
)
242 const objecteventTest
*test
= data
;
243 lifecycleEventCounter counter
;
244 int eventId
= VIR_DOMAIN_EVENT_ID_LIFECYCLE
;
245 virDomainPtr dom
= NULL
;
249 lifecycleEventCounter_reset(&counter
);
251 id
= virConnectDomainEventRegisterAny(test
->conn
, NULL
, eventId
,
252 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb
),
256 dom
= virDomainCreateXML(test
->conn
, domainDef
, 0);
258 if (dom
== NULL
|| virEventRunDefaultImpl() < 0)
261 if (counter
.startEvents
!= 1 || counter
.unexpectedEvents
> 0)
264 if (virConnectDomainEventDeregisterAny(test
->conn
, id
) != 0)
271 virConnectDomainEventDeregisterAny(test
->conn
, id
);
273 virDomainDestroy(dom
);
281 testDomainCreateXMLMixed(const void *data
)
283 const objecteventTest
*test
= data
;
284 lifecycleEventCounter counter
;
289 bool registered
= false;
291 lifecycleEventCounter_reset(&counter
);
293 /* Fun with mixing old and new API, also with global and
294 * per-domain. Handler should be fired three times, once for each
296 dom
= virDomainDefineXML(test
->conn
, domainDef
);
300 id1
= virConnectDomainEventRegisterAny(test
->conn
, dom
,
301 VIR_DOMAIN_EVENT_ID_LIFECYCLE
,
302 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb
),
306 if (virConnectDomainEventRegister(test
->conn
,
308 &counter
, NULL
) != 0)
311 id2
= virConnectDomainEventRegisterAny(test
->conn
, NULL
,
312 VIR_DOMAIN_EVENT_ID_LIFECYCLE
,
313 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb
),
318 virDomainUndefine(dom
);
319 virDomainDestroy(dom
);
322 dom
= virDomainCreateXML(test
->conn
, domainDef
, 0);
323 if (dom
== NULL
|| virEventRunDefaultImpl() < 0)
326 if (counter
.startEvents
!= 3 || counter
.unexpectedEvents
> 0)
329 if (virConnectDomainEventDeregister(test
->conn
, domainLifecycleCb
) != 0)
332 if (virConnectDomainEventDeregisterAny(test
->conn
, id1
) != 0)
335 if (virConnectDomainEventDeregisterAny(test
->conn
, id2
) != 0)
342 virConnectDomainEventDeregisterAny(test
->conn
, id1
);
344 virConnectDomainEventDeregisterAny(test
->conn
, id2
);
346 virConnectDomainEventDeregister(test
->conn
, domainLifecycleCb
);
348 virDomainUndefine(dom
);
349 virDomainDestroy(dom
);
358 testDomainDefine(const void *data
)
360 const objecteventTest
*test
= data
;
361 lifecycleEventCounter counter
;
362 int eventId
= VIR_DOMAIN_EVENT_ID_LIFECYCLE
;
363 virDomainPtr dom
= NULL
;
367 lifecycleEventCounter_reset(&counter
);
369 id
= virConnectDomainEventRegisterAny(test
->conn
, NULL
, eventId
,
370 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb
),
373 /* Make sure the define event is triggered */
374 dom
= virDomainDefineXML(test
->conn
, domainDef
);
376 if (dom
== NULL
|| virEventRunDefaultImpl() < 0) {
381 if (counter
.defineEvents
!= 1 || counter
.unexpectedEvents
> 0) {
386 /* Make sure the undefine event is triggered */
387 virDomainUndefine(dom
);
389 if (virEventRunDefaultImpl() < 0) {
394 if (counter
.undefineEvents
!= 1 || counter
.unexpectedEvents
> 0) {
401 virConnectDomainEventDeregisterAny(test
->conn
, id
);
409 testDomainStartStopEvent(const void *data
)
411 const objecteventTest
*test
= data
;
412 lifecycleEventCounter counter
;
413 int eventId
= VIR_DOMAIN_EVENT_ID_LIFECYCLE
;
417 virConnectPtr conn2
= NULL
;
418 virDomainPtr dom2
= NULL
;
420 lifecycleEventCounter_reset(&counter
);
422 dom
= virDomainLookupByName(test
->conn
, "test");
426 id
= virConnectDomainEventRegisterAny(test
->conn
, dom
, eventId
,
427 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb
),
430 /* Test domain is started */
431 virDomainDestroy(dom
);
432 if (virDomainCreate(dom
) < 0)
435 if (virEventRunDefaultImpl() < 0)
438 if (counter
.startEvents
!= 1 || counter
.stopEvents
!= 1 ||
439 counter
.unexpectedEvents
> 0)
442 /* Repeat the test, but this time, trigger the events via an
443 * alternate connection. */
444 if (!(conn2
= virConnectOpen("test:///default")))
446 if (!(dom2
= virDomainLookupByName(conn2
, "test")))
449 if (virDomainDestroy(dom2
) < 0)
451 if (virDomainCreate(dom2
) < 0)
454 if (virEventRunDefaultImpl() < 0)
457 if (counter
.startEvents
!= 2 || counter
.stopEvents
!= 2 ||
458 counter
.unexpectedEvents
> 0)
463 virConnectDomainEventDeregisterAny(test
->conn
, id
);
468 virConnectClose(conn2
);
474 testNetworkCreateXML(const void *data
)
476 const objecteventTest
*test
= data
;
477 lifecycleEventCounter counter
;
482 lifecycleEventCounter_reset(&counter
);
484 id
= virConnectNetworkEventRegisterAny(test
->conn
, NULL
,
485 VIR_NETWORK_EVENT_ID_LIFECYCLE
,
486 VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb
),
488 net
= virNetworkCreateXML(test
->conn
, networkDef
);
490 if (!net
|| virEventRunDefaultImpl() < 0) {
495 if (counter
.startEvents
!= 1 || counter
.unexpectedEvents
> 0) {
501 virConnectNetworkEventDeregisterAny(test
->conn
, id
);
503 virNetworkDestroy(net
);
510 testNetworkDefine(const void *data
)
512 const objecteventTest
*test
= data
;
513 lifecycleEventCounter counter
;
518 lifecycleEventCounter_reset(&counter
);
520 id
= virConnectNetworkEventRegisterAny(test
->conn
, NULL
,
521 VIR_NETWORK_EVENT_ID_LIFECYCLE
,
522 VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb
),
525 /* Make sure the define event is triggered */
526 net
= virNetworkDefineXML(test
->conn
, networkDef
);
528 if (!net
|| virEventRunDefaultImpl() < 0) {
533 if (counter
.defineEvents
!= 1 || counter
.unexpectedEvents
> 0) {
538 /* Make sure the undefine event is triggered */
539 virNetworkUndefine(net
);
541 if (virEventRunDefaultImpl() < 0) {
546 if (counter
.undefineEvents
!= 1 || counter
.unexpectedEvents
> 0) {
553 virConnectNetworkEventDeregisterAny(test
->conn
, id
);
561 testNetworkStartStopEvent(const void *data
)
563 const objecteventTest
*test
= data
;
564 lifecycleEventCounter counter
;
571 lifecycleEventCounter_reset(&counter
);
573 id
= virConnectNetworkEventRegisterAny(test
->conn
, test
->net
,
574 VIR_NETWORK_EVENT_ID_LIFECYCLE
,
575 VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb
),
577 virNetworkCreate(test
->net
);
578 virNetworkDestroy(test
->net
);
580 if (virEventRunDefaultImpl() < 0) {
585 if (counter
.startEvents
!= 1 || counter
.stopEvents
!= 1 ||
586 counter
.unexpectedEvents
> 0) {
591 virConnectNetworkEventDeregisterAny(test
->conn
, id
);
597 testStoragePoolCreateXML(const void *data
)
599 const objecteventTest
*test
= data
;
600 lifecycleEventCounter counter
;
601 virStoragePoolPtr pool
;
605 lifecycleEventCounter_reset(&counter
);
607 id
= virConnectStoragePoolEventRegisterAny(test
->conn
, NULL
,
608 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE
,
609 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb
),
611 pool
= virStoragePoolCreateXML(test
->conn
, storagePoolDef
, 0);
613 if (!pool
|| virEventRunDefaultImpl() < 0) {
618 if (counter
.startEvents
!= 1 || counter
.unexpectedEvents
> 0) {
624 virConnectStoragePoolEventDeregisterAny(test
->conn
, id
);
626 virStoragePoolDestroy(pool
);
627 virStoragePoolFree(pool
);
633 testStoragePoolDefine(const void *data
)
635 const objecteventTest
*test
= data
;
636 lifecycleEventCounter counter
;
637 virStoragePoolPtr pool
;
641 lifecycleEventCounter_reset(&counter
);
643 id
= virConnectStoragePoolEventRegisterAny(test
->conn
, NULL
,
644 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE
,
645 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb
),
648 /* Make sure the define event is triggered */
649 pool
= virStoragePoolDefineXML(test
->conn
, storagePoolDef
, 0);
651 if (!pool
|| virEventRunDefaultImpl() < 0) {
656 if (counter
.defineEvents
!= 1 || counter
.unexpectedEvents
> 0) {
661 /* Make sure the undefine event is triggered */
662 virStoragePoolUndefine(pool
);
664 if (virEventRunDefaultImpl() < 0) {
669 if (counter
.undefineEvents
!= 1 || counter
.unexpectedEvents
> 0) {
676 virConnectStoragePoolEventDeregisterAny(test
->conn
, id
);
678 virStoragePoolFree(pool
);
684 testStoragePoolStartStopEvent(const void *data
)
686 const objecteventTest
*test
= data
;
687 lifecycleEventCounter counter
;
695 lifecycleEventCounter_reset(&counter
);
698 id1
= virConnectStoragePoolEventRegisterAny(test
->conn
, test
->pool
,
699 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE
,
700 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb
),
702 id2
= virConnectStoragePoolEventRegisterAny(test
->conn
, test
->pool
,
703 VIR_STORAGE_POOL_EVENT_ID_REFRESH
,
704 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolRefreshCb
),
705 &refreshCounter
, NULL
);
706 virStoragePoolCreate(test
->pool
, 0);
707 virStoragePoolRefresh(test
->pool
, 0);
708 virStoragePoolDestroy(test
->pool
);
710 if (virEventRunDefaultImpl() < 0) {
715 if (counter
.startEvents
!= 1 || counter
.stopEvents
!= 1 ||
716 refreshCounter
!= 1 || counter
.unexpectedEvents
> 0) {
722 virConnectStoragePoolEventDeregisterAny(test
->conn
, id1
);
723 virConnectStoragePoolEventDeregisterAny(test
->conn
, id2
);
728 testStoragePoolBuild(const void *data
)
730 const objecteventTest
*test
= data
;
731 lifecycleEventCounter counter
;
735 lifecycleEventCounter_reset(&counter
);
737 id
= virConnectStoragePoolEventRegisterAny(test
->conn
, NULL
,
738 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE
,
739 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb
),
742 virStoragePoolBuild(test
->pool
, 0);
744 if (virEventRunDefaultImpl() < 0) {
749 if (counter
.createdEvents
!= 1) {
755 virConnectStoragePoolEventDeregisterAny(test
->conn
, id
);
760 testStoragePoolDelete(const void *data
)
762 const objecteventTest
*test
= data
;
763 lifecycleEventCounter counter
;
767 lifecycleEventCounter_reset(&counter
);
769 id
= virConnectStoragePoolEventRegisterAny(test
->conn
, NULL
,
770 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE
,
771 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb
),
774 virStoragePoolDelete(test
->pool
, 0);
776 if (virEventRunDefaultImpl() < 0) {
781 if (counter
.deletedEvents
!= 1) {
787 virConnectStoragePoolEventDeregisterAny(test
->conn
, id
);
791 testNodeDeviceCreateXML(const void *data
)
793 const objecteventTest
*test
= data
;
794 lifecycleEventCounter counter
;
795 virNodeDevicePtr dev
;
799 lifecycleEventCounter_reset(&counter
);
801 id
= virConnectNodeDeviceEventRegisterAny(test
->conn
, NULL
,
802 VIR_NODE_DEVICE_EVENT_ID_LIFECYCLE
,
803 VIR_NODE_DEVICE_EVENT_CALLBACK(&nodeDeviceLifecycleCb
),
805 dev
= virNodeDeviceCreateXML(test
->conn
, nodeDeviceDef
, 0);
806 virNodeDeviceDestroy(dev
);
808 if (!dev
|| virEventRunDefaultImpl() < 0) {
813 if (counter
.createdEvents
!= 1 || counter
.deletedEvents
!= 1 ||
814 counter
.unexpectedEvents
> 0) {
820 virConnectNodeDeviceEventDeregisterAny(test
->conn
, id
);
822 virNodeDeviceFree(dev
);
827 timeout(int id ATTRIBUTE_UNUSED
, void *opaque ATTRIBUTE_UNUSED
)
829 fputs("test taking too long; giving up", stderr
);
836 objecteventTest test
= { 0 };
837 int ret
= EXIT_SUCCESS
;
840 virEventRegisterDefaultImpl();
842 /* Set up a timer to abort this test if it takes 10 seconds. */
843 if ((timer
= virEventAddTimeout(10 * 1000, timeout
, NULL
, NULL
)) < 0)
846 if (!(test
.conn
= virConnectOpen("test:///default")))
849 virTestQuiesceLibvirtErrors(false);
851 /* Domain event tests */
852 if (virTestRun("Domain createXML start event (old API)",
853 testDomainCreateXMLOld
, &test
) < 0)
855 if (virTestRun("Domain createXML start event (new API)",
856 testDomainCreateXMLNew
, &test
) < 0)
858 if (virTestRun("Domain createXML start event (both API)",
859 testDomainCreateXMLMixed
, &test
) < 0)
861 if (virTestRun("Domain (un)define events", testDomainDefine
, &test
) < 0)
863 if (virTestRun("Domain start stop events", testDomainStartStopEvent
, &test
) < 0)
866 /* Network event tests */
867 /* Tests requiring the test network not to be set up*/
868 if (virTestRun("Network createXML start event ", testNetworkCreateXML
, &test
) < 0)
870 if (virTestRun("Network (un)define events", testNetworkDefine
, &test
) < 0)
873 /* Define a test network */
874 if (!(test
.net
= virNetworkDefineXML(test
.conn
, networkDef
)))
876 if (virTestRun("Network start stop events ", testNetworkStartStopEvent
, &test
) < 0)
881 virNetworkUndefine(test
.net
);
882 virNetworkFree(test
.net
);
885 /* Storage pool event tests */
886 if (virTestRun("Storage pool createXML start event ",
887 testStoragePoolCreateXML
, &test
) < 0)
889 if (virTestRun("Storage pool (un)define events",
890 testStoragePoolDefine
, &test
) < 0)
893 /* Define a test storage pool */
894 if (!(test
.pool
= virStoragePoolDefineXML(test
.conn
, storagePoolDef
, 0)))
896 if (virTestRun("Storage pool start stop events ",
897 testStoragePoolStartStopEvent
, &test
) < 0)
899 /* Storage pool build and delete events */
900 if (virTestRun("Storage pool build event ",
901 testStoragePoolBuild
, &test
) < 0)
903 if (virTestRun("Storage pool delete event ",
904 testStoragePoolDelete
, &test
) < 0)
907 /* Node device event tests */
908 if (virTestRun("Node device createXML add event ",
909 testNodeDeviceCreateXML
, &test
) < 0)
914 virStoragePoolUndefine(test
.pool
);
915 virStoragePoolFree(test
.pool
);
918 virConnectClose(test
.conn
);
919 virEventRemoveTimeout(timer
);
924 VIR_TEST_MAIN(mymain
)