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();