aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Henderson <william.henderson@nutanix.com>2023-07-28 13:23:19 +0000
committerJohn Levon <john.levon@nutanix.com>2023-09-15 13:06:15 +0100
commit1f549d9427606ec5b6f60e03790a1a56a7019067 (patch)
tree8b73ed57b3a8483284ee9d59137c792f35fbd330
parentfb1930ad81b0f357edc45677e97ed74ea4ca606d (diff)
downloadlibvfio-user-1f549d9427606ec5b6f60e03790a1a56a7019067.zip
libvfio-user-1f549d9427606ec5b6f60e03790a1a56a7019067.tar.gz
libvfio-user-1f549d9427606ec5b6f60e03790a1a56a7019067.tar.bz2
test: add tests for `handle_mig_data_read`
Signed-off-by: William Henderson <william.henderson@nutanix.com>
-rw-r--r--test/unit-tests.c110
1 files changed, 107 insertions, 3 deletions
diff --git a/test/unit-tests.c b/test/unit-tests.c
index aafb15a..2f860e9 100644
--- a/test/unit-tests.c
+++ b/test/unit-tests.c
@@ -467,6 +467,15 @@ static int transition_callback(vfu_ctx_t *ctx UNUSED, vfu_migr_state_t state) {
LAST_STATE = state;
return 0;
}
+static ssize_t read_callback(vfu_ctx_t *ctx UNUSED, void *buf, uint64_t count)
+{
+ assert(count < 256);
+ uint8_t *data = buf;
+ for (uint8_t i = 0; i < count; i++) {
+ *(data + i) = i;
+ }
+ return count;
+}
static struct test_setup_migr_reg_dat {
vfu_ctx_t *v;
@@ -475,7 +484,7 @@ static struct test_setup_migr_reg_dat {
.c = {
.version = VFU_MIGR_CALLBACKS_VERS,
.transition = transition_callback,
- .read_data = (void *)0x2,
+ .read_data = read_callback,
.write_data = (void *)0x3
}
};
@@ -511,13 +520,15 @@ test_setup_migration_callbacks(void **state)
}
static void
-test_migration_state_sequence(void **state)
+test_handle_device_state(void **state)
{
test_setup_migration_callbacks(state);
struct test_setup_migr_reg_dat *p = *state;
struct migration *migr = p->v->migration;
+ assert(migr->state == VFIO_DEVICE_STATE_RUNNING);
+
int r;
r = handle_device_state(p->v, migr, VFIO_DEVICE_STATE_PRE_COPY, true);
@@ -538,6 +549,90 @@ test_migration_state_sequence(void **state)
}
static void
+test_handle_mig_data_read(void **state)
+{
+ test_setup_migration_callbacks(state);
+
+ struct test_setup_migr_reg_dat *p = *state;
+ struct migration *migr = p->v->migration;
+
+ struct vfio_user_mig_data data = {
+ .argsz = sizeof(data),
+ .size = 4
+ };
+
+ vfu_msg_t *m = mkmsg(VFIO_USER_MIG_DATA_READ, &data, sizeof(data));
+
+ uint8_t expect[4] = {0, 1, 2, 3};
+
+ p->v->client_max_data_xfer_size = 4;
+
+ ssize_t r;
+
+ migr->state = VFIO_DEVICE_STATE_PRE_COPY;
+ r = handle_mig_data_read(p->v, m);
+ assert_int_equal(4, r);
+ assert_int_equal(0, memcmp(msg.out.iov.iov_base + sizeof(data), &expect, 4));
+ free(msg.out.iov.iov_base);
+
+ migr->state = VFIO_DEVICE_STATE_STOP_COPY;
+ r = handle_mig_data_read(p->v, m);
+ assert_int_equal(4, r);
+ assert_int_equal(0, memcmp(msg.out.iov.iov_base + sizeof(data), &expect, 4));
+ free(msg.out.iov.iov_base);
+}
+
+static void
+test_handle_mig_data_read_too_long(void **state) {
+ test_setup_migration_callbacks(state);
+
+ struct test_setup_migr_reg_dat *p = *state;
+ struct migration *migr = p->v->migration;
+
+ struct vfio_user_mig_data data = {
+ .argsz = sizeof(data),
+ .size = 4
+ };
+
+ vfu_msg_t *m = mkmsg(VFIO_USER_MIG_DATA_READ, &data, sizeof(data));
+
+ p->v->client_max_data_xfer_size = 2;
+
+ ssize_t r;
+
+ migr->state = VFIO_DEVICE_STATE_PRE_COPY;
+ r = handle_mig_data_read(p->v, m);
+ assert_int_equal(-EINVAL, r);
+}
+
+static void
+test_handle_mig_data_read_invalid_state(void **state) {
+ test_setup_migration_callbacks(state);
+
+ struct test_setup_migr_reg_dat *p = *state;
+ struct migration *migr = p->v->migration;
+
+ struct vfio_user_mig_data data = {
+ .argsz = sizeof(data),
+ .size = 4
+ };
+
+ vfu_msg_t *m = mkmsg(VFIO_USER_MIG_DATA_READ, &data, sizeof(data));
+
+ p->v->client_max_data_xfer_size = 4;
+
+ ssize_t r;
+
+ migr->state = VFIO_DEVICE_STATE_RUNNING;
+ r = handle_mig_data_read(p->v, m);
+ assert_int_equal(-EINVAL, r);
+
+ migr->state = VFIO_DEVICE_STATE_STOP;
+ r = handle_mig_data_read(p->v, m);
+ assert_int_equal(-EINVAL, r);
+}
+
+static void
test_device_is_stopped_and_copying(UNUSED void **state)
{
assert_false(device_is_stopped_and_copying(vfu_ctx.migration));
@@ -642,7 +737,16 @@ main(void)
cmocka_unit_test_setup_teardown(test_setup_migration_callbacks,
setup_test_setup_migration,
teardown_test_setup_migration),
- cmocka_unit_test_setup_teardown(test_migration_state_sequence,
+ cmocka_unit_test_setup_teardown(test_handle_device_state,
+ setup_test_setup_migration,
+ teardown_test_setup_migration),
+ cmocka_unit_test_setup_teardown(test_handle_mig_data_read,
+ setup_test_setup_migration,
+ teardown_test_setup_migration),
+ cmocka_unit_test_setup_teardown(test_handle_mig_data_read_too_long,
+ setup_test_setup_migration,
+ teardown_test_setup_migration),
+ cmocka_unit_test_setup_teardown(test_handle_mig_data_read_invalid_state,
setup_test_setup_migration,
teardown_test_setup_migration),
cmocka_unit_test_setup(test_device_is_stopped_and_copying, setup),