backup: Wire up qemu full pull backup commands over QMP
[libvirt/ericb.git] / tests / objecteventtest.c
blob9ba082d3538e47b1e69effbd3ef3be622881501b
1 /*
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/>.
20 #include <config.h>
22 #include "testutils.h"
24 #include "virerror.h"
25 #include "virxml.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>"
36 " <vcpu>2</vcpu>"
37 " <os>"
38 " <type>hvm</type>"
39 " </os>"
40 "</domain>";
42 static const char networkDef[] =
43 "<network>\n"
44 " <name>test</name>\n"
45 " <bridge name=\"virbr0\"/>\n"
46 " <forward/>\n"
47 " <ip address=\"192.168.122.1\" netmask=\"255.255.255.0\">\n"
48 " <dhcp>\n"
49 " <range start=\"192.168.122.2\" end=\"192.168.122.254\"/>\n"
50 " </dhcp>\n"
51 " </ip>\n"
52 "</network>\n";
54 static const char storagePoolDef[] =
55 "<pool type='dir'>\n"
56 " <name>P</name>\n"
57 " <target>\n"
58 " <path>/target-path</path>\n"
59 " </target>\n"
60 "</pool>\n";
62 static const char nodeDeviceDef[] =
63 "<device>\n"
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"
69 " </capability>\n"
70 " </capability>\n"
71 "</device>\n";
73 typedef struct {
74 int startEvents;
75 int stopEvents;
76 int defineEvents;
77 int undefineEvents;
78 int unexpectedEvents;
79 int createdEvents;
80 int deletedEvents;
81 } lifecycleEventCounter;
83 static void
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;
95 typedef struct {
96 virConnectPtr conn;
97 virNetworkPtr net;
98 virStoragePoolPtr pool;
99 virNodeDevicePtr dev;
100 } objecteventTest;
103 static int
104 domainLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED,
105 virDomainPtr dom ATTRIBUTE_UNUSED,
106 int event,
107 int detail ATTRIBUTE_UNUSED,
108 void *opaque)
110 lifecycleEventCounter *counter = opaque;
112 switch (event) {
113 case VIR_DOMAIN_EVENT_STARTED:
114 counter->startEvents++;
115 break;
116 case VIR_DOMAIN_EVENT_STOPPED:
117 counter->stopEvents++;
118 break;
119 case VIR_DOMAIN_EVENT_DEFINED:
120 counter->defineEvents++;
121 break;
122 case VIR_DOMAIN_EVENT_UNDEFINED:
123 counter->undefineEvents++;
124 break;
125 default:
126 /* Ignore other events */
127 break;
129 return 0;
132 static void
133 networkLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED,
134 virNetworkPtr net ATTRIBUTE_UNUSED,
135 int event,
136 int detail ATTRIBUTE_UNUSED,
137 void* opaque)
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++;
151 static void
152 storagePoolLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED,
153 virStoragePoolPtr pool ATTRIBUTE_UNUSED,
154 int event,
155 int detail ATTRIBUTE_UNUSED,
156 void* opaque)
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++;
174 static void
175 storagePoolRefreshCb(virConnectPtr conn ATTRIBUTE_UNUSED,
176 virStoragePoolPtr pool ATTRIBUTE_UNUSED,
177 void* opaque)
179 int *counter = opaque;
181 (*counter)++;
184 static void
185 nodeDeviceLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED,
186 virNodeDevicePtr dev ATTRIBUTE_UNUSED,
187 int event,
188 int detail ATTRIBUTE_UNUSED,
189 void* opaque)
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++;
199 static int
200 testDomainCreateXMLOld(const void *data)
202 const objecteventTest *test = data;
203 lifecycleEventCounter counter;
204 virDomainPtr dom = NULL;
205 int ret = -1;
206 bool registered = false;
208 lifecycleEventCounter_reset(&counter);
210 if (virConnectDomainEventRegister(test->conn,
211 domainLifecycleCb,
212 &counter, NULL) != 0)
213 goto cleanup;
214 registered = true;
215 dom = virDomainCreateXML(test->conn, domainDef, 0);
217 if (dom == NULL || virEventRunDefaultImpl() < 0)
218 goto cleanup;
220 if (counter.startEvents != 1 || counter.unexpectedEvents > 0)
221 goto cleanup;
223 if (virConnectDomainEventDeregister(test->conn, domainLifecycleCb) != 0)
224 goto cleanup;
225 registered = false;
226 ret = 0;
228 cleanup:
229 if (registered)
230 virConnectDomainEventDeregister(test->conn, domainLifecycleCb);
231 if (dom) {
232 virDomainDestroy(dom);
233 virDomainFree(dom);
236 return ret;
239 static int
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;
246 int id;
247 int ret = -1;
249 lifecycleEventCounter_reset(&counter);
251 id = virConnectDomainEventRegisterAny(test->conn, NULL, eventId,
252 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
253 &counter, NULL);
254 if (id < 0)
255 goto cleanup;
256 dom = virDomainCreateXML(test->conn, domainDef, 0);
258 if (dom == NULL || virEventRunDefaultImpl() < 0)
259 goto cleanup;
261 if (counter.startEvents != 1 || counter.unexpectedEvents > 0)
262 goto cleanup;
264 if (virConnectDomainEventDeregisterAny(test->conn, id) != 0)
265 goto cleanup;
266 id = -1;
267 ret = 0;
269 cleanup:
270 if (id >= 0)
271 virConnectDomainEventDeregisterAny(test->conn, id);
272 if (dom) {
273 virDomainDestroy(dom);
274 virDomainFree(dom);
277 return ret;
280 static int
281 testDomainCreateXMLMixed(const void *data)
283 const objecteventTest *test = data;
284 lifecycleEventCounter counter;
285 virDomainPtr dom;
286 int ret = -1;
287 int id1 = -1;
288 int id2 = -1;
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
295 * registration. */
296 dom = virDomainDefineXML(test->conn, domainDef);
297 if (dom == NULL)
298 goto cleanup;
300 id1 = virConnectDomainEventRegisterAny(test->conn, dom,
301 VIR_DOMAIN_EVENT_ID_LIFECYCLE,
302 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
303 &counter, NULL);
304 if (id1 < 0)
305 goto cleanup;
306 if (virConnectDomainEventRegister(test->conn,
307 domainLifecycleCb,
308 &counter, NULL) != 0)
309 goto cleanup;
310 registered = true;
311 id2 = virConnectDomainEventRegisterAny(test->conn, NULL,
312 VIR_DOMAIN_EVENT_ID_LIFECYCLE,
313 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
314 &counter, NULL);
315 if (id2 < 0)
316 goto cleanup;
318 virDomainUndefine(dom);
319 virDomainDestroy(dom);
320 virDomainFree(dom);
322 dom = virDomainCreateXML(test->conn, domainDef, 0);
323 if (dom == NULL || virEventRunDefaultImpl() < 0)
324 goto cleanup;
326 if (counter.startEvents != 3 || counter.unexpectedEvents > 0)
327 goto cleanup;
329 if (virConnectDomainEventDeregister(test->conn, domainLifecycleCb) != 0)
330 goto cleanup;
331 registered = false;
332 if (virConnectDomainEventDeregisterAny(test->conn, id1) != 0)
333 goto cleanup;
334 id1 = -1;
335 if (virConnectDomainEventDeregisterAny(test->conn, id2) != 0)
336 goto cleanup;
337 id2 = -1;
338 ret = 0;
340 cleanup:
341 if (id1 >= 0)
342 virConnectDomainEventDeregisterAny(test->conn, id1);
343 if (id2 >= 0)
344 virConnectDomainEventDeregisterAny(test->conn, id2);
345 if (registered)
346 virConnectDomainEventDeregister(test->conn, domainLifecycleCb);
347 if (dom != NULL) {
348 virDomainUndefine(dom);
349 virDomainDestroy(dom);
350 virDomainFree(dom);
353 return ret;
357 static int
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;
364 int id;
365 int ret = 0;
367 lifecycleEventCounter_reset(&counter);
369 id = virConnectDomainEventRegisterAny(test->conn, NULL, eventId,
370 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
371 &counter, NULL);
373 /* Make sure the define event is triggered */
374 dom = virDomainDefineXML(test->conn, domainDef);
376 if (dom == NULL || virEventRunDefaultImpl() < 0) {
377 ret = -1;
378 goto cleanup;
381 if (counter.defineEvents != 1 || counter.unexpectedEvents > 0) {
382 ret = -1;
383 goto cleanup;
386 /* Make sure the undefine event is triggered */
387 virDomainUndefine(dom);
389 if (virEventRunDefaultImpl() < 0) {
390 ret = -1;
391 goto cleanup;
394 if (counter.undefineEvents != 1 || counter.unexpectedEvents > 0) {
395 ret = -1;
396 goto cleanup;
400 cleanup:
401 virConnectDomainEventDeregisterAny(test->conn, id);
402 if (dom != NULL)
403 virDomainFree(dom);
405 return ret;
408 static int
409 testDomainStartStopEvent(const void *data)
411 const objecteventTest *test = data;
412 lifecycleEventCounter counter;
413 int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
414 int id;
415 int ret = -1;
416 virDomainPtr dom;
417 virConnectPtr conn2 = NULL;
418 virDomainPtr dom2 = NULL;
420 lifecycleEventCounter_reset(&counter);
422 dom = virDomainLookupByName(test->conn, "test");
423 if (dom == NULL)
424 return -1;
426 id = virConnectDomainEventRegisterAny(test->conn, dom, eventId,
427 VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
428 &counter, NULL);
430 /* Test domain is started */
431 virDomainDestroy(dom);
432 if (virDomainCreate(dom) < 0)
433 goto cleanup;
435 if (virEventRunDefaultImpl() < 0)
436 goto cleanup;
438 if (counter.startEvents != 1 || counter.stopEvents != 1 ||
439 counter.unexpectedEvents > 0)
440 goto cleanup;
442 /* Repeat the test, but this time, trigger the events via an
443 * alternate connection. */
444 if (!(conn2 = virConnectOpen("test:///default")))
445 goto cleanup;
446 if (!(dom2 = virDomainLookupByName(conn2, "test")))
447 goto cleanup;
449 if (virDomainDestroy(dom2) < 0)
450 goto cleanup;
451 if (virDomainCreate(dom2) < 0)
452 goto cleanup;
454 if (virEventRunDefaultImpl() < 0)
455 goto cleanup;
457 if (counter.startEvents != 2 || counter.stopEvents != 2 ||
458 counter.unexpectedEvents > 0)
459 goto cleanup;
461 ret = 0;
462 cleanup:
463 virConnectDomainEventDeregisterAny(test->conn, id);
464 virDomainFree(dom);
465 if (dom2)
466 virDomainFree(dom2);
467 if (conn2)
468 virConnectClose(conn2);
470 return ret;
473 static int
474 testNetworkCreateXML(const void *data)
476 const objecteventTest *test = data;
477 lifecycleEventCounter counter;
478 virNetworkPtr net;
479 int id;
480 int ret = 0;
482 lifecycleEventCounter_reset(&counter);
484 id = virConnectNetworkEventRegisterAny(test->conn, NULL,
485 VIR_NETWORK_EVENT_ID_LIFECYCLE,
486 VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb),
487 &counter, NULL);
488 net = virNetworkCreateXML(test->conn, networkDef);
490 if (!net || virEventRunDefaultImpl() < 0) {
491 ret = -1;
492 goto cleanup;
495 if (counter.startEvents != 1 || counter.unexpectedEvents > 0) {
496 ret = -1;
497 goto cleanup;
500 cleanup:
501 virConnectNetworkEventDeregisterAny(test->conn, id);
502 if (net) {
503 virNetworkDestroy(net);
504 virNetworkFree(net);
506 return ret;
509 static int
510 testNetworkDefine(const void *data)
512 const objecteventTest *test = data;
513 lifecycleEventCounter counter;
514 virNetworkPtr net;
515 int id;
516 int ret = 0;
518 lifecycleEventCounter_reset(&counter);
520 id = virConnectNetworkEventRegisterAny(test->conn, NULL,
521 VIR_NETWORK_EVENT_ID_LIFECYCLE,
522 VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb),
523 &counter, NULL);
525 /* Make sure the define event is triggered */
526 net = virNetworkDefineXML(test->conn, networkDef);
528 if (!net || virEventRunDefaultImpl() < 0) {
529 ret = -1;
530 goto cleanup;
533 if (counter.defineEvents != 1 || counter.unexpectedEvents > 0) {
534 ret = -1;
535 goto cleanup;
538 /* Make sure the undefine event is triggered */
539 virNetworkUndefine(net);
541 if (virEventRunDefaultImpl() < 0) {
542 ret = -1;
543 goto cleanup;
546 if (counter.undefineEvents != 1 || counter.unexpectedEvents > 0) {
547 ret = -1;
548 goto cleanup;
552 cleanup:
553 virConnectNetworkEventDeregisterAny(test->conn, id);
554 if (net)
555 virNetworkFree(net);
557 return ret;
560 static int
561 testNetworkStartStopEvent(const void *data)
563 const objecteventTest *test = data;
564 lifecycleEventCounter counter;
565 int id;
566 int ret = 0;
568 if (!test->net)
569 return -1;
571 lifecycleEventCounter_reset(&counter);
573 id = virConnectNetworkEventRegisterAny(test->conn, test->net,
574 VIR_NETWORK_EVENT_ID_LIFECYCLE,
575 VIR_NETWORK_EVENT_CALLBACK(&networkLifecycleCb),
576 &counter, NULL);
577 virNetworkCreate(test->net);
578 virNetworkDestroy(test->net);
580 if (virEventRunDefaultImpl() < 0) {
581 ret = -1;
582 goto cleanup;
585 if (counter.startEvents != 1 || counter.stopEvents != 1 ||
586 counter.unexpectedEvents > 0) {
587 ret = -1;
588 goto cleanup;
590 cleanup:
591 virConnectNetworkEventDeregisterAny(test->conn, id);
593 return ret;
596 static int
597 testStoragePoolCreateXML(const void *data)
599 const objecteventTest *test = data;
600 lifecycleEventCounter counter;
601 virStoragePoolPtr pool;
602 int id;
603 int ret = 0;
605 lifecycleEventCounter_reset(&counter);
607 id = virConnectStoragePoolEventRegisterAny(test->conn, NULL,
608 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE,
609 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb),
610 &counter, NULL);
611 pool = virStoragePoolCreateXML(test->conn, storagePoolDef, 0);
613 if (!pool || virEventRunDefaultImpl() < 0) {
614 ret = -1;
615 goto cleanup;
618 if (counter.startEvents != 1 || counter.unexpectedEvents > 0) {
619 ret = -1;
620 goto cleanup;
623 cleanup:
624 virConnectStoragePoolEventDeregisterAny(test->conn, id);
625 if (pool) {
626 virStoragePoolDestroy(pool);
627 virStoragePoolFree(pool);
629 return ret;
632 static int
633 testStoragePoolDefine(const void *data)
635 const objecteventTest *test = data;
636 lifecycleEventCounter counter;
637 virStoragePoolPtr pool;
638 int id;
639 int ret = 0;
641 lifecycleEventCounter_reset(&counter);
643 id = virConnectStoragePoolEventRegisterAny(test->conn, NULL,
644 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE,
645 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb),
646 &counter, NULL);
648 /* Make sure the define event is triggered */
649 pool = virStoragePoolDefineXML(test->conn, storagePoolDef, 0);
651 if (!pool || virEventRunDefaultImpl() < 0) {
652 ret = -1;
653 goto cleanup;
656 if (counter.defineEvents != 1 || counter.unexpectedEvents > 0) {
657 ret = -1;
658 goto cleanup;
661 /* Make sure the undefine event is triggered */
662 virStoragePoolUndefine(pool);
664 if (virEventRunDefaultImpl() < 0) {
665 ret = -1;
666 goto cleanup;
669 if (counter.undefineEvents != 1 || counter.unexpectedEvents > 0) {
670 ret = -1;
671 goto cleanup;
675 cleanup:
676 virConnectStoragePoolEventDeregisterAny(test->conn, id);
677 if (pool)
678 virStoragePoolFree(pool);
680 return ret;
683 static int
684 testStoragePoolStartStopEvent(const void *data)
686 const objecteventTest *test = data;
687 lifecycleEventCounter counter;
688 int refreshCounter;
689 int id1, id2;
690 int ret = 0;
692 if (!test->pool)
693 return -1;
695 lifecycleEventCounter_reset(&counter);
696 refreshCounter = 0;
698 id1 = virConnectStoragePoolEventRegisterAny(test->conn, test->pool,
699 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE,
700 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb),
701 &counter, NULL);
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) {
711 ret = -1;
712 goto cleanup;
715 if (counter.startEvents != 1 || counter.stopEvents != 1 ||
716 refreshCounter != 1 || counter.unexpectedEvents > 0) {
717 ret = -1;
718 goto cleanup;
721 cleanup:
722 virConnectStoragePoolEventDeregisterAny(test->conn, id1);
723 virConnectStoragePoolEventDeregisterAny(test->conn, id2);
724 return ret;
727 static int
728 testStoragePoolBuild(const void *data)
730 const objecteventTest *test = data;
731 lifecycleEventCounter counter;
732 int id;
733 int ret = 0;
735 lifecycleEventCounter_reset(&counter);
737 id = virConnectStoragePoolEventRegisterAny(test->conn, NULL,
738 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE,
739 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb),
740 &counter, NULL);
742 virStoragePoolBuild(test->pool, 0);
744 if (virEventRunDefaultImpl() < 0) {
745 ret = -1;
746 goto cleanup;
749 if (counter.createdEvents != 1) {
750 ret = -1;
751 goto cleanup;
754 cleanup:
755 virConnectStoragePoolEventDeregisterAny(test->conn, id);
756 return ret;
759 static int
760 testStoragePoolDelete(const void *data)
762 const objecteventTest *test = data;
763 lifecycleEventCounter counter;
764 int id;
765 int ret = 0;
767 lifecycleEventCounter_reset(&counter);
769 id = virConnectStoragePoolEventRegisterAny(test->conn, NULL,
770 VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE,
771 VIR_STORAGE_POOL_EVENT_CALLBACK(&storagePoolLifecycleCb),
772 &counter, NULL);
774 virStoragePoolDelete(test->pool, 0);
776 if (virEventRunDefaultImpl() < 0) {
777 ret = -1;
778 goto cleanup;
781 if (counter.deletedEvents != 1) {
782 ret = -1;
783 goto cleanup;
786 cleanup:
787 virConnectStoragePoolEventDeregisterAny(test->conn, id);
788 return ret;
790 static int
791 testNodeDeviceCreateXML(const void *data)
793 const objecteventTest *test = data;
794 lifecycleEventCounter counter;
795 virNodeDevicePtr dev;
796 int id;
797 int ret = 0;
799 lifecycleEventCounter_reset(&counter);
801 id = virConnectNodeDeviceEventRegisterAny(test->conn, NULL,
802 VIR_NODE_DEVICE_EVENT_ID_LIFECYCLE,
803 VIR_NODE_DEVICE_EVENT_CALLBACK(&nodeDeviceLifecycleCb),
804 &counter, NULL);
805 dev = virNodeDeviceCreateXML(test->conn, nodeDeviceDef, 0);
806 virNodeDeviceDestroy(dev);
808 if (!dev || virEventRunDefaultImpl() < 0) {
809 ret = -1;
810 goto cleanup;
813 if (counter.createdEvents != 1 || counter.deletedEvents != 1 ||
814 counter.unexpectedEvents > 0) {
815 ret = -1;
816 goto cleanup;
819 cleanup:
820 virConnectNodeDeviceEventDeregisterAny(test->conn, id);
821 if (dev)
822 virNodeDeviceFree(dev);
823 return ret;
826 static void
827 timeout(int id ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED)
829 fputs("test taking too long; giving up", stderr);
830 _exit(EXIT_FAILURE);
833 static int
834 mymain(void)
836 objecteventTest test = { 0 };
837 int ret = EXIT_SUCCESS;
838 int timer;
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)
844 return EXIT_FAILURE;
846 if (!(test.conn = virConnectOpen("test:///default")))
847 return EXIT_FAILURE;
849 virTestQuiesceLibvirtErrors(false);
851 /* Domain event tests */
852 if (virTestRun("Domain createXML start event (old API)",
853 testDomainCreateXMLOld, &test) < 0)
854 ret = EXIT_FAILURE;
855 if (virTestRun("Domain createXML start event (new API)",
856 testDomainCreateXMLNew, &test) < 0)
857 ret = EXIT_FAILURE;
858 if (virTestRun("Domain createXML start event (both API)",
859 testDomainCreateXMLMixed, &test) < 0)
860 ret = EXIT_FAILURE;
861 if (virTestRun("Domain (un)define events", testDomainDefine, &test) < 0)
862 ret = EXIT_FAILURE;
863 if (virTestRun("Domain start stop events", testDomainStartStopEvent, &test) < 0)
864 ret = EXIT_FAILURE;
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)
869 ret = EXIT_FAILURE;
870 if (virTestRun("Network (un)define events", testNetworkDefine, &test) < 0)
871 ret = EXIT_FAILURE;
873 /* Define a test network */
874 if (!(test.net = virNetworkDefineXML(test.conn, networkDef)))
875 ret = EXIT_FAILURE;
876 if (virTestRun("Network start stop events ", testNetworkStartStopEvent, &test) < 0)
877 ret = EXIT_FAILURE;
879 /* Cleanup */
880 if (test.net) {
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)
888 ret = EXIT_FAILURE;
889 if (virTestRun("Storage pool (un)define events",
890 testStoragePoolDefine, &test) < 0)
891 ret = EXIT_FAILURE;
893 /* Define a test storage pool */
894 if (!(test.pool = virStoragePoolDefineXML(test.conn, storagePoolDef, 0)))
895 ret = EXIT_FAILURE;
896 if (virTestRun("Storage pool start stop events ",
897 testStoragePoolStartStopEvent, &test) < 0)
898 ret = EXIT_FAILURE;
899 /* Storage pool build and delete events */
900 if (virTestRun("Storage pool build event ",
901 testStoragePoolBuild, &test) < 0)
902 ret = EXIT_FAILURE;
903 if (virTestRun("Storage pool delete event ",
904 testStoragePoolDelete, &test) < 0)
905 ret = EXIT_FAILURE;
907 /* Node device event tests */
908 if (virTestRun("Node device createXML add event ",
909 testNodeDeviceCreateXML, &test) < 0)
910 ret = EXIT_FAILURE;
912 /* Cleanup */
913 if (test.pool) {
914 virStoragePoolUndefine(test.pool);
915 virStoragePoolFree(test.pool);
918 virConnectClose(test.conn);
919 virEventRemoveTimeout(timer);
921 return ret;
924 VIR_TEST_MAIN(mymain)