diff --git a/tests/Makefile.am b/tests/Makefile.am
index cafdae0bb9..0304829ba6 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -74,6 +74,7 @@ EXTRA_DIST = \
storagepoolschematest \
storagepoolxml2xmlin \
storagepoolxml2xmlout \
+ storagevolxml2argvdata \
storagevolschematest \
storagevolxml2xmlin \
storagevolxml2xmlout \
@@ -170,6 +171,8 @@ endif
test_programs += nwfilterxml2xmltest
+test_programs += storagevolxml2argvtest
+
test_programs += storagevolxml2xmltest storagepoolxml2xmltest
test_programs += nodedevxml2xmltest
@@ -470,6 +473,12 @@ nwfilterxml2xmltest_SOURCES = \
testutils.c testutils.h
nwfilterxml2xmltest_LDADD = $(LDADDS)
+storagevolxml2argvtest_SOURCES = \
+ storagevolxml2argvtest.c \
+ testutils.c testutils.h
+storagevolxml2argvtest_LDADD = \
+ ../src/libvirt_driver_storage_impl.la $(LDADDS)
+
storagevolxml2xmltest_SOURCES = \
storagevolxml2xmltest.c \
testutils.c testutils.h
diff --git a/tests/storagevolxml2argvdata/pool-dir.xml b/tests/storagevolxml2argvdata/pool-dir.xml
new file mode 100644
index 0000000000..e10ccb7ca3
--- /dev/null
+++ b/tests/storagevolxml2argvdata/pool-dir.xml
@@ -0,0 +1,18 @@
+
+ virtimages
+ 70a7eb15-6c34-ee9c-bf57-69e8e5ff3fb2
+ 0
+ 0
+ 0
+
+
+
+ ///var/////lib/libvirt/images//
+
+ 0700
+ -1
+ -1
+
+
+
+
diff --git a/tests/storagevolxml2argvdata/qcow2-flag.argv b/tests/storagevolxml2argvdata/qcow2-flag.argv
new file mode 100644
index 0000000000..3ac9010883
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-flag.argv
@@ -0,0 +1 @@
+qemu-img create -f qcow2 -b /dev/null -F raw /var/lib/libvirt/images/OtherDemo.img 5242880K -e
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-convert-flag.argv b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-flag.argv
new file mode 100644
index 0000000000..2d37c50835
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-flag.argv
@@ -0,0 +1 @@
+qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/sparse.img /var/lib/libvirt/images/OtherDemo.img -e
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-convert-none.argv b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-none.argv
new file mode 100644
index 0000000000..2d37c50835
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-none.argv
@@ -0,0 +1 @@
+qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/sparse.img /var/lib/libvirt/images/OtherDemo.img -e
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc.argv b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc.argv
new file mode 100644
index 0000000000..18e8f64b8e
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-convert-prealloc.argv
@@ -0,0 +1 @@
+qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/sparse.img /var/lib/libvirt/images/OtherDemo.img -o encryption=on,preallocation=metadata
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-flag.argv b/tests/storagevolxml2argvdata/qcow2-nobacking-flag.argv
new file mode 100644
index 0000000000..8980cc40f7
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-flag.argv
@@ -0,0 +1 @@
+qemu-img create -f qcow2 /var/lib/libvirt/images/OtherDemo.img 5242880K -e
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-none.argv b/tests/storagevolxml2argvdata/qcow2-nobacking-none.argv
new file mode 100644
index 0000000000..8980cc40f7
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-none.argv
@@ -0,0 +1 @@
+qemu-img create -f qcow2 /var/lib/libvirt/images/OtherDemo.img 5242880K -e
diff --git a/tests/storagevolxml2argvdata/qcow2-nobacking-prealloc.argv b/tests/storagevolxml2argvdata/qcow2-nobacking-prealloc.argv
new file mode 100644
index 0000000000..828f5fcc94
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-nobacking-prealloc.argv
@@ -0,0 +1 @@
+qemu-img create -f qcow2 /var/lib/libvirt/images/OtherDemo.img 5242880K -o encryption=on,preallocation=metadata
diff --git a/tests/storagevolxml2argvdata/qcow2-none.argv b/tests/storagevolxml2argvdata/qcow2-none.argv
new file mode 100644
index 0000000000..f2dfd159ab
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-none.argv
@@ -0,0 +1 @@
+qemu-img create -f qcow2 -b /dev/null /var/lib/libvirt/images/OtherDemo.img 5242880K -e
diff --git a/tests/storagevolxml2argvdata/qcow2.argv b/tests/storagevolxml2argvdata/qcow2.argv
new file mode 100644
index 0000000000..d6f4cb68ac
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2.argv
@@ -0,0 +1 @@
+qemu-img create -f qcow2 -b /dev/null -o backing_fmt=raw,encryption=on /var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvdata/vol-file.xml b/tests/storagevolxml2argvdata/vol-file.xml
new file mode 100644
index 0000000000..d3f65f654b
--- /dev/null
+++ b/tests/storagevolxml2argvdata/vol-file.xml
@@ -0,0 +1,20 @@
+
+ sparse.img
+
+ 1
+ 0
+
+ /var/lib/libvirt/images/sparse.img
+
+ 0
+ 0744
+ 0
+
+
+
+ 1341933637.273190990
+ 1341930622.047245868
+ 1341930622.047245868
+
+
+
diff --git a/tests/storagevolxml2argvdata/vol-qcow2-nobacking.xml b/tests/storagevolxml2argvdata/vol-qcow2-nobacking.xml
new file mode 100644
index 0000000000..6a6bd5bef3
--- /dev/null
+++ b/tests/storagevolxml2argvdata/vol-qcow2-nobacking.xml
@@ -0,0 +1,21 @@
+
+ OtherDemo.img
+ /var/lib/libvirt/images/OtherDemo.img
+
+
+ 5
+ 294912
+
+ /var/lib/libvirt/images/OtherDemo.img
+
+
+ 0644
+ 0
+ 0
+
+
+
+
+
+
+
diff --git a/tests/storagevolxml2argvdata/vol-qcow2.xml b/tests/storagevolxml2argvdata/vol-qcow2.xml
new file mode 100644
index 0000000000..49a7de33d3
--- /dev/null
+++ b/tests/storagevolxml2argvdata/vol-qcow2.xml
@@ -0,0 +1,31 @@
+
+ OtherDemo.img
+ /var/lib/libvirt/images/OtherDemo.img
+
+
+ 5
+ 294912
+
+ /var/lib/libvirt/images/OtherDemo.img
+
+
+ 0644
+ 0
+ 0
+
+
+
+
+
+
+
+ /dev/null
+
+
+ 0644
+ 0
+ 0
+
+
+
+
diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c
new file mode 100644
index 0000000000..416bb6f487
--- /dev/null
+++ b/tests/storagevolxml2argvtest.c
@@ -0,0 +1,189 @@
+#include
+
+#include "internal.h"
+#include "testutils.h"
+#include "datatypes.h"
+#include "storage/storage_backend.h"
+#include "testutilsqemu.h"
+
+const char create_tool[] = "qemu-img";
+
+static int
+testCompareXMLToArgvFiles(bool shouldFail,
+ const char *poolxml,
+ const char *volxml,
+ const char *inputvolxml,
+ const char *cmdline,
+ unsigned int flags,
+ int imgformat)
+{
+ char *volXmlData = NULL;
+ char *poolXmlData = NULL;
+ char *inputvolXmlData = NULL;
+ char *expectedCmdline = NULL;
+ char *actualCmdline = NULL;
+ int ret = -1;
+
+ int len;
+
+ virCommandPtr cmd = NULL;
+ virConnectPtr conn;
+
+ virStorageVolDefPtr vol = NULL, inputvol = NULL;
+ virStoragePoolDefPtr pool = NULL;
+ virStoragePoolObj poolobj = {.def = NULL };
+
+
+ if (!(conn = virGetConnect()))
+ goto cleanup;
+
+ if (virtTestLoadFile(poolxml, &poolXmlData) < 0)
+ goto cleanup;
+ if (virtTestLoadFile(volxml, &volXmlData) < 0)
+ goto cleanup;
+ if (inputvolxml &&
+ virtTestLoadFile(inputvolxml, &inputvolXmlData) < 0)
+ goto cleanup;
+
+ if (!(pool = virStoragePoolDefParseString(poolXmlData)))
+ goto cleanup;
+
+ poolobj.def = pool;
+
+ if (!(vol = virStorageVolDefParseString(pool, volXmlData)))
+ goto cleanup;
+
+ if (inputvolxml &&
+ !(inputvol = virStorageVolDefParseString(pool, inputvolXmlData)))
+ goto cleanup;
+
+ cmd = virStorageBackendCreateQemuImgCmd(conn, &poolobj, vol, inputvol,
+ flags, create_tool, imgformat);
+
+ actualCmdline = virCommandToString(cmd);
+ if (!actualCmdline) {
+ if (shouldFail) {
+ virResetLastError();
+ ret = 0;
+ }
+ goto cleanup;
+ }
+
+ len = virtTestLoadFile(cmdline, &expectedCmdline);
+ if (len < 0)
+ goto cleanup;
+ if (len && expectedCmdline[len-1] == '\n')
+ expectedCmdline[len-1] = '\0';
+
+ if (STRNEQ_NULLABLE(expectedCmdline, actualCmdline)) {
+ virtTestDifference(stderr, expectedCmdline, actualCmdline);
+ goto cleanup;
+ }
+
+ ret = 0;
+
+cleanup:
+ virStoragePoolDefFree(pool);
+ virStorageVolDefFree(vol);
+ virStorageVolDefFree(inputvol);
+ virCommandFree(cmd);
+ VIR_FREE(actualCmdline);
+ VIR_FREE(expectedCmdline);
+ return ret;
+}
+
+struct testInfo {
+ bool shouldFail;
+ const char *pool;
+ const char *vol;
+ const char *inputvol;
+ const char *cmdline;
+ unsigned int flags;
+ int imgformat;
+};
+
+static int
+testCompareXMLToArgvHelper(const void *data)
+{
+ int result = -1;
+ const struct testInfo *info = data;
+ char *poolxml = NULL;
+ char *volxml = NULL;
+ char *inputvolxml = NULL;
+ char *cmdline = NULL;
+
+ if (info->inputvol &&
+ virAsprintf(&inputvolxml, "%s/storagevolxml2argvdata/%s.xml",
+ abs_srcdir, info->inputvol) < 0)
+ goto cleanup;
+ if (virAsprintf(&poolxml, "%s/storagevolxml2argvdata/%s.xml",
+ abs_srcdir, info->pool) < 0 ||
+ virAsprintf(&volxml, "%s/storagevolxml2argvdata/%s.xml",
+ abs_srcdir, info->vol) < 0) {
+ goto cleanup;
+ }
+ if (virAsprintf(&cmdline, "%s/storagevolxml2argvdata/%s.argv",
+ abs_srcdir, info->cmdline) < 0 && !info->shouldFail)
+ goto cleanup;
+
+ result = testCompareXMLToArgvFiles(info->shouldFail, poolxml, volxml,
+ inputvolxml, cmdline, info->flags,
+ info->imgformat);
+
+cleanup:
+ VIR_FREE(poolxml);
+ VIR_FREE(volxml);
+ VIR_FREE(inputvolxml);
+ VIR_FREE(cmdline);
+
+ return result;
+}
+
+enum {
+ FMT_NONE = 0,
+ FMT_FLAG,
+ FMT_OPTIONS,
+};
+
+
+
+static int
+mymain(void)
+{
+ int ret = 0;
+ unsigned int flags = VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA;
+
+#define DO_TEST(shouldFail, pool, vol, inputvol, cmdline, flags, imgformat) \
+ do { \
+ struct testInfo info = { shouldFail, pool, vol, inputvol, cmdline, \
+ flags, imgformat }; \
+ if (virtTestRun("Storage Vol XML-2-argv " cmdline, \
+ 1, testCompareXMLToArgvHelper, &info) < 0) \
+ ret = -1; \
+ } \
+ while (0);
+
+ DO_TEST(false, "pool-dir", "vol-qcow2", NULL, "qcow2", 0, FMT_OPTIONS);
+ DO_TEST(true, "pool-dir", "vol-qcow2", NULL, "qcow2-prealloc", flags,
+ FMT_OPTIONS);
+ DO_TEST(false, "pool-dir", "vol-qcow2-nobacking", NULL,
+ "qcow2-nobacking-prealloc", flags, FMT_OPTIONS);
+ DO_TEST(false, "pool-dir", "vol-qcow2-nobacking", "vol-file",
+ "qcow2-nobacking-convert-prealloc", flags, FMT_OPTIONS);
+ DO_TEST(true, "pool-dir", "vol-qcow2", "vol-file",
+ "qcow2-convert-prealloc", flags, FMT_OPTIONS);
+ DO_TEST(false, "pool-dir", "vol-qcow2", NULL, "qcow2-flag", 0, FMT_FLAG);
+ DO_TEST(false, "pool-dir", "vol-qcow2-nobacking", NULL,
+ "qcow2-nobacking-flag", 0, FMT_FLAG);
+ DO_TEST(false, "pool-dir", "vol-qcow2-nobacking", "vol-file",
+ "qcow2-nobacking-convert-flag", 0, FMT_FLAG);
+ DO_TEST(false, "pool-dir", "vol-qcow2", NULL, "qcow2-none", 0, FMT_NONE);
+ DO_TEST(false, "pool-dir", "vol-qcow2-nobacking", NULL,
+ "qcow2-nobacking-none", 0, FMT_NONE);
+ DO_TEST(false, "pool-dir", "vol-qcow2-nobacking", "vol-file",
+ "qcow2-nobacking-convert-none", 0, FMT_NONE);
+
+ return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+VIRT_TEST_MAIN(mymain)