diff --git a/test/unit/lib/vhost/vhost.c/vhost_ut.c b/test/unit/lib/vhost/vhost.c/vhost_ut.c index 0ed3d2c1d3..15d6c7b2da 100644 --- a/test/unit/lib/vhost/vhost.c/vhost_ut.c +++ b/test/unit/lib/vhost/vhost.c/vhost_ut.c @@ -85,6 +85,7 @@ alloc_vdev(void) rc = posix_memalign((void **)&vdev, 64, sizeof(*vdev)); CU_ASSERT(rc == 0); SPDK_CU_ASSERT_FATAL(vdev != NULL); + memset(vdev, 0, sizeof(*vdev)); vdev->mem = calloc(1, sizeof(*vdev->mem) + 2 * sizeof(struct rte_vhost_mem_region)); SPDK_CU_ASSERT_FATAL(vdev->mem != NULL); @@ -95,6 +96,7 @@ alloc_vdev(void) vdev->mem->regions[1].guest_phys_addr = 0x400000; vdev->mem->regions[1].size = 0x400000; /* 4 MB */ vdev->mem->regions[1].host_user_addr = 0x2000000; + vdev->vid = 0x10; return vdev; } @@ -102,6 +104,7 @@ alloc_vdev(void) static void free_vdev(struct spdk_vhost_dev *vdev) { + free(vdev->name); free(vdev->mem); free(vdev); } @@ -198,6 +201,114 @@ desc_to_iov_test(void) CU_ASSERT(true); } +static void +create_controller_test(void) +{ + struct spdk_vhost_dev *vdev; + int ret; + unsigned ctrlr_num; + char long_name[PATH_MAX]; + struct spdk_vhost_dev_backend backend; + + MOCK_SET(spdk_app_get_core_mask, uint64_t, 1); + + /* Create device with no name */ + vdev = alloc_vdev(); + ret = spdk_vhost_dev_construct(vdev, NULL, "0x1", SPDK_VHOST_DEV_T_BLK, &backend); + CU_ASSERT(ret != 0); + + /* Create device with incorrect cpumask */ + ret = spdk_vhost_dev_construct(vdev, "vdev_name_0", "0x2", SPDK_VHOST_DEV_T_BLK, &backend); + CU_ASSERT(ret != 0); + + /* Create device with too long name and path */ + memset(long_name, 'x', sizeof(long_name)); + long_name[PATH_MAX - 1] = 0; + snprintf(dev_dirname, sizeof(dev_dirname), "some_path/"); + ret = spdk_vhost_dev_construct(vdev, long_name, "0x1", SPDK_VHOST_DEV_T_BLK, &backend); + CU_ASSERT(ret != 0); + dev_dirname[0] = 0; + + /* Create device when device name is already taken */ + vdev->name = strdup("vdev_name_0"); + g_spdk_vhost_devices[0] = vdev; + ret = spdk_vhost_dev_construct(vdev, "vdev_name_0", "0x1", SPDK_VHOST_DEV_T_BLK, &backend); + CU_ASSERT(ret != 0); + + /* Create device when max number of devices is reached */ + for (ctrlr_num = 0; ctrlr_num < MAX_VHOST_DEVICES; ctrlr_num ++) { + g_spdk_vhost_devices[ctrlr_num] = vdev; + } + + ret = spdk_vhost_dev_construct(vdev, "vdev_name_1", "0x1", SPDK_VHOST_DEV_T_BLK, &backend); + CU_ASSERT(ret != 0); + + free_vdev(vdev); + for (ctrlr_num = 0; ctrlr_num < MAX_VHOST_DEVICES; ctrlr_num++) { + g_spdk_vhost_devices[ctrlr_num] = NULL; + } +} + +static void +dev_find_by_vid_test(void) +{ + struct spdk_vhost_dev *vdev; + + g_spdk_vhost_devices[0] = alloc_vdev(); + vdev = spdk_vhost_dev_find_by_vid(0x10); + CU_ASSERT(vdev != NULL); + + /* Search for a device with incorrect vid */ + vdev = spdk_vhost_dev_find_by_vid(0xFF); + CU_ASSERT(vdev == NULL); + + free_vdev(g_spdk_vhost_devices[0]); + g_spdk_vhost_devices[0] = NULL; +} + +static void +remove_controller_test(void) +{ + struct spdk_vhost_dev *vdev; + char long_name[PATH_MAX]; + int ret; + + vdev = alloc_vdev(); + vdev->lcore = 0; + vdev->name = strdup("vdev_name_0"); + + /* Remove device when controller is in use */ + ret = spdk_vhost_dev_remove(vdev); + CU_ASSERT(ret != 0); + if (ret == 0) { + vdev->name = strdup("vdev_name_0"); + } + + /* Remove nonexistent device */ + vdev->lcore = -1; + ret = spdk_vhost_dev_remove(vdev); + CU_ASSERT(ret != 0); + if (ret != 0) { + free(vdev->name); + } + + /* Remove device with too long name and path */ + memset(long_name, 'x', sizeof(long_name)); + long_name[PATH_MAX - 1] = 0; + snprintf(dev_dirname, sizeof(dev_dirname), "some_path/"); + vdev->name = strdup(long_name); + g_spdk_vhost_devices[0] = vdev; + ret = spdk_vhost_dev_remove(vdev); + CU_ASSERT(ret != 0); + if (ret == 0) { + vdev->name = NULL; + } + + free_vdev(vdev); + g_spdk_vhost_devices[0] = NULL; + dev_dirname[0] = 0; +} + int main(int argc, char **argv) { @@ -215,7 +326,10 @@ main(int argc, char **argv) } if ( - CU_add_test(suite, "desc_to_iov", desc_to_iov_test) == NULL + CU_add_test(suite, "desc_to_iov", desc_to_iov_test) == NULL || + CU_add_test(suite, "create_controller", create_controller_test) == NULL || + CU_add_test(suite, "dev_find_by_vid", dev_find_by_vid_test) == NULL || + CU_add_test(suite, "remove_controller", remove_controller_test) == NULL ) { CU_cleanup_registry(); return CU_get_error();