render / rpms / libvirt

Forked from rpms/libvirt 10 months ago
Clone
a41c76
From c71d50132b3ac8dcfefc1acc11ab5d5bd7bc024a Mon Sep 17 00:00:00 2001
a41c76
Message-Id: <c71d50132b3ac8dcfefc1acc11ab5d5bd7bc024a@dist-git>
a41c76
From: Peter Krempa <pkrempa@redhat.com>
a41c76
Date: Tue, 4 Feb 2020 15:08:09 +0100
a41c76
Subject: [PATCH] tests: qemublock: Add test for checkpoint deletion bitmap
a41c76
 merge
a41c76
MIME-Version: 1.0
a41c76
Content-Type: text/plain; charset=UTF-8
a41c76
Content-Transfer-Encoding: 8bit
a41c76
a41c76
Add test infrastructure and a basic test for bitmap deletion.
a41c76
a41c76
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
a41c76
Reviewed-by: Ján Tomko <jtomko@redhat.com>
a41c76
(cherry picked from commit 25f74899720afce52dcf01f230da5c816deaea71)
a41c76
a41c76
https://bugzilla.redhat.com/show_bug.cgi?id=1207659
a41c76
Message-Id: <50b8789a34b762114b6ea2f87bba1a130be206de.1580824112.git.pkrempa@redhat.com>
a41c76
Reviewed-by: Ján Tomko <jtomko@redhat.com>
a41c76
---
a41c76
 tests/qemublocktest.c                         | 59 +++++++++++++++++++
a41c76
 .../checkpointdelete/basic-noparent-out.json  |  9 +++
a41c76
 2 files changed, 68 insertions(+)
a41c76
 create mode 100644 tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json
a41c76
a41c76
diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c
a41c76
index 7ff6a6b17b..80355d1340 100644
a41c76
--- a/tests/qemublocktest.c
a41c76
+++ b/tests/qemublocktest.c
a41c76
@@ -27,6 +27,7 @@
a41c76
 #include "qemu/qemu_qapi.h"
a41c76
 #include "qemu/qemu_monitor_json.h"
a41c76
 #include "qemu/qemu_backup.h"
a41c76
+#include "qemu/qemu_checkpoint.h"
a41c76
 
a41c76
 #include "qemu/qemu_command.h"
a41c76
 
a41c76
@@ -696,6 +697,50 @@ testQemuBackupIncrementalBitmapCalculate(const void *opaque)
a41c76
 }
a41c76
 
a41c76
 
a41c76
+static const char *checkpointDeletePrefix = "qemublocktestdata/checkpointdelete/";
a41c76
+
a41c76
+struct testQemuCheckpointDeleteMergeData {
a41c76
+    const char *name;
a41c76
+    virStorageSourcePtr chain;
a41c76
+    const char *deletebitmap;
a41c76
+    const char *parentbitmap;
a41c76
+};
a41c76
+
a41c76
+
a41c76
+static int
a41c76
+testQemuCheckpointDeleteMerge(const void *opaque)
a41c76
+{
a41c76
+    const struct testQemuCheckpointDeleteMergeData *data = opaque;
a41c76
+    g_autofree char *actual = NULL;
a41c76
+    g_autofree char *expectpath = NULL;
a41c76
+    g_autoptr(virJSONValue) actions = NULL;
a41c76
+    bool currentcheckpoint;
a41c76
+
a41c76
+    expectpath = g_strdup_printf("%s/%s%s-out.json", abs_srcdir,
a41c76
+                                 checkpointDeletePrefix, data->name);
a41c76
+
a41c76
+    if (!(actions = virJSONValueNewArray()))
a41c76
+        return -1;
a41c76
+
a41c76
+    /* hack to get the 'current' state until the function stops accepting it */
a41c76
+    currentcheckpoint = STREQ("current", data->deletebitmap);
a41c76
+
a41c76
+    if (qemuCheckpointDiscardDiskBitmaps(data->chain,
a41c76
+                                         data->deletebitmap,
a41c76
+                                         data->parentbitmap,
a41c76
+                                         currentcheckpoint,
a41c76
+                                         actions) < 0) {
a41c76
+        VIR_TEST_VERBOSE("failed to generate checkpoint delete transaction\n");
a41c76
+        return -1;
a41c76
+    }
a41c76
+
a41c76
+    if (!(actual = virJSONValueToString(actions, true)))
a41c76
+        return -1;
a41c76
+
a41c76
+    return virTestCompareToFile(actual, expectpath);
a41c76
+}
a41c76
+
a41c76
+
a41c76
 static int
a41c76
 mymain(void)
a41c76
 {
a41c76
@@ -705,6 +750,7 @@ mymain(void)
a41c76
     struct testQemuDiskXMLToJSONData diskxmljsondata;
a41c76
     struct testQemuImageCreateData imagecreatedata;
a41c76
     struct testQemuBackupIncrementalBitmapCalculateData backupbitmapcalcdata;
a41c76
+    struct testQemuCheckpointDeleteMergeData checkpointdeletedata;
a41c76
     char *capslatest_x86_64 = NULL;
a41c76
     virQEMUCapsPtr caps_x86_64 = NULL;
a41c76
     g_autoptr(virStorageSource) bitmapSourceChain = NULL;
a41c76
@@ -941,6 +987,19 @@ mymain(void)
a41c76
     TEST_BACKUP_BITMAP_CALCULATE("snapshot-intermediate", bitmapSourceChain, "d", "snapshots");
a41c76
     TEST_BACKUP_BITMAP_CALCULATE("snapshot-deep", bitmapSourceChain, "a", "snapshots");
a41c76
 
a41c76
+#define TEST_CHECKPOINT_DELETE_MERGE(testname, delbmp, parbmp) \
a41c76
+    do { \
a41c76
+        checkpointdeletedata.name = testname; \
a41c76
+        checkpointdeletedata.chain = bitmapSourceChain; \
a41c76
+        checkpointdeletedata.deletebitmap = delbmp; \
a41c76
+        checkpointdeletedata.parentbitmap = parbmp; \
a41c76
+        if (virTestRun("checkpoint delete " testname, \
a41c76
+                       testQemuCheckpointDeleteMerge, &checkpointdeletedata) < 0) \
a41c76
+        ret = -1; \
a41c76
+    } while (0)
a41c76
+
a41c76
+    TEST_CHECKPOINT_DELETE_MERGE("basic-noparent", "a", NULL);
a41c76
+
a41c76
  cleanup:
a41c76
     virHashFree(diskxmljsondata.schema);
a41c76
     qemuTestDriverFree(&driver);
a41c76
diff --git a/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json b/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json
a41c76
new file mode 100644
a41c76
index 0000000000..e87382fdb4
a41c76
--- /dev/null
a41c76
+++ b/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json
a41c76
@@ -0,0 +1,9 @@
a41c76
+[
a41c76
+  {
a41c76
+    "type": "block-dirty-bitmap-remove",
a41c76
+    "data": {
a41c76
+      "node": "libvirt-1-format",
a41c76
+      "name": "a"
a41c76
+    }
a41c76
+  }
a41c76
+]
a41c76
-- 
a41c76
2.25.0
a41c76