diff options
author | William Henderson <william.henderson@nutanix.com> | 2023-07-28 13:23:19 +0000 |
---|---|---|
committer | John Levon <john.levon@nutanix.com> | 2023-09-15 13:06:15 +0100 |
commit | 1f549d9427606ec5b6f60e03790a1a56a7019067 (patch) | |
tree | 8b73ed57b3a8483284ee9d59137c792f35fbd330 | |
parent | fb1930ad81b0f357edc45677e97ed74ea4ca606d (diff) | |
download | libvfio-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.c | 110 |
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), |