Signed-off-by: Juan Quintela <quint...@redhat.com> --- tests/test-vmstate.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+)
diff --git a/tests/test-vmstate.c b/tests/test-vmstate.c index 79bdf9d..c284bfc 100644 --- a/tests/test-vmstate.c +++ b/tests/test-vmstate.c @@ -1057,6 +1057,66 @@ static void test_vbuffer_simple(void) SUCCESS(memcmp(obj->buffer2, obj_vbuffer->buffer2, VMSTATE_ARRAY_SIZE)); } +typedef struct TestPointer { + uint8_t *u8_1p; +} TestPointer; + +static const VMStateDescription vmstate_pointer_simple = { + .name = "pointer/simple", + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .fields = (VMStateField[]) { + VMSTATE_POINTER(u8_1p, TestPointer, NULL, vmstate_info_uint8, uint8_t), + VMSTATE_END_OF_LIST() + } +}; + +uint8_t wire_pointer_simple[] = { + /* u8_1p */ 0x11, + QEMU_VM_EOF, /* just to ensure we won't get EOF reported prematurely */ +}; + +static void obj_pointer_copy(void *arg1, void *arg2) +{ + TestPointer *target = arg1; + TestPointer *source = arg2; + + *target->u8_1p = *source->u8_1p; +} + +static TestPointer *create_pointer(void) +{ + TestPointer *obj = g_malloc0(sizeof(*obj)); + obj->u8_1p = g_malloc0(sizeof(*obj->u8_1p)); + + return obj; +} + +static void test_pointer_simple(void) +{ + TestPointer *obj, *obj_clone, *obj_pointer; + + obj_pointer = create_pointer(); + obj = create_pointer(); + obj_clone = create_pointer(); + + *obj_pointer->u8_1p = 17; + *obj->u8_1p = 22; + + save_vmstate(&vmstate_pointer_simple, obj_pointer); + + compare_vmstate(wire_pointer_simple, sizeof(wire_pointer_simple)); + + SUCCESS(load_vmstate(&vmstate_pointer_simple, obj, obj_clone, + obj_pointer_copy, 1, wire_pointer_simple, + sizeof(wire_pointer_simple))); + +#define FIELD_EQUAL(name) g_assert_cmpint(*obj->name, ==, *obj_pointer->name) + FIELD_EQUAL(u8_1p); +} +#undef FIELD_EQUAL + typedef struct TestVersioned { uint32_t a, b, c, e; uint64_t d, f; @@ -1296,6 +1356,7 @@ int main(int argc, char **argv) g_test_add_func("/vmstate/buffer/simple", test_buffer_simple); 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_run(); close(temp_fd); -- 1.9.0