diff mbox

[036/124] vmstate: Test for VMSTATE_ARRAY_BOOL_TEST

Message ID 1398091304-10677-37-git-send-email-quintela@redhat.com
State New
Headers show

Commit Message

Juan Quintela April 21, 2014, 2:40 p.m. UTC
We add all the boilerplate code for testing arrays.
We change only user of VMSTATE_ARRAY_BOOL_V to VMSTATE_ARRAY_BOOL_TEST.

Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 hw/audio/hda-codec.c        |   3 +-
 include/migration/vmstate.h |   8 +--
 tests/test-vmstate.c        | 117 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 123 insertions(+), 5 deletions(-)
diff mbox

Patch

diff --git a/hw/audio/hda-codec.c b/hw/audio/hda-codec.c
index 09559ef..1c1a138 100644
--- a/hw/audio/hda-codec.c
+++ b/hw/audio/hda-codec.c
@@ -603,7 +603,8 @@  static const VMStateDescription vmstate_hda_audio = {
                              vmstate_hda_audio_stream,
                              HDAAudioStream),
         VMSTATE_BOOL_ARRAY(running_compat, HDAAudioState, 16),
-        VMSTATE_BOOL_ARRAY_V(running_real, HDAAudioState, 2 * 16, 2),
+        VMSTATE_BOOL_ARRAY_TEST(running_real, HDAAudioState, 2 * 16,
+                                vmstate_2_plus),
         VMSTATE_END_OF_LIST()
     }
 };
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index e86d9bd..490f0f4 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -600,11 +600,11 @@  extern const VMStateInfo vmstate_info_bitmap;
 #define VMSTATE_TIMER_ARRAY(_f, _s, _n)                               \
     VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_timer, QEMUTimer *)

-#define VMSTATE_BOOL_ARRAY_V(_f, _s, _n, _v)                         \
-    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_bool, bool)
+#define VMSTATE_BOOL_ARRAY_TEST(_f, _s, _n, _t)                       \
+    VMSTATE_ARRAY_TEST(_f, _s, _n, _t, vmstate_info_bool, bool)

-#define VMSTATE_BOOL_ARRAY(_f, _s, _n)                               \
-    VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
+#define VMSTATE_BOOL_ARRAY(_f, _s, _n)                                \
+    VMSTATE_BOOL_ARRAY_TEST(_f, _s, _n, NULL)

 #define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v)                         \
     VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
diff --git a/tests/test-vmstate.c b/tests/test-vmstate.c
index 3b93ab9..5cc5706 100644
--- a/tests/test-vmstate.c
+++ b/tests/test-vmstate.c
@@ -506,6 +506,121 @@  static void test_simple_bitmap(void)
 #undef FIELD_EQUAL
 }

+#define VMSTATE_ARRAY_SIZE 5
+
+typedef struct TestArray {
+    int32_t  size;
+    bool     b_1[VMSTATE_ARRAY_SIZE];
+    bool     b_2[VMSTATE_ARRAY_SIZE];
+} TestArray;
+
+TestArray obj_array = {
+    .size = VMSTATE_ARRAY_SIZE,
+    .b_1 = { false, true, false, true, false},
+    .b_2 = { true, false, true, false, true},
+};
+
+static const VMStateDescription vmstate_array_primitive = {
+    .name = "array/primitive",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_INT32_EQUAL(size, TestArray),
+        VMSTATE_BOOL_ARRAY(b_1, TestArray, VMSTATE_ARRAY_SIZE),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+uint8_t wire_array_primitive[] = {
+    /* size */  0x00, 0x00, 0x00, 0x05,
+    /* b_1 */   0x00, 0x01, 0x00, 0x01, 0x00,
+    QEMU_VM_EOF, /* just to ensure we won't get EOF reported prematurely */
+};
+
+static void obj_array_copy(void *arg1, void *arg2)
+{
+    TestArray *target = arg1;
+    TestArray *source = arg2;
+    int i;
+
+    target->size = source->size;
+
+    for (i = 0; i < VMSTATE_ARRAY_SIZE; i++) {
+        target->b_1[i] = source->b_1[i];
+        target->b_2[i] = source->b_2[i];
+    }
+}
+
+static void test_array_primitive(void)
+{
+    TestArray obj, obj_clone;
+    int i;
+
+    memset(&obj, 0, sizeof(obj));
+    obj.size = VMSTATE_ARRAY_SIZE;
+
+    save_vmstate(&vmstate_array_primitive, &obj_array);
+
+    compare_vmstate(wire_array_primitive, sizeof(wire_array_primitive));
+
+    SUCCESS(load_vmstate(&vmstate_array_primitive, &obj, &obj_clone,
+                         obj_array_copy, 1, wire_array_primitive,
+                         sizeof(wire_array_primitive)));
+
+#define FIELD_EQUAL(name)   g_assert_cmpint(obj.name, ==, obj_array.name)
+#define ELEM_EQUAL(name, i) \
+    g_assert_cmpint(obj.name[i], ==, obj_array.name[i])
+
+    FIELD_EQUAL(size);
+    for (i = 0; i < VMSTATE_ARRAY_SIZE; i++) {
+        ELEM_EQUAL(b_1, i);
+    }
+}
+
+static const VMStateDescription vmstate_array_test = {
+    .name = "array/test",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_INT32_EQUAL(size, TestArray),
+        VMSTATE_BOOL_ARRAY_TEST(b_1, TestArray, VMSTATE_ARRAY_SIZE, test_true),
+        VMSTATE_BOOL_ARRAY_TEST(b_2, TestArray, VMSTATE_ARRAY_SIZE, test_false),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+uint8_t wire_array_test[] = {
+    /* size */  0x00, 0x00, 0x00, 0x05,
+    /* b_1 */   0x00, 0x01, 0x00, 0x01, 0x00,
+    QEMU_VM_EOF, /* just to ensure we won't get EOF reported prematurely */
+};
+
+static void test_array_test(void)
+{
+    TestArray obj, obj_clone;
+    int i;
+
+    memset(&obj, 0, sizeof(obj));
+    obj.size = VMSTATE_ARRAY_SIZE;
+
+    save_vmstate(&vmstate_array_test, &obj_array);
+
+    compare_vmstate(wire_array_test, sizeof(wire_array_test));
+
+    SUCCESS(load_vmstate(&vmstate_array_test, &obj, &obj_clone,
+                         obj_array_copy, 1, wire_array_test,
+                         sizeof(wire_array_test)));
+
+    FIELD_EQUAL(size);
+    for (i = 0; i < VMSTATE_ARRAY_SIZE; i++) {
+        ELEM_EQUAL(b_1, i);
+    }
+}
+#undef FIELD_EQUAL
+#undef ELEM_EQUAL
+
 typedef struct TestVersioned {
     uint32_t a, b, c, e;
     uint64_t d, f;
@@ -739,6 +854,8 @@  int main(int argc, char **argv)
     g_test_add_func("/vmstate/simple/test", test_simple_test);
     g_test_add_func("/vmstate/simple/compare", test_simple_compare);
     g_test_add_func("/vmstate/simple/bitmap", test_simple_bitmap);
+    g_test_add_func("/vmstate/array/primitive", test_array_primitive);
+    g_test_add_func("/vmstate/array/test", test_array_test);
     g_test_run();

     close(temp_fd);