[libvirt] [v3 01/32] Added domain start/stop/define/undefine event unit tests

Cédric Bosdonnat cbosdonnat at suse.com
Mon Dec 2 16:39:19 UTC 2013


These unit tests are aiming at providing some help during the domain
events refactoring.
---
 .gitignore              |   1 +
 tests/Makefile.am       |   7 ++
 tests/objecteventtest.c | 246 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 254 insertions(+)
 create mode 100644 tests/objecteventtest.c

diff --git a/.gitignore b/.gitignore
index 8de0b26..fbb2c01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -160,6 +160,7 @@
 /tests/networkxml2argvtest
 /tests/nodeinfotest
 /tests/nwfilterxml2xmltest
+/tests/objecteventtest
 /tests/object-locking
 /tests/object-locking-files.txt
 /tests/object-locking.cm[ix]
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0900448..568b7a0 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -303,6 +303,8 @@ EXTRA_DIST += 				\
 	$(NULL)
 endif ! WITH_LIBVIRTD
 
+test_programs += objecteventtest
+
 if WITH_SECDRIVER_APPARMOR
 test_scripts += virt-aa-helper-test
 else ! WITH_SECDRIVER_APPARMOR
@@ -895,6 +897,11 @@ fdstreamtest_SOURCES = \
 	fdstreamtest.c testutils.h testutils.c
 fdstreamtest_LDADD = $(LDADDS)
 
+objecteventtest_SOURCES = \
+	objecteventtest.c \
+	testutils.c testutils.h
+objecteventtest_LDADD = $(LDADDS)
+
 if WITH_LINUX
 fchosttest_SOURCES = \
        fchosttest.c testutils.h testutils.c
diff --git a/tests/objecteventtest.c b/tests/objecteventtest.c
new file mode 100644
index 0000000..031d677
--- /dev/null
+++ b/tests/objecteventtest.c
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library;  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Author: Cedric Bosdonnat <cbosdonnat at suse.com>
+ */
+
+#include <config.h>
+
+#include "testutils.h"
+
+#include "virerror.h"
+#include "virxml.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+
+static const char domainDef[] =
+"<domain type='test'>"
+"  <name>test-domain</name>"
+"  <uuid>77a6fc12-07b5-9415-8abb-a803613f2a40</uuid>"
+"  <memory>8388608</memory>"
+"  <currentMemory>2097152</currentMemory>"
+"  <vcpu>2</vcpu>"
+"  <os>"
+"    <type>hvm</type>"
+"  </os>"
+"</domain>";
+
+struct lifecycleEventCounter {
+    int startEvents;
+    int stopEvents;
+    int defineEvents;
+    int undefineEvents;
+};
+
+static void lifecycleEventCounter_reset(struct lifecycleEventCounter* counter)
+{
+    counter->startEvents = 0;
+    counter->stopEvents = 0;
+    counter->defineEvents = 0;
+    counter->undefineEvents = 0;
+}
+
+struct objecteventTest {
+    virConnectPtr conn;
+};
+
+
+static int domainLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED,
+                             virDomainPtr dom ATTRIBUTE_UNUSED,
+                             int event,
+                             int detail ATTRIBUTE_UNUSED,
+                             void *opaque)
+{
+    struct lifecycleEventCounter *counter = opaque;
+
+    switch (event) {
+        case VIR_DOMAIN_EVENT_STARTED:
+            counter->startEvents++;
+            break;
+        case VIR_DOMAIN_EVENT_STOPPED:
+            counter->stopEvents++;
+            break;
+        case VIR_DOMAIN_EVENT_DEFINED:
+            counter->defineEvents++;
+            break;
+        case VIR_DOMAIN_EVENT_UNDEFINED:
+            counter->undefineEvents++;
+            break;
+        default:
+            /* Ignore other events */
+            break;
+    }
+    return 0;
+}
+
+static int
+testDomainCreateXML(const void *data)
+{
+    const struct objecteventTest *test = data;
+    struct lifecycleEventCounter counter;
+    int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
+    virDomainPtr dom;
+    int id;
+    int ret = 0;
+
+    lifecycleEventCounter_reset(&counter);
+
+    id = virConnectDomainEventRegisterAny(test->conn, NULL, eventId,
+                           VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
+                           &counter, NULL);
+    dom = virDomainCreateXML(test->conn, domainDef, 0);
+
+    if (dom == NULL || virEventRunDefaultImpl() < 0) {
+        ret = -1;
+        goto cleanup;
+    }
+
+    if (counter.startEvents != 1) {
+        ret = -1;
+        goto cleanup;
+    }
+
+cleanup:
+    virConnectDomainEventDeregisterAny(test->conn, id);
+    if (dom != NULL) {
+        virDomainDestroy(dom);
+        virDomainFree(dom);
+    }
+
+    return ret;
+}
+
+static int
+testDomainDefine(const void *data)
+{
+    const struct objecteventTest *test = data;
+    struct lifecycleEventCounter counter;
+    int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
+    virDomainPtr dom;
+    int id;
+    int ret = 0;
+
+    lifecycleEventCounter_reset(&counter);
+
+    id = virConnectDomainEventRegisterAny(test->conn, NULL, eventId,
+                           VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
+                           &counter, NULL);
+
+    /* Make sure the define event is triggered */
+    dom = virDomainDefineXML(test->conn, domainDef);
+
+    if (dom == NULL || virEventRunDefaultImpl() < 0) {
+        ret = -1;
+        goto cleanup;
+    }
+
+    if (counter.defineEvents != 1) {
+        ret = -1;
+        goto cleanup;
+    }
+
+    /* Make sure the undefine event is triggered */
+    virDomainUndefine(dom);
+
+    if (virEventRunDefaultImpl() < 0) {
+        ret = -1;
+        goto cleanup;
+    }
+
+    if (counter.undefineEvents != 1) {
+        ret = -1;
+        goto cleanup;
+    }
+
+
+cleanup:
+    virConnectDomainEventDeregisterAny(test->conn, id);
+    if (dom != NULL)
+        virDomainFree(dom);
+
+    return ret;
+}
+
+static int
+testDomainStartStopEvent(const void *data)
+{
+    const struct objecteventTest *test = data;
+    struct lifecycleEventCounter counter;
+    int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
+    int id;
+    int ret = 0;
+    virDomainPtr dom;
+
+    lifecycleEventCounter_reset(&counter);
+
+    dom = virDomainLookupByName(test->conn, "test");
+    if (dom == NULL)
+        return -1;
+
+    id = virConnectDomainEventRegisterAny(test->conn, dom, eventId,
+                           VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
+                           &counter, NULL);
+
+    /* Test domain is started */
+    virDomainDestroy(dom);
+    virDomainCreate(dom);
+
+    if (virEventRunDefaultImpl() < 0) {
+        ret = -1;
+        goto cleanup;
+    }
+
+    if (counter.startEvents != 1 || counter.stopEvents != 1) {
+        ret = -1;
+        goto cleanup;
+    }
+
+cleanup:
+    virConnectDomainEventDeregisterAny(test->conn, id);
+    virDomainFree(dom);
+
+    return ret;
+}
+
+static int
+mymain(void)
+{
+    struct objecteventTest test;
+    int ret = EXIT_SUCCESS;
+
+    virEventRegisterDefaultImpl();
+
+    if (!(test.conn = virConnectOpen("test:///default")))
+        return EXIT_FAILURE;
+
+    virtTestQuiesceLibvirtErrors(false);
+
+    /* Domain event tests */
+    if (virtTestRun("Domain createXML start event ", testDomainCreateXML, &test) < 0)
+        ret = EXIT_FAILURE;
+    if (virtTestRun("Domain (un)define events", testDomainDefine, &test) < 0)
+        ret = EXIT_FAILURE;
+    if (virtTestRun("Domain start stop events", testDomainStartStopEvent, &test) < 0)
+        ret = EXIT_FAILURE;
+
+    virConnectClose(test.conn);
+
+    return ret;
+}
+
+VIRT_TEST_MAIN(mymain)
-- 
1.8.4.4




More information about the libvir-list mailing list