[libvirt] [PATCH] openvz: Add simple test for openvzReadNetworkConf

Matthias Bolte matthias.bolte at googlemail.com
Tue May 31 13:11:38 UTC 2011


Convert openvzLocateConfFile to a replaceable callback to allow
testing the config file parsing without rewriting the whole OpenVZ
config parsing to a more testable structure.

Also ignore the openvzutilstest binary.
---
 src/openvz/openvz_conf.c   |   28 +++++++++++----
 src/openvz/openvz_conf.h   |    6 +++
 tests/.gitignore           |    1 +
 tests/openvzutilstest.c    |   78 ++++++++++++++++++++++++++++++++++++++++++++
 tests/openvzutilstest.conf |    1 +
 5 files changed, 106 insertions(+), 8 deletions(-)

diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 6e32242..bba4e6f 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -60,6 +60,9 @@ static char *openvzLocateConfDir(void);
 static int openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len);
 static int openvzLocateConfFile(int vpsid, char **conffile, const char *ext);
 static int openvzAssignUUIDs(void);
+static int openvzLocateConfFileDefault(int vpsid, char **conffile, const char *ext);
+
+openvzLocateConfFileFunc openvzLocateConfFileCallback = openvzLocateConfFileDefault;
 
 int
 strtoI(const char *str)
@@ -171,7 +174,7 @@ no_memory:
 }
 
 
-static int
+int
 openvzReadNetworkConf(virDomainDefPtr def,
                       int veid) {
     int ret;
@@ -473,6 +476,8 @@ int openvzLoadDomains(struct openvz_driver *driver) {
         if (VIR_ALLOC(dom->def) < 0)
             goto no_memory;
 
+        dom->def->virtType = VIR_DOMAIN_VIRT_OPENVZ;
+
         if (STREQ(status, "stopped")) {
             virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF,
                                  VIR_DOMAIN_SHUTOFF_UNKNOWN);
@@ -793,12 +798,9 @@ cleanup:
     return ret;
 }
 
-/* Locate config file of container
-* return -1 - error
-*         0 - OK
-*/
+
 static int
-openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
+openvzLocateConfFileDefault(int vpsid, char **conffile, const char *ext)
 {
     char * confdir;
     int ret = 0;
@@ -817,8 +819,18 @@ openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
     return ret;
 }
 
-static char
-*openvzLocateConfDir(void)
+/* Locate config file of container
+ * return -1 - error
+ *         0 - OK
+ */
+static int
+openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
+{
+    return openvzLocateConfFileCallback(vpsid, conffile, ext);
+}
+
+static char *
+openvzLocateConfDir(void)
 {
     const char *conf_dir_list[] = {"/etc/vz/conf", "/usr/local/etc/conf", NULL};
     int i=0;
diff --git a/src/openvz/openvz_conf.h b/src/openvz/openvz_conf.h
index d5a57a6..182ebae 100644
--- a/src/openvz/openvz_conf.h
+++ b/src/openvz/openvz_conf.h
@@ -53,6 +53,11 @@ struct openvz_driver {
     int version;
 };
 
+typedef int (*openvzLocateConfFileFunc)(int vpsid, char **conffile, const char *ext);
+
+/* this allows the testsuite to replace the conf file locator function */
+extern openvzLocateConfFileFunc openvzLocateConfFileCallback;
+
 int openvz_readline(int fd, char *ptr, int maxlen);
 int openvzExtractVersion(struct openvz_driver *driver);
 int openvzReadVPSConfigParam(int vpsid, const char *param, char **value);
@@ -66,5 +71,6 @@ int strtoI(const char *str);
 int openvzSetDefinedUUID(int vpsid, unsigned char *uuid);
 unsigned int openvzGetNodeCPUs(void);
 int openvzGetVEID(const char *name);
+int openvzReadNetworkConf(virDomainDefPtr def, int veid);
 
 #endif /* OPENVZ_CONF_H */
diff --git a/tests/.gitignore b/tests/.gitignore
index e3906f0..749b5b9 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -16,6 +16,7 @@ object-locking
 object-locking-files.txt
 object-locking.cmi
 object-locking.cmx
+openvzutilstest
 qemuargv2xmltest
 qemuhelptest
 qemuxml2argvtest
diff --git a/tests/openvzutilstest.c b/tests/openvzutilstest.c
index fe6a2ea..567131a 100644
--- a/tests/openvzutilstest.c
+++ b/tests/openvzutilstest.c
@@ -12,6 +12,13 @@
 # include "util.h"
 # include "openvz/openvz_conf.h"
 
+static int
+testLocateConfFile(int vpsid ATTRIBUTE_UNUSED, char **conffile,
+                   const char *ext ATTRIBUTE_UNUSED)
+{
+    return virAsprintf(conffile, "%s/openvzutilstest.conf", abs_srcdir);
+}
+
 struct testConfigParam {
     const char *param;
     const char *value;
@@ -62,10 +69,80 @@ cleanup:
 }
 
 static int
+testReadNetworkConf(const void *data ATTRIBUTE_UNUSED)
+{
+    int result = -1;
+    virDomainDefPtr def = NULL;
+    char *actual = NULL;
+    virErrorPtr err = NULL;
+    const char *expected =
+        "<domain type='openvz'>\n"
+        "  <uuid>00000000-0000-0000-0000-000000000000</uuid>\n"
+        "  <memory>0</memory>\n"
+        "  <currentMemory>0</currentMemory>\n"
+        "  <vcpu>0</vcpu>\n"
+        "  <os>\n"
+        "    <type>exe</type>\n"
+        "    <init>/sbin/init</init>\n"
+        "  </os>\n"
+        "  <clock offset='utc'/>\n"
+        "  <on_poweroff>destroy</on_poweroff>\n"
+        "  <on_reboot>destroy</on_reboot>\n"
+        "  <on_crash>destroy</on_crash>\n"
+        "  <devices>\n"
+        "    <interface type='ethernet'>\n"
+        "      <mac address='00:00:00:00:00:00'/>\n"
+        "      <ip address='194.44.18.88'/>\n"
+        "    </interface>\n"
+        "    <interface type='bridge'>\n"
+        "      <mac address='00:18:51:c1:05:ee'/>\n"
+        "      <target dev='veth105.10'/>\n"
+        "    </interface>\n"
+        "  </devices>\n"
+        "</domain>\n";
+
+    if (VIR_ALLOC(def) < 0 ||
+        !(def->os.type = strdup("exe")) ||
+        !(def->os.init = strdup("/sbin/init")))
+        goto cleanup;
+
+    def->virtType = VIR_DOMAIN_VIRT_OPENVZ;
+
+    if (openvzReadNetworkConf(def, 1) < 0) {
+        err = virGetLastError();
+        fprintf(stderr, "ERROR: %s\n", err != NULL ? err->message : "<unknown>");
+        goto cleanup;
+    }
+
+    actual = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE);
+
+    if (actual == NULL) {
+        err = virGetLastError();
+        fprintf(stderr, "ERROR: %s\n", err != NULL ? err->message : "<unknown>");
+        goto cleanup;
+    }
+
+    if (STRNEQ(expected, actual)) {
+        virtTestDifference(stderr, expected, actual);
+        goto cleanup;
+    }
+
+    result = 0;
+
+cleanup:
+    VIR_FREE(actual);
+    virDomainDefFree(def);
+
+    return result;
+}
+
+static int
 mymain(void)
 {
     int result = 0;
 
+    openvzLocateConfFileCallback = testLocateConfFile;
+
 # define DO_TEST(_name)                                                       \
         do {                                                                  \
             if (virtTestRun("OpenVZ "#_name, 1, test##_name,                  \
@@ -75,6 +152,7 @@ mymain(void)
         } while (0)
 
     DO_TEST(ReadConfigParam);
+    DO_TEST(ReadNetworkConf);
 
     return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
diff --git a/tests/openvzutilstest.conf b/tests/openvzutilstest.conf
index a1b93b7..c5d048c 100644
--- a/tests/openvzutilstest.conf
+++ b/tests/openvzutilstest.conf
@@ -39,3 +39,4 @@ QUOTATIME=""
 DISK_QUOTA=no
 OSTEMPLATE="rhel-5-lystor"
 IP_ADDRESS="194.44.18.88"
+NETIF="ifname=eth10,mac=00:18:51:C1:05:EE,host_ifname=veth105.10,host_mac=00:18:51:8F:D9:F3
-- 
1.7.0.4




More information about the libvir-list mailing list