]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuxmlconftest: Separate fake drivers into a separate file
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 10 Mar 2026 18:42:12 +0000 (19:42 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 18 Mar 2026 13:23:21 +0000 (14:23 +0100)
One of the tests that qemuxmlconftest does is generate cmd line
for given domain XML. This process might involve talking to other
drivers (secret/storage/nwfilter/network). To produce predictable
output the test comes with fake implementation of APIs of those
drivers. Well, move that implementation into a separate file so
that it can be reused by other tests (notably, qemuhotplugtest is
going to use it).

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
tests/meson.build
tests/qemufakedrivers.c [new file with mode: 0644]
tests/qemufakedrivers.h [new file with mode: 0644]
tests/qemuxmlconftest.c

index 847538d2e45722dca72a08a9cc38f424acd4ade3..83aa0104bb73b424874e495cf16edc56c6f615b5 100644 (file)
@@ -151,7 +151,10 @@ endif
 if conf.has('WITH_QEMU')
   test_utils_qemu_lib = static_library(
     'test_utils_qemu',
-    [ 'testutilsqemu.c', 'testutilsqemuschema.c' ],
+    [ 'qemufakedrivers.c',
+      'testutilsqemu.c',
+      'testutilsqemuschema.c',
+    ],
     dependencies: [ tests_dep ],
   )
 
diff --git a/tests/qemufakedrivers.c b/tests/qemufakedrivers.c
new file mode 100644 (file)
index 0000000..e6de5e0
--- /dev/null
@@ -0,0 +1,362 @@
+/*
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include <config.h>
+
+#include "qemufakedrivers.h"
+#include "testutils.h"
+#include "datatypes.h"
+#include "storage_conf.h"
+
+#define VIR_FROM_THIS VIR_FROM_QEMU
+
+static unsigned char *
+fakeSecretGetValue(virSecretPtr obj G_GNUC_UNUSED,
+                   size_t *value_size,
+                   unsigned int fakeflags G_GNUC_UNUSED)
+{
+    char *secret;
+    secret = g_strdup("AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A");
+    *value_size = strlen(secret);
+    return (unsigned char *) secret;
+}
+
+
+static virSecretPtr
+fakeSecretLookupByUsage(virConnectPtr conn,
+                        int usageType,
+                        const char *usageID)
+{
+    unsigned char uuid[VIR_UUID_BUFLEN];
+    if (usageType == VIR_SECRET_USAGE_TYPE_VOLUME) {
+        if (!STRPREFIX(usageID, "/storage/guest_disks/")) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           "test provided invalid volume storage prefix '%s'",
+                           usageID);
+            return NULL;
+        }
+    } else if (STRNEQ(usageID, "mycluster_myname") &&
+               STRNEQ(usageID, "client.admin secret")) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       "test provided incorrect usage '%s'", usageID);
+        return NULL;
+    }
+
+    if (virUUIDGenerate(uuid) < 0)
+        return NULL;
+
+    return virGetSecret(conn, uuid, usageType, usageID);
+}
+
+
+static virSecretPtr
+fakeSecretLookupByUUID(virConnectPtr conn,
+                       const unsigned char *uuid)
+{
+    /* NB: This mocked value could be "tls" or "volume" depending on
+     * which test is being run, we'll leave at NONE (or 0) */
+    return virGetSecret(conn, uuid, VIR_SECRET_USAGE_TYPE_NONE, "");
+}
+
+
+static virSecretDriver fakeSecretDriver = {
+    .secretLookupByUUID = fakeSecretLookupByUUID,
+    .secretLookupByUsage = fakeSecretLookupByUsage,
+    .secretGetValue = fakeSecretGetValue,
+};
+
+
+virSecretDriver *
+testQemuGetFakeSecretDriver(void)
+{
+    return &fakeSecretDriver;
+}
+
+
+#define STORAGE_POOL_XML_PATH "storagepoolxml2xmlout/"
+static const unsigned char fakeUUID[VIR_UUID_BUFLEN] = "fakeuuid";
+
+static virStoragePoolPtr
+fakeStoragePoolLookupByName(virConnectPtr conn,
+                            const char *name)
+{
+    g_autofree char *xmlpath = NULL;
+
+    if (STRNEQ(name, "inactive")) {
+        xmlpath = g_strdup_printf("%s/%s%s.xml", abs_srcdir,
+                                  STORAGE_POOL_XML_PATH, name);
+
+        if (!virFileExists(xmlpath)) {
+            virReportError(VIR_ERR_NO_STORAGE_POOL,
+                           "File '%s' not found", xmlpath);
+            return NULL;
+        }
+    }
+
+    return virGetStoragePool(conn, name, fakeUUID, NULL, NULL);
+}
+
+
+static virStorageVolPtr
+fakeStorageVolLookupByName(virStoragePoolPtr pool,
+                           const char *name)
+{
+    g_auto(GStrv) volinfo = NULL;
+
+    if (STREQ(pool->name, "inactive")) {
+        virReportError(VIR_ERR_OPERATION_INVALID,
+                       "storage pool '%s' is not active", pool->name);
+        return NULL;
+    }
+
+    if (STREQ(name, "nonexistent")) {
+        virReportError(VIR_ERR_NO_STORAGE_VOL,
+                       "no storage vol with matching name '%s'", name);
+        return NULL;
+    }
+
+    if (!(volinfo = g_strsplit(name, "+", 2)))
+        return NULL;
+
+    if (!volinfo[1]) {
+        return virGetStorageVol(pool->conn, pool->name, name, "block", NULL, NULL);
+    }
+
+    return virGetStorageVol(pool->conn, pool->name, volinfo[1], volinfo[0],
+                           NULL, NULL);
+}
+
+
+static int
+fakeStorageVolGetInfo(virStorageVolPtr vol,
+                      virStorageVolInfoPtr info)
+{
+    memset(info, 0, sizeof(*info));
+
+    info->type = virStorageVolTypeFromString(vol->key);
+
+    if (info->type < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       "Invalid volume type '%s'", vol->key);
+        return -1;
+    }
+
+    return 0;
+}
+
+
+static char *
+fakeStorageVolGetPath(virStorageVolPtr vol)
+{
+    return g_strdup_printf("/some/%s/device/%s", vol->key, vol->name);
+}
+
+
+static char *
+fakeStoragePoolGetXMLDesc(virStoragePoolPtr pool,
+                          unsigned int flags_unused G_GNUC_UNUSED)
+{
+    g_autofree char *xmlpath = NULL;
+    char *xmlbuf = NULL;
+
+    if (STREQ(pool->name, "inactive")) {
+        virReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
+        return NULL;
+    }
+
+    xmlpath = g_strdup_printf("%s/%s%s.xml", abs_srcdir, STORAGE_POOL_XML_PATH,
+                              pool->name);
+
+    if (virTestLoadFile(xmlpath, &xmlbuf) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       "failed to load XML file '%s'",
+                       xmlpath);
+        return NULL;
+    }
+
+    return xmlbuf;
+}
+
+
+static int
+fakeStoragePoolIsActive(virStoragePoolPtr pool)
+{
+    if (STREQ(pool->name, "inactive"))
+        return 0;
+
+    return 1;
+}
+
+
+/* Test storage pool implementation
+ *
+ * These functions aid testing of storage pool related stuff when creating a
+ * qemu command line.
+ *
+ * There are a few "magic" values to pass to these functions:
+ *
+ * 1) "inactive" as a pool name to create an inactive pool. All other names are
+ * interpreted as file names in storagepoolxml2xmlout/ and are used as the
+ * definition for the pool. If the file doesn't exist the pool doesn't exist.
+ *
+ * 2) "nonexistent" returns an error while looking up a volume. Otherwise
+ * pattern VOLUME_TYPE+VOLUME_PATH can be used to simulate a volume in a pool.
+ * This creates a fake path for this volume. If the '+' sign is omitted, block
+ * type is assumed.
+ */
+static virStorageDriver fakeStorageDriver = {
+    .storagePoolLookupByName = fakeStoragePoolLookupByName,
+    .storageVolLookupByName = fakeStorageVolLookupByName,
+    .storagePoolGetXMLDesc = fakeStoragePoolGetXMLDesc,
+    .storageVolGetPath = fakeStorageVolGetPath,
+    .storageVolGetInfo = fakeStorageVolGetInfo,
+    .storagePoolIsActive = fakeStoragePoolIsActive,
+};
+
+
+virStorageDriver *
+testQemuGetFakeStorageDriver(void)
+{
+    return &fakeStorageDriver;
+}
+
+
+/* virNetDevOpenvswitchGetVhostuserIfname mocks a portdev name - handle that */
+static virNWFilterBindingPtr
+fakeNWFilterBindingLookupByPortDev(virConnectPtr conn,
+                                   const char *portdev)
+{
+    if (STREQ(portdev, "vhost-user0"))
+        return virGetNWFilterBinding(conn, "fake_vnet0", "fakeFilterName");
+
+    virReportError(VIR_ERR_NO_NWFILTER_BINDING,
+                   "no nwfilter binding for port dev '%s'", portdev);
+    return NULL;
+}
+
+
+static int
+fakeNWFilterBindingDelete(virNWFilterBindingPtr binding G_GNUC_UNUSED)
+{
+    return 0;
+}
+
+
+static virNWFilterDriver fakeNWFilterDriver = {
+    .nwfilterBindingLookupByPortDev = fakeNWFilterBindingLookupByPortDev,
+    .nwfilterBindingDelete = fakeNWFilterBindingDelete,
+};
+
+
+virNWFilterDriver *
+testQemuGetFakeNWFilterDriver(void)
+{
+    return &fakeNWFilterDriver;
+}
+
+
+/* name of the fake network shall be constructed as:
+ *  NETWORKXMLNAME;NETWORKPORTXMLNAME
+ *  where:
+ *  NETWORKXMLNAME resolves to abs_srcdir/networkxmlconfdata/NETWORKXMLNAME.xml
+ *  NETWORKPORTXMLNAME resolves to abs_srcdir/virnetworkportxml2xmldata/NETWORKPORTXMLNAME.xml
+ */
+static virNetworkPtr
+fakeNetworkLookupByName(virConnectPtr conn,
+                        const char *name)
+{
+    unsigned char uuid[VIR_UUID_BUFLEN];
+    g_autofree char *netname = g_strdup(name);
+    g_autofree char *path = NULL;
+    char *tmp;
+
+    memset(uuid, 0, VIR_UUID_BUFLEN);
+
+    if ((tmp = strchr(netname, ';'))) {
+        *tmp = '\0';
+    } else {
+        virReportError(VIR_ERR_NO_NETWORK,
+                       "Malformed fake network name '%s'. See fakeNetworkLookupByName.",
+                       name);
+        return NULL;
+    }
+
+    path = g_strdup_printf(abs_srcdir "/networkxmlconfdata/%s.xml", netname);
+
+    if (!virFileExists(path)) {
+        virReportError(VIR_ERR_NO_NETWORK, "fake network '%s' not found", path);
+        return NULL;
+    }
+
+    return virGetNetwork(conn, name, uuid);
+}
+
+
+static char *
+fakeNetworkGetXMLDesc(virNetworkPtr network,
+                      unsigned int noflags G_GNUC_UNUSED)
+{
+    g_autofree char *netname = g_strdup(network->name);
+    g_autofree char *path = NULL;
+    char *xml = NULL;
+
+    *(strchr(netname, ';')) = '\0';
+
+    path = g_strdup_printf(abs_srcdir "/networkxmlconfdata/%s.xml", netname);
+
+    if (virFileReadAll(path, 4 * 1024, &xml) < 0)
+        return NULL;
+
+    return xml;
+}
+
+
+static virNetworkPortPtr
+fakeNetworkPortCreateXML(virNetworkPtr net,
+                         const char *xmldesc G_GNUC_UNUSED,
+                         unsigned int noflags G_GNUC_UNUSED)
+{
+    unsigned char uuid[VIR_UUID_BUFLEN];
+    g_autofree char *portname = g_strdup(strchr(net->name, ';') + 1);
+    g_autofree char *path = g_strdup_printf(abs_srcdir "/virnetworkportxml2xmldata/%s.xml", portname);
+
+    memset(uuid, 0, VIR_UUID_BUFLEN);
+
+    if (!virFileExists(path)) {
+        virReportError(VIR_ERR_NO_NETWORK_PORT, "fake network port '%s' not found", path);
+        return NULL;
+    }
+
+    return virGetNetworkPort(net, uuid);
+}
+
+
+static char *
+fakeNetworkPortGetXMLDesc(virNetworkPortPtr port,
+                          unsigned int noflags G_GNUC_UNUSED)
+{
+    g_autofree char *portname = g_strdup(strchr(port->net->name, ';') + 1);
+    g_autofree char *path = g_strdup_printf(abs_srcdir "/virnetworkportxml2xmldata/%s.xml", portname);
+    char *xml = NULL;
+
+    if (virFileReadAll(path, 4 * 1024, &xml) < 0)
+        return NULL;
+
+    return xml;
+}
+
+
+static virNetworkDriver fakeNetworkDriver = {
+    .networkLookupByName = fakeNetworkLookupByName,
+    .networkGetXMLDesc = fakeNetworkGetXMLDesc,
+    .networkPortCreateXML = fakeNetworkPortCreateXML,
+    .networkPortGetXMLDesc = fakeNetworkPortGetXMLDesc,
+};
+
+
+virNetworkDriver *
+testQemuGetFakeNetworkDriver(void)
+{
+    return &fakeNetworkDriver;
+}
diff --git a/tests/qemufakedrivers.h b/tests/qemufakedrivers.h
new file mode 100644 (file)
index 0000000..172ae48
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#pragma once
+
+#include "driver.h"
+
+virSecretDriver *
+testQemuGetFakeSecretDriver(void);
+
+virStorageDriver *
+testQemuGetFakeStorageDriver(void);
+
+virNWFilterDriver *
+testQemuGetFakeNWFilterDriver(void);
+
+virNetworkDriver *
+testQemuGetFakeNetworkDriver(void);
index cf147e70d445e5f066c827a288798df75d79329b..32eb42dd19600b3af494c333ae36ad13c134bab5 100644 (file)
@@ -23,6 +23,7 @@
 #include "virfilewrapper.h"
 #include "configmake.h"
 #include "testutilsqemuschema.h"
+#include "qemufakedrivers.h"
 
 #define LIBVIRT_QEMU_CAPSPRIV_H_ALLOW
 #include "qemu/qemu_capspriv.h"
 
 static virQEMUDriver driver;
 
-static unsigned char *
-fakeSecretGetValue(virSecretPtr obj G_GNUC_UNUSED,
-                   size_t *value_size,
-                   unsigned int fakeflags G_GNUC_UNUSED)
-{
-    char *secret;
-    secret = g_strdup("AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A");
-    *value_size = strlen(secret);
-    return (unsigned char *) secret;
-}
-
-static virSecretPtr
-fakeSecretLookupByUsage(virConnectPtr conn,
-                        int usageType,
-                        const char *usageID)
-{
-    unsigned char uuid[VIR_UUID_BUFLEN];
-    if (usageType == VIR_SECRET_USAGE_TYPE_VOLUME) {
-        if (!STRPREFIX(usageID, "/storage/guest_disks/")) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           "test provided invalid volume storage prefix '%s'",
-                           usageID);
-            return NULL;
-        }
-    } else if (STRNEQ(usageID, "mycluster_myname") &&
-               STRNEQ(usageID, "client.admin secret")) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "test provided incorrect usage '%s'", usageID);
-        return NULL;
-    }
-
-    if (virUUIDGenerate(uuid) < 0)
-        return NULL;
-
-    return virGetSecret(conn, uuid, usageType, usageID);
-}
-
-static virSecretPtr
-fakeSecretLookupByUUID(virConnectPtr conn,
-                       const unsigned char *uuid)
-{
-    /* NB: This mocked value could be "tls" or "volume" depending on
-     * which test is being run, we'll leave at NONE (or 0) */
-    return virGetSecret(conn, uuid, VIR_SECRET_USAGE_TYPE_NONE, "");
-}
-
-static virSecretDriver fakeSecretDriver = {
-    .connectNumOfSecrets = NULL,
-    .connectListSecrets = NULL,
-    .secretLookupByUUID = fakeSecretLookupByUUID,
-    .secretLookupByUsage = fakeSecretLookupByUsage,
-    .secretDefineXML = NULL,
-    .secretGetXMLDesc = NULL,
-    .secretSetValue = NULL,
-    .secretGetValue = fakeSecretGetValue,
-    .secretUndefine = NULL,
-};
-
-
-#define STORAGE_POOL_XML_PATH "storagepoolxml2xmlout/"
-static const unsigned char fakeUUID[VIR_UUID_BUFLEN] = "fakeuuid";
-
-static virStoragePoolPtr
-fakeStoragePoolLookupByName(virConnectPtr conn,
-                            const char *name)
-{
-    g_autofree char *xmlpath = NULL;
-
-    if (STRNEQ(name, "inactive")) {
-        xmlpath = g_strdup_printf("%s/%s%s.xml", abs_srcdir,
-                                  STORAGE_POOL_XML_PATH, name);
-
-        if (!virFileExists(xmlpath)) {
-            virReportError(VIR_ERR_NO_STORAGE_POOL,
-                           "File '%s' not found", xmlpath);
-            return NULL;
-        }
-    }
-
-    return virGetStoragePool(conn, name, fakeUUID, NULL, NULL);
-}
-
-
-static virStorageVolPtr
-fakeStorageVolLookupByName(virStoragePoolPtr pool,
-                           const char *name)
-{
-    g_auto(GStrv) volinfo = NULL;
-
-    if (STREQ(pool->name, "inactive")) {
-        virReportError(VIR_ERR_OPERATION_INVALID,
-                       "storage pool '%s' is not active", pool->name);
-        return NULL;
-    }
-
-    if (STREQ(name, "nonexistent")) {
-        virReportError(VIR_ERR_NO_STORAGE_VOL,
-                       "no storage vol with matching name '%s'", name);
-        return NULL;
-    }
-
-    if (!(volinfo = g_strsplit(name, "+", 2)))
-        return NULL;
-
-    if (!volinfo[1]) {
-        return virGetStorageVol(pool->conn, pool->name, name, "block", NULL, NULL);
-    }
-
-    return virGetStorageVol(pool->conn, pool->name, volinfo[1], volinfo[0],
-                           NULL, NULL);
-}
-
-static int
-fakeStorageVolGetInfo(virStorageVolPtr vol,
-                      virStorageVolInfoPtr info)
-{
-    memset(info, 0, sizeof(*info));
-
-    info->type = virStorageVolTypeFromString(vol->key);
-
-    if (info->type < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "Invalid volume type '%s'", vol->key);
-        return -1;
-    }
-
-    return 0;
-}
-
-
-static char *
-fakeStorageVolGetPath(virStorageVolPtr vol)
-{
-    return g_strdup_printf("/some/%s/device/%s", vol->key, vol->name);
-}
-
-
-static char *
-fakeStoragePoolGetXMLDesc(virStoragePoolPtr pool,
-                          unsigned int flags_unused G_GNUC_UNUSED)
-{
-    g_autofree char *xmlpath = NULL;
-    char *xmlbuf = NULL;
-
-    if (STREQ(pool->name, "inactive")) {
-        virReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
-        return NULL;
-    }
-
-    xmlpath = g_strdup_printf("%s/%s%s.xml", abs_srcdir, STORAGE_POOL_XML_PATH,
-                              pool->name);
-
-    if (virTestLoadFile(xmlpath, &xmlbuf) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "failed to load XML file '%s'",
-                       xmlpath);
-        return NULL;
-    }
-
-    return xmlbuf;
-}
-
-static int
-fakeStoragePoolIsActive(virStoragePoolPtr pool)
-{
-    if (STREQ(pool->name, "inactive"))
-        return 0;
-
-    return 1;
-}
-
-/* Test storage pool implementation
- *
- * These functions aid testing of storage pool related stuff when creating a
- * qemu command line.
- *
- * There are a few "magic" values to pass to these functions:
- *
- * 1) "inactive" as a pool name to create an inactive pool. All other names are
- * interpreted as file names in storagepoolxml2xmlout/ and are used as the
- * definition for the pool. If the file doesn't exist the pool doesn't exist.
- *
- * 2) "nonexistent" returns an error while looking up a volume. Otherwise
- * pattern VOLUME_TYPE+VOLUME_PATH can be used to simulate a volume in a pool.
- * This creates a fake path for this volume. If the '+' sign is omitted, block
- * type is assumed.
- */
-static virStorageDriver fakeStorageDriver = {
-    .storagePoolLookupByName = fakeStoragePoolLookupByName,
-    .storageVolLookupByName = fakeStorageVolLookupByName,
-    .storagePoolGetXMLDesc = fakeStoragePoolGetXMLDesc,
-    .storageVolGetPath = fakeStorageVolGetPath,
-    .storageVolGetInfo = fakeStorageVolGetInfo,
-    .storagePoolIsActive = fakeStoragePoolIsActive,
-};
-
-
-/* virNetDevOpenvswitchGetVhostuserIfname mocks a portdev name - handle that */
-static virNWFilterBindingPtr
-fakeNWFilterBindingLookupByPortDev(virConnectPtr conn,
-                                   const char *portdev)
-{
-    if (STREQ(portdev, "vhost-user0"))
-        return virGetNWFilterBinding(conn, "fake_vnet0", "fakeFilterName");
-
-    virReportError(VIR_ERR_NO_NWFILTER_BINDING,
-                   "no nwfilter binding for port dev '%s'", portdev);
-    return NULL;
-}
-
-
-static int
-fakeNWFilterBindingDelete(virNWFilterBindingPtr binding G_GNUC_UNUSED)
-{
-    return 0;
-}
-
-
-static virNWFilterDriver fakeNWFilterDriver = {
-    .nwfilterBindingLookupByPortDev = fakeNWFilterBindingLookupByPortDev,
-    .nwfilterBindingDelete = fakeNWFilterBindingDelete,
-};
-
-
-/* name of the fake network shall be constructed as:
- *  NETWORKXMLNAME;NETWORKPORTXMLNAME
- *  where:
- *  NETWORKXMLNAME resolves to abs_srcdir/networkxmlconfdata/NETWORKXMLNAME.xml
- *  NETWORKPORTXMLNAME resolves to abs_srcdir/virnetworkportxml2xmldata/NETWORKPORTXMLNAME.xml
- */
-static virNetworkPtr
-fakeNetworkLookupByName(virConnectPtr conn,
-                        const char *name)
-{
-    unsigned char uuid[VIR_UUID_BUFLEN];
-    g_autofree char *netname = g_strdup(name);
-    g_autofree char *path = NULL;
-    char *tmp;
-
-    memset(uuid, 0, VIR_UUID_BUFLEN);
-
-    if ((tmp = strchr(netname, ';'))) {
-        *tmp = '\0';
-    } else {
-        virReportError(VIR_ERR_NO_NETWORK,
-                       "Malformed fake network name '%s'. See fakeNetworkLookupByName.",
-                       name);
-        return NULL;
-    }
-
-    path = g_strdup_printf(abs_srcdir "/networkxmlconfdata/%s.xml", netname);
-
-    if (!virFileExists(path)) {
-        virReportError(VIR_ERR_NO_NETWORK, "fake network '%s' not found", path);
-        return NULL;
-    }
-
-    return virGetNetwork(conn, name, uuid);
-}
-
-
-static char *
-fakeNetworkGetXMLDesc(virNetworkPtr network,
-                      unsigned int noflags G_GNUC_UNUSED)
-{
-    g_autofree char *netname = g_strdup(network->name);
-    g_autofree char *path = NULL;
-    char *xml = NULL;
-
-    *(strchr(netname, ';')) = '\0';
-
-    path = g_strdup_printf(abs_srcdir "/networkxmlconfdata/%s.xml", netname);
-
-    if (virFileReadAll(path, 4 * 1024, &xml) < 0)
-        return NULL;
-
-    return xml;
-}
-
-
-static virNetworkPortPtr
-fakeNetworkPortCreateXML(virNetworkPtr net,
-                         const char *xmldesc G_GNUC_UNUSED,
-                         unsigned int noflags G_GNUC_UNUSED)
-{
-    unsigned char uuid[VIR_UUID_BUFLEN];
-    g_autofree char *portname = g_strdup(strchr(net->name, ';') + 1);
-    g_autofree char *path = g_strdup_printf(abs_srcdir "/virnetworkportxml2xmldata/%s.xml", portname);
-
-    memset(uuid, 0, VIR_UUID_BUFLEN);
-
-    if (!virFileExists(path)) {
-        virReportError(VIR_ERR_NO_NETWORK_PORT, "fake network port '%s' not found", path);
-        return NULL;
-    }
-
-    return virGetNetworkPort(net, uuid);
-}
-
-
-static char *
-fakeNetworkPortGetXMLDesc(virNetworkPortPtr port,
-                          unsigned int noflags G_GNUC_UNUSED)
-{
-    g_autofree char *portname = g_strdup(strchr(port->net->name, ';') + 1);
-    g_autofree char *path = g_strdup_printf(abs_srcdir "/virnetworkportxml2xmldata/%s.xml", portname);
-    char *xml = NULL;
-
-    if (virFileReadAll(path, 4 * 1024, &xml) < 0)
-        return NULL;
-
-    return xml;
-}
-
 
 static void
 testQemuPrepareHostdevPCI(virDomainHostdevDef *hostdev)
@@ -418,14 +105,6 @@ testQemuPrepareHostdev(virDomainObj *vm)
 }
 
 
-static virNetworkDriver fakeNetworkDriver = {
-    .networkLookupByName = fakeNetworkLookupByName,
-    .networkGetXMLDesc = fakeNetworkGetXMLDesc,
-    .networkPortCreateXML = fakeNetworkPortCreateXML,
-    .networkPortGetXMLDesc = fakeNetworkPortGetXMLDesc,
-};
-
-
 static void
 testUpdateQEMUCapsHostCPUModel(virQEMUCaps *qemuCaps, virArch hostArch)
 {
@@ -1273,10 +952,10 @@ mymain(void)
     if (!(conn = virGetConnect()))
         return EXIT_FAILURE;
 
-    conn->secretDriver = &fakeSecretDriver;
-    conn->storageDriver = &fakeStorageDriver;
-    conn->nwfilterDriver = &fakeNWFilterDriver;
-    conn->networkDriver = &fakeNetworkDriver;
+    conn->secretDriver = testQemuGetFakeSecretDriver();
+    conn->storageDriver = testQemuGetFakeStorageDriver();
+    conn->nwfilterDriver = testQemuGetFakeNWFilterDriver();
+    conn->networkDriver = testQemuGetFakeNetworkDriver();
 
     virSetConnectInterface(conn);
     virSetConnectNetwork(conn);