diff --git a/tests/Makefile.am b/tests/Makefile.am
index a6f189b8ba..aa9d2eb3a3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -160,7 +160,9 @@ EXTRA_DIST = \
xlconfigdata \
xmconfigdata \
xml2sexprdata \
- xml2vmxdata
+ xml2vmxdata \
+ virstorageutildata \
+ $(NULL)
test_helpers = commandhelper ssh
test_programs = virshtest sockettest \
@@ -353,6 +355,7 @@ endif WITH_NWFILTER
if WITH_STORAGE
test_programs += storagevolxml2argvtest
+test_programs += virstorageutiltest
endif WITH_STORAGE
if WITH_STORAGE_FS
@@ -859,6 +862,16 @@ genericxml2xmltest_LDADD = $(LDADDS)
if WITH_STORAGE
+virstorageutiltest_SOURCES = \
+ virstorageutiltest.c \
+ testutils.c \
+ testutils.h \
+ $(NULL)
+virstorageutiltest_LDADD = \
+ ../src/libvirt_driver_storage_impl.la \
+ $(LDADDS) \
+ $(NULL)
+
storagevolxml2argvtest_SOURCES = \
storagevolxml2argvtest.c \
testutils.c testutils.h
@@ -868,6 +881,7 @@ storagevolxml2argvtest_LDADD = \
else ! WITH_STORAGE
EXTRA_DIST += storagevolxml2argvtest.c
+EXTRA_DIST += virstorageutiltest.c
endif ! WITH_STORAGE
storagevolxml2xmltest_SOURCES = \
diff --git a/tests/virstorageutildata/gluster-parse-basic-native.xml b/tests/virstorageutildata/gluster-parse-basic-native.xml
new file mode 100644
index 0000000000..fbde06f3b3
--- /dev/null
+++ b/tests/virstorageutildata/gluster-parse-basic-native.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/tests/virstorageutildata/gluster-parse-basic-netfs.xml b/tests/virstorageutildata/gluster-parse-basic-netfs.xml
new file mode 100644
index 0000000000..8aadd50a14
--- /dev/null
+++ b/tests/virstorageutildata/gluster-parse-basic-netfs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/tests/virstorageutildata/gluster-parse-basic-src.xml b/tests/virstorageutildata/gluster-parse-basic-src.xml
new file mode 100644
index 0000000000..08f97cb721
--- /dev/null
+++ b/tests/virstorageutildata/gluster-parse-basic-src.xml
@@ -0,0 +1,47 @@
+
+
+ 0
+ 0
+
+
+
+
+ vol0
+ ac14dfa5-0b98-4593-a2aa-9fe2bb9b9ce3
+ 1
+ Started
+ 0
+ 2
+ 2
+ 1
+ 2
+ 0
+ 0
+ 0
+ 2
+ Replicate
+ 0
+
+ virt-gluster-node1:/bricks/brick1/brickvirt-gluster-node1:/bricks/brick1/bricka6f5ddea-bc6a-44db-ae1d-5aa1db7434900
+ virt-gluster-node2:/bricks/brick1/brickvirt-gluster-node2:/bricks/brick1/brickf4ab9fb1-44ec-443b-8783-e5f70ed78da30
+
+ 3
+
+
+
+
+
+
+ 1
+
+
+
diff --git a/tests/virstorageutiltest.c b/tests/virstorageutiltest.c
new file mode 100644
index 0000000000..e846ad5474
--- /dev/null
+++ b/tests/virstorageutiltest.c
@@ -0,0 +1,112 @@
+/*
+ * 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
+ * .
+ */
+
+#include
+
+#include
+
+#include "testutils.h"
+#include "virerror.h"
+#include "virfile.h"
+#include "virlog.h"
+#include "virstring.h"
+
+#include "storage/storage_util.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+VIR_LOG_INIT("tests.storageutiltest");
+
+
+struct testGlusterExtractPoolSourcesData {
+ const char *srcxml;
+ const char *dstxml;
+ virStoragePoolType type;
+};
+
+static int
+testGlusterExtractPoolSources(const void *opaque)
+{
+ const struct testGlusterExtractPoolSourcesData *data = opaque;
+ virStoragePoolSourceList list = { .type = data->type,
+ .nsources = 0,
+ .sources = NULL
+ };
+ size_t i;
+ char *srcxmldata = NULL;
+ char *actual = NULL;
+ int ret = -1;
+
+ if (virTestLoadFile(data->srcxml, &srcxmldata) < 0)
+ goto cleanup;
+
+ if (virStorageUtilGlusterExtractPoolSources("testhost", srcxmldata,
+ &list, data->type) < 0)
+ goto cleanup;
+
+ if (!(actual = virStoragePoolSourceListFormat(&list)))
+ goto cleanup;
+
+ ret = virTestCompareToFile(actual, data->dstxml);
+
+ cleanup:
+ VIR_FREE(srcxmldata);
+ VIR_FREE(actual);
+
+ for (i = 0; i < list.nsources; i++)
+ virStoragePoolSourceClear(&list.sources[i]);
+ VIR_FREE(list.sources);
+
+ return ret;
+}
+
+
+static int
+mymain(void)
+{
+ int ret = 0;
+
+#define DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_FULL(testname, sffx, pooltype) \
+ do { \
+ struct testGlusterExtractPoolSourcesData data; \
+ data.srcxml = abs_srcdir "/virstorageutildata/" \
+ "gluster-parse-" testname "-src.xml"; \
+ data.dstxml = abs_srcdir "/virstorageutildata/" \
+ "gluster-parse-" testname "-" sffx ".xml"; \
+ data.type = pooltype; \
+ if (virTestRun("gluster-parse-" testname "-" sffx, \
+ testGlusterExtractPoolSources, &data) < 0) \
+ ret = -1; \
+ } while (0)
+
+#define DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_NATIVE(testname) \
+ DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_FULL(testname, "native", \
+ VIR_STORAGE_POOL_GLUSTER)
+#define DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_NETFS(testname) \
+ DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_FULL(testname, "netfs", \
+ VIR_STORAGE_POOL_NETFS)
+
+ DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_NATIVE("basic");
+ DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_NETFS("basic");
+
+#undef DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_NATIVE
+#undef DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_NETFS
+#undef DO_TEST_GLUSTER_EXTRACT_POOL_SOURCES_FULL
+
+ return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+VIRT_TEST_MAIN(mymain)