From: Michal Privoznik <mprivozn@redhat.com>
If we want vmx2xmltest to use actual file name parser that's used
in production (esxParseVMXFileName()) we need a mock to stop it
from doing any HTTP requests and also to return predictable data.
So far, the function can call three functions that do HTTP
requests: esxVI_LookupDatastoreList(),
esxVI_LookupDatastoreHostMount() and
esxVI_LookupDatastoreByName().
Mock all three of them. And since their implementation uses some
other symbols (like allocators or _AppendToList() helpers) we
need to expose these symbols too.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
src/libvirt_esx.syms | 10 ++++++
tests/meson.build | 3 ++
tests/vmx2xmlmock.c | 79 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 92 insertions(+)
create mode 100644 tests/vmx2xmlmock.c
diff --git a/src/libvirt_esx.syms b/src/libvirt_esx.syms
index d05684fd97..d228e2bef7 100644
--- a/src/libvirt_esx.syms
+++ b/src/libvirt_esx.syms
@@ -18,8 +18,18 @@ esxVI_LookupDatastoreList;
# esx/esx_vi_types.h
+esxVI_AnyType_Alloc;
esxVI_DateTime_ConvertToCalendarTime;
+
+# esx/esx/esx_vi_types.generated.h
+esxVI_DatastoreHostMount_Alloc;
+esxVI_DynamicProperty_Alloc;
+esxVI_DynamicProperty_AppendToList;
+esxVI_HostMountInfo_Alloc;
+esxVI_ObjectContent_Alloc;
+esxVI_ObjectContent_AppendToList;
+
# Let emacs know we want case-insensitive sorting
# Local Variables:
# sort-fold-case: t
diff --git a/tests/meson.build b/tests/meson.build
index 0d76d37959..9adf172b7f 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -553,6 +553,9 @@ if conf.has('WITH_VMX')
{ 'name': 'vmx2xmltest' },
{ 'name': 'xml2vmxtest' },
]
+ mock_libs += [
+ { 'name': 'vmx2xmlmock', 'deps': [ esx_dep ] },
+ ]
endif
if conf.has('WITH_JSON')
diff --git a/tests/vmx2xmlmock.c b/tests/vmx2xmlmock.c
new file mode 100644
index 0000000000..ce4a9a426b
--- /dev/null
+++ b/tests/vmx2xmlmock.c
@@ -0,0 +1,79 @@
+#include <config.h>
+
+#include "internal.h"
+#include "esx_vi.h"
+
+int
+esxVI_LookupDatastoreList(esxVI_Context *ctx G_GNUC_UNUSED,
+ esxVI_String *propertyNameList,
+ esxVI_ObjectContent **datastoreList)
+{
+ esxVI_String *tmp;
+
+ for (tmp = propertyNameList; tmp; tmp = tmp->_next) {
+ esxVI_ObjectContent *obj = NULL;
+
+ if (STREQ(tmp->value, "summary.name")) {
+ esxVI_DynamicProperty *prop = NULL;
+
+ esxVI_ObjectContent_Alloc(&obj);
+
+ esxVI_DynamicProperty_Alloc(&prop);
+ prop->name = g_strdup("summary.name");
+
+ esxVI_AnyType_Alloc(&prop->val);
+ prop->val->type = esxVI_Type_String;
+ prop->val->other = g_strdup("xsd:string");
+ prop->val->value = g_strdup("datastore");
+ prop->val->string = prop->val->value;
+ esxVI_DynamicProperty_AppendToList(&obj->propSet, prop);
+ }
+
+ if (obj) {
+ esxVI_ObjectContent_AppendToList(datastoreList, obj);
+ }
+ }
+
+ return 0;
+}
+
+
+int
+esxVI_LookupDatastoreHostMount(esxVI_Context *ctx G_GNUC_UNUSED,
+ esxVI_ManagedObjectReference *datastore G_GNUC_UNUSED,
+ esxVI_DatastoreHostMount **hostMount,
+ esxVI_Occurrence occurrence G_GNUC_UNUSED)
+{
+ esxVI_DatastoreHostMount *hm = NULL;
+
+ esxVI_DatastoreHostMount_Alloc(&hm);
+ esxVI_HostMountInfo_Alloc(&hm->mountInfo);
+ hm->mountInfo->path = g_strdup("/non/existent");
+ hm->mountInfo->accessMode = g_strdup("readWrite");
+ hm->mountInfo->accessible = esxVI_Boolean_True;
+
+ *hostMount = hm;
+ return 0;
+}
+
+
+int
+esxVI_LookupDatastoreByName(esxVI_Context *ctx G_GNUC_UNUSED,
+ const char *name,
+ esxVI_String *propertyNameList G_GNUC_UNUSED,
+ esxVI_ObjectContent **datastore,
+ esxVI_Occurrence occurrence G_GNUC_UNUSED)
+{
+ esxVI_ObjectContent *obj = NULL;
+
+ if (STREQ(name, "missing") || STREQ(name, "ds")) {
+ *datastore = NULL;
+ return 0;
+ }
+
+ /* No need to return anything useful, empty object is fine. */
+ esxVI_ObjectContent_Alloc(&obj);
+ esxVI_ObjectContent_AppendToList(datastore, obj);
+
+ return 0;
+}
--
2.51.0
On Thu, Nov 20, 2025 at 09:32:51AM +0100, Michal Privoznik via Devel wrote:
>From: Michal Privoznik <mprivozn@redhat.com>
>
>If we want vmx2xmltest to use actual file name parser that's used
>in production (esxParseVMXFileName()) we need a mock to stop it
>from doing any HTTP requests and also to return predictable data.
>
>So far, the function can call three functions that do HTTP
>requests: esxVI_LookupDatastoreList(),
>esxVI_LookupDatastoreHostMount() and
>esxVI_LookupDatastoreByName().
>
>Mock all three of them. And since their implementation uses some
>other symbols (like allocators or _AppendToList() helpers) we
>need to expose these symbols too.
>
>Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
>---
> src/libvirt_esx.syms | 10 ++++++
> tests/meson.build | 3 ++
> tests/vmx2xmlmock.c | 79 ++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 92 insertions(+)
> create mode 100644 tests/vmx2xmlmock.c
>
>diff --git a/tests/vmx2xmlmock.c b/tests/vmx2xmlmock.c
>new file mode 100644
>index 0000000000..ce4a9a426b
>--- /dev/null
>+++ b/tests/vmx2xmlmock.c
>@@ -0,0 +1,79 @@
>+#include <config.h>
>+
>+#include "internal.h"
>+#include "esx_vi.h"
>+
>+int
>+esxVI_LookupDatastoreList(esxVI_Context *ctx G_GNUC_UNUSED,
>+ esxVI_String *propertyNameList,
>+ esxVI_ObjectContent **datastoreList)
>+{
>+ esxVI_String *tmp;
>+
>+ for (tmp = propertyNameList; tmp; tmp = tmp->_next) {
>+ esxVI_ObjectContent *obj = NULL;
>+
>+ if (STREQ(tmp->value, "summary.name")) {
>+ esxVI_DynamicProperty *prop = NULL;
>+
>+ esxVI_ObjectContent_Alloc(&obj);
>+
>+ esxVI_DynamicProperty_Alloc(&prop);
>+ prop->name = g_strdup("summary.name");
>+
>+ esxVI_AnyType_Alloc(&prop->val);
>+ prop->val->type = esxVI_Type_String;
>+ prop->val->other = g_strdup("xsd:string");
>+ prop->val->value = g_strdup("datastore");
>+ prop->val->string = prop->val->value;
>+ esxVI_DynamicProperty_AppendToList(&obj->propSet, prop);
>+ }
>+
>+ if (obj) {
>+ esxVI_ObjectContent_AppendToList(datastoreList, obj);
This line, along with the declaration of @obj can be inside the previous
body under the condition with STREQ, no need to separate it.
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
© 2016 - 2025 Red Hat, Inc.