mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
Tests: QEMUSizedBuffer/QEMUBuffer
Modify some of tests/test-vmstate.c to use the in memory file based on QEMUSizedBuffer to provide basic testing of QEMUSizedBuffer and the associated memory backed QEMUFile type. Only some of the tests are changed so that the fd backed QEMUFile is still tested. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
deb22f9a44
commit
9935baca9b
|
@ -259,7 +259,7 @@ tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
|
|||
libqemuutil.a libqemustub.a
|
||||
tests/test-vmstate$(EXESUF): tests/test-vmstate.o \
|
||||
vmstate.o qemu-file.o \
|
||||
libqemuutil.a
|
||||
libqemuutil.a libqemustub.a
|
||||
|
||||
tests/test-qapi-types.c tests/test-qapi-types.h :\
|
||||
$(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
|
||||
|
|
|
@ -43,6 +43,12 @@ void yield_until_fd_readable(int fd)
|
|||
select(fd + 1, &fds, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Some tests use 'open_test_file' to work on a real fd, some use
|
||||
* an in memory file (QEMUSizedBuffer+qemu_bufopen); we could pick one
|
||||
* but this way we test both.
|
||||
*/
|
||||
|
||||
/* Duplicate temp_fd and seek to the beginning of the file */
|
||||
static QEMUFile *open_test_file(bool write)
|
||||
{
|
||||
|
@ -54,6 +60,30 @@ static QEMUFile *open_test_file(bool write)
|
|||
return qemu_fdopen(fd, write ? "wb" : "rb");
|
||||
}
|
||||
|
||||
/* Open a read-only qemu-file from an existing memory block */
|
||||
static QEMUFile *open_mem_file_read(const void *data, size_t len)
|
||||
{
|
||||
/* The qsb gets freed by qemu_fclose */
|
||||
QEMUSizedBuffer *qsb = qsb_create(data, len);
|
||||
g_assert(qsb);
|
||||
|
||||
return qemu_bufopen("r", qsb);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that the contents of the memory-buffered file f match
|
||||
* the given size/data.
|
||||
*/
|
||||
static void check_mem_file(QEMUFile *f, void *data, size_t size)
|
||||
{
|
||||
uint8_t *result = g_malloc(size);
|
||||
const QEMUSizedBuffer *qsb = qemu_buf_get(f);
|
||||
g_assert_cmpint(qsb_get_length(qsb), ==, size);
|
||||
g_assert_cmpint(qsb_get_buffer(qsb, 0, size, result), ==, size);
|
||||
g_assert_cmpint(memcmp(result, data, size), ==, 0);
|
||||
g_free(result);
|
||||
}
|
||||
|
||||
#define SUCCESS(val) \
|
||||
g_assert_cmpint((val), ==, 0)
|
||||
|
||||
|
@ -371,14 +401,12 @@ static const VMStateDescription vmstate_skipping = {
|
|||
|
||||
static void test_save_noskip(void)
|
||||
{
|
||||
QEMUFile *fsave = open_test_file(true);
|
||||
QEMUFile *fsave = qemu_bufopen("w", NULL);
|
||||
TestStruct obj = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5, .f = 6,
|
||||
.skip_c_e = false };
|
||||
vmstate_save_state(fsave, &vmstate_skipping, &obj);
|
||||
g_assert(!qemu_file_get_error(fsave));
|
||||
qemu_fclose(fsave);
|
||||
|
||||
QEMUFile *loading = open_test_file(false);
|
||||
uint8_t expected[] = {
|
||||
0, 0, 0, 1, /* a */
|
||||
0, 0, 0, 2, /* b */
|
||||
|
@ -387,52 +415,31 @@ static void test_save_noskip(void)
|
|||
0, 0, 0, 5, /* e */
|
||||
0, 0, 0, 0, 0, 0, 0, 6, /* f */
|
||||
};
|
||||
uint8_t result[sizeof(expected)];
|
||||
g_assert_cmpint(qemu_get_buffer(loading, result, sizeof(result)), ==,
|
||||
sizeof(result));
|
||||
g_assert(!qemu_file_get_error(loading));
|
||||
g_assert_cmpint(memcmp(result, expected, sizeof(result)), ==, 0);
|
||||
|
||||
/* Must reach EOF */
|
||||
qemu_get_byte(loading);
|
||||
g_assert_cmpint(qemu_file_get_error(loading), ==, -EIO);
|
||||
|
||||
qemu_fclose(loading);
|
||||
check_mem_file(fsave, expected, sizeof(expected));
|
||||
qemu_fclose(fsave);
|
||||
}
|
||||
|
||||
static void test_save_skip(void)
|
||||
{
|
||||
QEMUFile *fsave = open_test_file(true);
|
||||
QEMUFile *fsave = qemu_bufopen("w", NULL);
|
||||
TestStruct obj = { .a = 1, .b = 2, .c = 3, .d = 4, .e = 5, .f = 6,
|
||||
.skip_c_e = true };
|
||||
vmstate_save_state(fsave, &vmstate_skipping, &obj);
|
||||
g_assert(!qemu_file_get_error(fsave));
|
||||
qemu_fclose(fsave);
|
||||
|
||||
QEMUFile *loading = open_test_file(false);
|
||||
uint8_t expected[] = {
|
||||
0, 0, 0, 1, /* a */
|
||||
0, 0, 0, 2, /* b */
|
||||
0, 0, 0, 0, 0, 0, 0, 4, /* d */
|
||||
0, 0, 0, 0, 0, 0, 0, 6, /* f */
|
||||
};
|
||||
uint8_t result[sizeof(expected)];
|
||||
g_assert_cmpint(qemu_get_buffer(loading, result, sizeof(result)), ==,
|
||||
sizeof(result));
|
||||
g_assert(!qemu_file_get_error(loading));
|
||||
g_assert_cmpint(memcmp(result, expected, sizeof(result)), ==, 0);
|
||||
check_mem_file(fsave, expected, sizeof(expected));
|
||||
|
||||
|
||||
/* Must reach EOF */
|
||||
qemu_get_byte(loading);
|
||||
g_assert_cmpint(qemu_file_get_error(loading), ==, -EIO);
|
||||
|
||||
qemu_fclose(loading);
|
||||
qemu_fclose(fsave);
|
||||
}
|
||||
|
||||
static void test_load_noskip(void)
|
||||
{
|
||||
QEMUFile *fsave = open_test_file(true);
|
||||
uint8_t buf[] = {
|
||||
0, 0, 0, 10, /* a */
|
||||
0, 0, 0, 20, /* b */
|
||||
|
@ -442,10 +449,8 @@ static void test_load_noskip(void)
|
|||
0, 0, 0, 0, 0, 0, 0, 60, /* f */
|
||||
QEMU_VM_EOF, /* just to ensure we won't get EOF reported prematurely */
|
||||
};
|
||||
qemu_put_buffer(fsave, buf, sizeof(buf));
|
||||
qemu_fclose(fsave);
|
||||
|
||||
QEMUFile *loading = open_test_file(false);
|
||||
QEMUFile *loading = open_mem_file_read(buf, sizeof(buf));
|
||||
TestStruct obj = { .skip_c_e = false };
|
||||
vmstate_load_state(loading, &vmstate_skipping, &obj, 2);
|
||||
g_assert(!qemu_file_get_error(loading));
|
||||
|
@ -460,7 +465,6 @@ static void test_load_noskip(void)
|
|||
|
||||
static void test_load_skip(void)
|
||||
{
|
||||
QEMUFile *fsave = open_test_file(true);
|
||||
uint8_t buf[] = {
|
||||
0, 0, 0, 10, /* a */
|
||||
0, 0, 0, 20, /* b */
|
||||
|
@ -468,10 +472,8 @@ static void test_load_skip(void)
|
|||
0, 0, 0, 0, 0, 0, 0, 60, /* f */
|
||||
QEMU_VM_EOF, /* just to ensure we won't get EOF reported prematurely */
|
||||
};
|
||||
qemu_put_buffer(fsave, buf, sizeof(buf));
|
||||
qemu_fclose(fsave);
|
||||
|
||||
QEMUFile *loading = open_test_file(false);
|
||||
QEMUFile *loading = open_mem_file_read(buf, sizeof(buf));
|
||||
TestStruct obj = { .skip_c_e = true, .c = 300, .e = 500 };
|
||||
vmstate_load_state(loading, &vmstate_skipping, &obj, 2);
|
||||
g_assert(!qemu_file_get_error(loading));
|
||||
|
|
Loading…
Reference in a new issue