bdev/zone: Add helper function for unit test

Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Change-Id: I9853d49299ca4e566dc60da321919493e0e7c32f
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/479541
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
This commit is contained in:
Kozlowski Mateusz 2020-01-07 07:04:50 -05:00 committed by Tomasz Zawadzki
parent d1a8a7bee1
commit 351c38d570

View File

@ -284,9 +284,8 @@ static void
verify_bdev_present(const char *name, bool presence)
{
struct bdev_zone_block *bdev;
bool bdev_found;
bool bdev_found = false;
bdev_found = false;
TAILQ_FOREACH(bdev, &g_bdev_nodes, link) {
if (strcmp(bdev->bdev.name, name) == 0) {
bdev_found = true;
@ -323,6 +322,8 @@ free_test_req(struct rpc_construct_zone_block *r)
{
free(r->name);
free(r->base_bdev);
g_rpc_req = NULL;
}
static void
@ -376,9 +377,8 @@ static void
verify_zone_bdev(struct rpc_construct_zone_block *r, bool presence)
{
struct bdev_zone_block *bdev;
bool bdev_found;
bool bdev_found = false;
bdev_found = false;
TAILQ_FOREACH(bdev, &g_bdev_nodes, link) {
if (strcmp(bdev->bdev.name, r->name) == 0) {
bdev_found = true;
@ -409,11 +409,45 @@ verify_zone_bdev(struct rpc_construct_zone_block *r, bool presence)
}
static void
test_zone_block_create(void)
send_create_vbdev(char *vdev_name, char *name, uint64_t zone_capacity, uint64_t optimal_open_zones,
bool create_bdev, bool success)
{
struct rpc_construct_zone_block req;
initialize_create_req(&req, vdev_name, name, zone_capacity, optimal_open_zones, create_bdev);
rpc_zone_block_create(NULL, NULL);
CU_ASSERT(g_rpc_err != success);
verify_zone_config(&req, success);
verify_zone_bdev(&req, success);
free_test_req(&req);
}
static void
send_delete_vbdev(char *name, bool success)
{
struct rpc_delete_zone_block delete_req;
create_delete_req(&delete_req, name);
rpc_zone_block_delete(NULL, NULL);
verify_config_present(name, false);
verify_bdev_present(name, false);
CU_ASSERT(g_rpc_err != success);
g_rpc_req = NULL;
}
static void
test_cleanup(void)
{
CU_ASSERT(spdk_thread_is_idle(g_thread));
zone_block_finish();
base_bdevs_cleanup();
}
static void
test_zone_block_create(void)
{
struct spdk_bdev *bdev;
struct rpc_construct_zone_block req;
char *name = "Nvme0n1";
size_t num_zones = 20;
size_t zone_capacity = BLOCK_CNT / num_zones;
@ -434,40 +468,20 @@ test_zone_block_create(void)
free_test_req(&req);
/* Delete bdev */
create_delete_req(&delete_req, "zone_dev1");
rpc_zone_block_delete(NULL, NULL);
verify_config_present("zone_dev1", false);
verify_bdev_present("zone_dev1", false);
CU_ASSERT(g_rpc_err == 0);
send_delete_vbdev("zone_dev1", true);
/* Create zoned virtual device and verify its correctness */
verify_config_present("zone_dev1", false);
verify_bdev_present("zone_dev1", false);
initialize_create_req(&req, "zone_dev1", name, zone_capacity, 1, false);
rpc_zone_block_create(NULL, NULL);
CU_ASSERT(g_rpc_err == 0);
verify_zone_config(&req, true);
verify_zone_bdev(&req, true);
free_test_req(&req);
/* Delete bdev */
create_delete_req(&delete_req, "zone_dev1");
rpc_zone_block_delete(NULL, NULL);
verify_config_present("zone_dev1", false);
verify_bdev_present("zone_dev1", false);
CU_ASSERT(g_rpc_err == 0);
send_create_vbdev("zone_dev1", name, zone_capacity, 1, false, true);
send_delete_vbdev("zone_dev1", true);
while (spdk_thread_poll(g_thread, 0, 0) > 0) {}
zone_block_finish();
base_bdevs_cleanup();
SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&g_bdev_list));
test_cleanup();
}
static void
test_zone_block_create_invalid(void)
{
struct rpc_construct_zone_block req;
struct rpc_delete_zone_block delete_req;
char *name = "Nvme0n1";
size_t num_zones = 10;
size_t zone_capacity = BLOCK_CNT / num_zones;
@ -477,57 +491,25 @@ test_zone_block_create_invalid(void)
/* Create zoned virtual device and verify its correctness */
verify_config_present("zone_dev1", false);
verify_bdev_present("zone_dev1", false);
initialize_create_req(&req, "zone_dev1", name, zone_capacity, 1, true);
rpc_zone_block_create(NULL, NULL);
CU_ASSERT(g_rpc_err == 0);
verify_zone_config(&req, true);
verify_zone_bdev(&req, true);
free_test_req(&req);
send_create_vbdev("zone_dev1", name, zone_capacity, 1, true, true);
/* Try to create another zoned virtual device on the same bdev */
initialize_create_req(&req, "zone_dev2", name, zone_capacity, 1, false);
rpc_zone_block_create(NULL, NULL);
CU_ASSERT(g_rpc_err == 1);
verify_config_present("zone_dev2", false);
verify_bdev_present("zone_dev2", false);
free_test_req(&req);
send_create_vbdev("zone_dev2", name, zone_capacity, 1, false, false);
/* Try to create zoned virtual device on the zoned bdev */
initialize_create_req(&req, "zone_dev2", "zone_dev1", zone_capacity, 1, false);
rpc_zone_block_create(NULL, NULL);
CU_ASSERT(g_rpc_err == 1);
verify_config_present("zone_dev2", false);
verify_bdev_present("zone_dev2", false);
free_test_req(&req);
send_create_vbdev("zone_dev2", "zone_dev1", zone_capacity, 1, false, false);
/* Unclaim the base bdev */
create_delete_req(&delete_req, "zone_dev1");
rpc_zone_block_delete(NULL, NULL);
verify_config_present("zone_dev1", false);
verify_bdev_present("zone_dev1", false);
CU_ASSERT(g_rpc_err == 0);
send_delete_vbdev("zone_dev1", true);
/* Try to create zoned virtual device with 0 zone size */
initialize_create_req(&req, "zone_dev2", name, 0, 1, false);
rpc_zone_block_create(NULL, NULL);
CU_ASSERT(g_rpc_err == 1);
verify_config_present("zone_dev2", false);
verify_bdev_present("zone_dev2", false);
free_test_req(&req);
send_create_vbdev("zone_dev2", name, 0, 1, false, false);
/* Try to create zoned virtual device with 0 optimal number of zones */
initialize_create_req(&req, "zone_dev2", name, zone_capacity, 0, false);
rpc_zone_block_create(NULL, NULL);
verify_config_present("zone_dev2", false);
verify_bdev_present("zone_dev2", false);
CU_ASSERT(g_rpc_err == 1);
free_test_req(&req);
send_create_vbdev("zone_dev2", name, zone_capacity, 0, false, false);
while (spdk_thread_poll(g_thread, 0, 0) > 0) {}
zone_block_finish();
base_bdevs_cleanup();
SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&g_bdev_list));
test_cleanup();
}
int main(int argc, char **argv)