From: Michal Privoznik <mprivozn@redhat.com>
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>
---
tests/meson.build | 5 +-
tests/qemufakedrivers.c | 368 ++++++++++++++++++++++++++++++++++++++++
tests/qemufakedrivers.h | 19 +++
tests/qemuxmlconftest.c | 331 +-----------------------------------
4 files changed, 396 insertions(+), 327 deletions(-)
create mode 100644 tests/qemufakedrivers.c
create mode 100644 tests/qemufakedrivers.h
diff --git a/tests/meson.build b/tests/meson.build
index 847538d2e4..83aa0104bb 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -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
index 0000000000..94ad5aeb0b
--- /dev/null
+++ b/tests/qemufakedrivers.c
@@ -0,0 +1,368 @@
+/*
+ * 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 = {
+ .connectNumOfSecrets = NULL,
+ .connectListSecrets = NULL,
+ .secretLookupByUUID = fakeSecretLookupByUUID,
+ .secretLookupByUsage = fakeSecretLookupByUsage,
+ .secretDefineXML = NULL,
+ .secretGetXMLDesc = NULL,
+ .secretSetValue = NULL,
+ .secretGetValue = fakeSecretGetValue,
+ .secretUndefine = NULL,
+};
+
+
+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
index 0000000000..172ae48451
--- /dev/null
+++ b/tests/qemufakedrivers.h
@@ -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);
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index cf147e70d4..32eb42dd19 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -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"
@@ -33,320 +34,6 @@
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);
--
2.52.0
On 3/12/26 3:57 AM, Michal Privoznik via Devel wrote:
> From: Michal Privoznik <mprivozn@redhat.com>
>
> 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>
This is all code movement, so "not your problem", but it did make me
notice the redundant ".secretBlah = NULL," initializers for the fake
secret driver - they don't hurt anything, but are using up precious bits
:-).
> ---
> tests/meson.build | 5 +-
> tests/qemufakedrivers.c | 368 ++++++++++++++++++++++++++++++++++++++++
> tests/qemufakedrivers.h | 19 +++
> tests/qemuxmlconftest.c | 331 +-----------------------------------
> 4 files changed, 396 insertions(+), 327 deletions(-)
> create mode 100644 tests/qemufakedrivers.c
> create mode 100644 tests/qemufakedrivers.h
>
> diff --git a/tests/meson.build b/tests/meson.build
> index 847538d2e4..83aa0104bb 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -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
> index 0000000000..94ad5aeb0b
> --- /dev/null
> +++ b/tests/qemufakedrivers.c
> @@ -0,0 +1,368 @@
> +/*
> + * 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 = {
> + .connectNumOfSecrets = NULL,
> + .connectListSecrets = NULL,
> + .secretLookupByUUID = fakeSecretLookupByUUID,
> + .secretLookupByUsage = fakeSecretLookupByUsage,
> + .secretDefineXML = NULL,
> + .secretGetXMLDesc = NULL,
> + .secretSetValue = NULL,
> + .secretGetValue = fakeSecretGetValue,
> + .secretUndefine = NULL,
> +};
> +
> +
> +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
> index 0000000000..172ae48451
> --- /dev/null
> +++ b/tests/qemufakedrivers.h
> @@ -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);
> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
> index cf147e70d4..32eb42dd19 100644
> --- a/tests/qemuxmlconftest.c
> +++ b/tests/qemuxmlconftest.c
> @@ -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"
> @@ -33,320 +34,6 @@
>
> 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);
© 2016 - 2026 Red Hat, Inc.