ut_lvol: unit tests for i/o
Signed-off-by: Piotr Pelplinski <piotr.pelplinski@intel.com> Change-Id: Ic664740490f2a342d0d63947935fb081cb70934b Reviewed-on: https://review.gerrithub.io/373748 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
9fb50ad867
commit
dc7eb0397e
@ -45,6 +45,9 @@ struct spdk_lvol_store *g_lvs = NULL;
|
|||||||
struct spdk_lvol *g_lvol = NULL;
|
struct spdk_lvol *g_lvol = NULL;
|
||||||
struct lvol_store_bdev *g_lvs_bdev = NULL;
|
struct lvol_store_bdev *g_lvs_bdev = NULL;
|
||||||
struct spdk_bdev *g_base_bdev = NULL;
|
struct spdk_bdev *g_base_bdev = NULL;
|
||||||
|
struct spdk_bdev_io *g_io = NULL;
|
||||||
|
struct spdk_io_channel *g_ch = NULL;
|
||||||
|
struct lvol_task *g_task = NULL;
|
||||||
|
|
||||||
|
|
||||||
static struct spdk_bdev g_bdev = {};
|
static struct spdk_bdev g_bdev = {};
|
||||||
@ -218,12 +221,14 @@ spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status sta
|
|||||||
|
|
||||||
struct spdk_io_channel *spdk_lvol_get_io_channel(struct spdk_lvol *lvol)
|
struct spdk_io_channel *spdk_lvol_get_io_channel(struct spdk_lvol *lvol)
|
||||||
{
|
{
|
||||||
return NULL;
|
CU_ASSERT(lvol == g_lvol);
|
||||||
|
return g_ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, uint64_t len)
|
spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, uint64_t len)
|
||||||
{
|
{
|
||||||
|
CU_ASSERT(cb == lvol_read);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -245,6 +250,10 @@ spdk_bs_io_writev_blob(struct spdk_blob *blob, struct spdk_io_channel *channel,
|
|||||||
struct iovec *iov, int iovcnt, uint64_t offset, uint64_t length,
|
struct iovec *iov, int iovcnt, uint64_t offset, uint64_t length,
|
||||||
spdk_blob_op_complete cb_fn, void *cb_arg)
|
spdk_blob_op_complete cb_fn, void *cb_arg)
|
||||||
{
|
{
|
||||||
|
CU_ASSERT(blob == NULL);
|
||||||
|
CU_ASSERT(channel == g_ch);
|
||||||
|
CU_ASSERT(offset == g_io->u.bdev.offset_blocks);
|
||||||
|
CU_ASSERT(length == g_io->u.bdev.num_blocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -252,6 +261,10 @@ spdk_bs_io_readv_blob(struct spdk_blob *blob, struct spdk_io_channel *channel,
|
|||||||
struct iovec *iov, int iovcnt, uint64_t offset, uint64_t length,
|
struct iovec *iov, int iovcnt, uint64_t offset, uint64_t length,
|
||||||
spdk_blob_op_complete cb_fn, void *cb_arg)
|
spdk_blob_op_complete cb_fn, void *cb_arg)
|
||||||
{
|
{
|
||||||
|
CU_ASSERT(blob == NULL);
|
||||||
|
CU_ASSERT(channel == g_ch);
|
||||||
|
CU_ASSERT(offset == g_io->u.bdev.offset_blocks);
|
||||||
|
CU_ASSERT(length == g_io->u.bdev.num_blocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -469,8 +482,11 @@ ut_lvol_resize(void)
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
g_lvs = calloc(1, sizeof(*g_lvs));
|
g_lvs = calloc(1, sizeof(*g_lvs));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_lvs != NULL);
|
||||||
g_lvs_bdev = calloc(1, sizeof(*g_lvs_bdev));
|
g_lvs_bdev = calloc(1, sizeof(*g_lvs_bdev));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_lvs_bdev != NULL);
|
||||||
g_base_bdev = calloc(1, sizeof(*g_base_bdev));
|
g_base_bdev = calloc(1, sizeof(*g_base_bdev));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_base_bdev != NULL);
|
||||||
g_lvs_bdev->lvs = g_lvs;
|
g_lvs_bdev->lvs = g_lvs;
|
||||||
g_lvs_bdev->bdev = g_base_bdev;
|
g_lvs_bdev->bdev = g_base_bdev;
|
||||||
|
|
||||||
@ -489,6 +505,7 @@ ut_lvol_resize(void)
|
|||||||
g_base_bdev->ctxt = g_lvol;
|
g_base_bdev->ctxt = g_lvol;
|
||||||
|
|
||||||
g_base_bdev->name = spdk_sprintf_alloc("%s", g_lvol->name);
|
g_base_bdev->name = spdk_sprintf_alloc("%s", g_lvol->name);
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_base_bdev->name != NULL);
|
||||||
|
|
||||||
/* Successful lvol resize */
|
/* Successful lvol resize */
|
||||||
rc = vbdev_lvol_resize(g_lvol->name, 20, vbdev_lvol_resize_complete, NULL);
|
rc = vbdev_lvol_resize(g_lvol->name, 20, vbdev_lvol_resize_complete, NULL);
|
||||||
@ -576,6 +593,123 @@ ut_lvs_init(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ut_vbdev_lvol_get_io_channel(void)
|
||||||
|
{
|
||||||
|
struct spdk_io_channel *ch;
|
||||||
|
|
||||||
|
g_lvol = calloc(1, sizeof(struct spdk_lvol));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||||
|
|
||||||
|
ch = vbdev_lvol_get_io_channel(g_lvol);
|
||||||
|
CU_ASSERT(ch == g_ch);
|
||||||
|
|
||||||
|
free(g_lvol);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ut_vbdev_lvol_io_type_supported(void)
|
||||||
|
{
|
||||||
|
struct spdk_lvol *lvol = g_lvol;
|
||||||
|
bool ret;
|
||||||
|
/* Supported types */
|
||||||
|
ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_READ);
|
||||||
|
CU_ASSERT(ret == true);
|
||||||
|
ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_WRITE);
|
||||||
|
CU_ASSERT(ret == true);
|
||||||
|
ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_FLUSH);
|
||||||
|
CU_ASSERT(ret == true);
|
||||||
|
ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_RESET);
|
||||||
|
CU_ASSERT(ret == true);
|
||||||
|
|
||||||
|
/* Unsupported types */
|
||||||
|
ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_UNMAP);
|
||||||
|
CU_ASSERT(ret == false);
|
||||||
|
ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_ADMIN);
|
||||||
|
CU_ASSERT(ret == false);
|
||||||
|
ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_IO);
|
||||||
|
CU_ASSERT(ret == false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ut_lvol_op_comp(void)
|
||||||
|
{
|
||||||
|
struct lvol_task task;
|
||||||
|
|
||||||
|
lvol_op_comp(&task, 1);
|
||||||
|
CU_ASSERT(task.status == SPDK_BDEV_IO_STATUS_FAILED);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ut_lvol_flush(void)
|
||||||
|
{
|
||||||
|
g_io = calloc(1, sizeof(struct spdk_bdev_io) + sizeof(struct lvol_task));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_io != NULL);
|
||||||
|
g_base_bdev = calloc(1, sizeof(struct spdk_bdev));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_base_bdev != NULL);
|
||||||
|
g_lvol = calloc(1, sizeof(struct spdk_lvol));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||||
|
|
||||||
|
g_task = (struct lvol_task *)g_io->driver_ctx;
|
||||||
|
g_io->bdev = g_base_bdev;
|
||||||
|
g_io->bdev->ctxt = g_lvol;
|
||||||
|
|
||||||
|
/* Successful flush to lvol */
|
||||||
|
lvol_flush(g_ch, g_io);
|
||||||
|
|
||||||
|
CU_ASSERT(g_task->status == SPDK_BDEV_IO_STATUS_SUCCESS);
|
||||||
|
|
||||||
|
free(g_io);
|
||||||
|
free(g_base_bdev);
|
||||||
|
free(g_lvol);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ut_lvol_read_write(void)
|
||||||
|
{
|
||||||
|
g_io = calloc(1, sizeof(struct spdk_bdev_io) + sizeof(struct lvol_task));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_io != NULL);
|
||||||
|
g_base_bdev = calloc(1, sizeof(struct spdk_bdev));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_base_bdev != NULL);
|
||||||
|
g_lvol = calloc(1, sizeof(struct spdk_lvol));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||||
|
|
||||||
|
g_task = (struct lvol_task *)g_io->driver_ctx;
|
||||||
|
g_io->bdev = g_base_bdev;
|
||||||
|
g_io->bdev->ctxt = g_lvol;
|
||||||
|
g_io->u.bdev.offset_blocks = 20;
|
||||||
|
g_io->u.bdev.num_blocks = 20;
|
||||||
|
|
||||||
|
lvol_read(g_ch, g_io);
|
||||||
|
CU_ASSERT(g_task->status == SPDK_BDEV_IO_STATUS_SUCCESS);
|
||||||
|
|
||||||
|
lvol_write(g_lvol, g_ch, g_io);
|
||||||
|
CU_ASSERT(g_task->status == SPDK_BDEV_IO_STATUS_SUCCESS);
|
||||||
|
|
||||||
|
free(g_io);
|
||||||
|
free(g_base_bdev);
|
||||||
|
free(g_lvol);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ut_vbdev_lvol_submit_request(void)
|
||||||
|
{
|
||||||
|
g_io = calloc(1, sizeof(struct spdk_bdev_io) + sizeof(struct lvol_task));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_io != NULL);
|
||||||
|
g_base_bdev = calloc(1, sizeof(struct spdk_bdev));
|
||||||
|
SPDK_CU_ASSERT_FATAL(g_base_bdev != NULL);
|
||||||
|
g_task = (struct lvol_task *)g_io->driver_ctx;
|
||||||
|
|
||||||
|
g_io->bdev = g_base_bdev;
|
||||||
|
|
||||||
|
g_io->type = SPDK_BDEV_IO_TYPE_READ;
|
||||||
|
vbdev_lvol_submit_request(g_ch, g_io);
|
||||||
|
|
||||||
|
free(g_io);
|
||||||
|
free(g_base_bdev);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
CU_pSuite suite = NULL;
|
CU_pSuite suite = NULL;
|
||||||
@ -596,7 +730,13 @@ int main(int argc, char **argv)
|
|||||||
CU_add_test(suite, "ut_lvol_init", ut_lvol_init) == NULL ||
|
CU_add_test(suite, "ut_lvol_init", ut_lvol_init) == NULL ||
|
||||||
CU_add_test(suite, "ut_lvs_destroy", ut_lvs_destroy) == NULL ||
|
CU_add_test(suite, "ut_lvs_destroy", ut_lvs_destroy) == NULL ||
|
||||||
CU_add_test(suite, "ut_lvol_resize", ut_lvol_resize) == NULL ||
|
CU_add_test(suite, "ut_lvol_resize", ut_lvol_resize) == NULL ||
|
||||||
CU_add_test(suite, "lvol_hotremove", ut_lvol_hotremove) == NULL
|
CU_add_test(suite, "lvol_hotremove", ut_lvol_hotremove) == NULL ||
|
||||||
|
CU_add_test(suite, "ut_vbdev_lvol_get_io_channel", ut_vbdev_lvol_get_io_channel) == NULL ||
|
||||||
|
CU_add_test(suite, "ut_vbdev_lvol_io_type_supported", ut_vbdev_lvol_io_type_supported) == NULL ||
|
||||||
|
CU_add_test(suite, "ut_lvol_op_comp", ut_lvol_op_comp) == NULL ||
|
||||||
|
CU_add_test(suite, "ut_lvol_flush", ut_lvol_flush) == NULL ||
|
||||||
|
CU_add_test(suite, "ut_lvol_read_write", ut_lvol_read_write) == NULL ||
|
||||||
|
CU_add_test(suite, "ut_vbdev_lvol_submit_request", ut_vbdev_lvol_submit_request) == NULL
|
||||||
) {
|
) {
|
||||||
CU_cleanup_registry();
|
CU_cleanup_registry();
|
||||||
return CU_get_error();
|
return CU_get_error();
|
||||||
|
Loading…
Reference in New Issue
Block a user