Signed-off-by: Juan Quintela <quint...@redhat.com> --- tests/test-vmstate.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+)
diff --git a/tests/test-vmstate.c b/tests/test-vmstate.c index f7fd3e2..1fa2899 100644 --- a/tests/test-vmstate.c +++ b/tests/test-vmstate.c @@ -1208,6 +1208,131 @@ static void test_pointer_simple(void) } #undef FIELD_EQUAL +typedef struct TestVarray { + uint8_t *u8_1p; + uint8_t *u8_2p; +} TestVArray; + +static const VMStateDescription vmstate_varray_simple = { + .name = "varray/simple", + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .fields = (VMStateField[]) { + VMSTATE_VARRAY(u8_1p, TestVArray, VMSTATE_ARRAY_SIZE, + NULL, vmstate_info_uint8, uint8_t), + VMSTATE_END_OF_LIST() + } +}; + +uint8_t wire_varray_simple[] = { + /* u8_1p */ 0x01, 0x02, 0x03, 0x04, 0x05, + QEMU_VM_EOF, /* just to ensure we won't get EOF reported prematurely */ +}; + +static void obj_varray_copy(void *arg1, void *arg2) +{ + TestVArray *target = arg1; + TestVArray *source = arg2; + int i; + + for (i = 0; i < VMSTATE_ARRAY_SIZE; i++) { + target->u8_1p[i] = source->u8_1p[i]; + target->u8_2p[i] = source->u8_2p[i]; + } +} + +static TestVArray *create_varray(void) +{ + TestVArray *obj = g_malloc0(sizeof(*obj)); + obj->u8_1p = g_malloc0(VMSTATE_ARRAY_SIZE); + obj->u8_2p = g_malloc0(VMSTATE_ARRAY_SIZE); + + return obj; +} + +static TestVArray *create_varray_init(void) +{ + TestVArray *obj = create_varray(); + int i; + + for (i = 0; i < VMSTATE_ARRAY_SIZE; i++) { + obj->u8_1p[i] = i + 1; + obj->u8_2p[i] = i + 11; + } + return obj; +} + +static void test_varray_simple(void) +{ + TestVArray *obj, *obj_clone, *obj_varray; + int i; + + obj_varray = create_varray_init(); + obj = create_varray(); + obj_clone = create_varray(); + + save_vmstate(&vmstate_varray_simple, obj_varray); + + compare_vmstate(wire_varray_simple, sizeof(wire_varray_simple)); + + SUCCESS(load_vmstate(&vmstate_varray_simple, obj, obj_clone, + obj_varray_copy, 1, wire_varray_simple, + sizeof(wire_varray_simple))); +#define ELEM_EQUAL(name, i) \ + g_assert_cmpint(obj->name[i], ==, obj_varray->name[i]) +#define ELEM_NOT_EQUAL(name, i) \ + g_assert_cmpint(obj->name[i], !=, obj_varray->name[i]) + + for (i = 0; i < VMSTATE_ARRAY_SIZE; i++) { + ELEM_EQUAL(u8_1p, i); + ELEM_NOT_EQUAL(u8_2p, i); + } +} +static const VMStateDescription vmstate_varray_test = { + .name = "varray/test", + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .fields = (VMStateField[]) { + VMSTATE_VARRAY(u8_1p, TestVArray, VMSTATE_ARRAY_SIZE, + test_true, vmstate_info_uint8, uint8_t), + VMSTATE_VARRAY(u8_2p, TestVArray, VMSTATE_ARRAY_SIZE, + test_false, vmstate_info_uint8, uint8_t), + VMSTATE_END_OF_LIST() + } +}; + +uint8_t wire_varray_test[] = { + /* u8_1p */ 0x01, 0x02, 0x03, 0x04, 0x05, + QEMU_VM_EOF, /* just to ensure we won't get EOF reported prematurely */ +}; + +static void test_varray_test(void) +{ + TestVArray *obj, *obj_clone, *obj_varray; + int i; + + obj_varray = create_varray_init(); + obj = create_varray(); + obj_clone = create_varray(); + + save_vmstate(&vmstate_varray_test, obj_varray); + + compare_vmstate(wire_varray_test, sizeof(wire_varray_test)); + + SUCCESS(load_vmstate(&vmstate_varray_test, obj, obj_clone, + obj_varray_copy, 1, wire_varray_test, + sizeof(wire_varray_test))); + + for (i = 0; i < VMSTATE_ARRAY_SIZE; i++) { + ELEM_EQUAL(u8_1p, i); + ELEM_NOT_EQUAL(u8_2p, i); + } +} +#undef ELEM_EQUAL +#undef ELEM_NOTEQUAL + typedef struct TestVersioned { uint32_t a, b, c, e; uint64_t d, f; @@ -1448,6 +1573,8 @@ int main(int argc, char **argv) g_test_add_func("/vmstate/buffer/test", test_buffer_test); g_test_add_func("/vmstate/vbuffer/simple", test_vbuffer_simple); g_test_add_func("/vmstate/pointer/simple", test_pointer_simple); + g_test_add_func("/vmstate/varray/simple", test_varray_simple); + g_test_add_func("/vmstate/varray/test", test_varray_test); g_test_run(); close(temp_fd); -- 1.9.0