ut/nvme: Add unit test for nsdata

Signed-off-by: Evgeniy Kochetov <evgeniik@nvidia.com>
Change-Id: I9217eae7de8e9705052599a3f0ba0b6e4ca2be38
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6499
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Evgeniy Kochetov 2021-02-11 09:33:04 +02:00 committed by Tomasz Zawadzki
parent 6231798dca
commit 030b9f2608

View File

@ -1,8 +1,8 @@
/*-
* BSD LICENSE
*
* Copyright (c) Intel Corporation.
* All rights reserved.
* Copyright (c) Intel Corporation. All rights reserved.
* Copyright (c) 2021 Mellanox Technologies LTD. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -47,11 +47,34 @@ DEFINE_STUB(nvme_wait_for_completion_robust_lock, int,
pthread_mutex_t *robust_mutex), 0);
DEFINE_STUB(nvme_ctrlr_multi_iocs_enabled, bool, (struct spdk_nvme_ctrlr *ctrlr), true);
static struct spdk_nvme_cpl fake_cpl = {};
static enum spdk_nvme_generic_command_status_code set_status_code = SPDK_NVME_SC_SUCCESS;
static void
fake_cpl_sc(spdk_nvme_cmd_cb cb_fn, void *cb_arg)
{
fake_cpl.status.sc = set_status_code;
cb_fn(cb_arg, &fake_cpl);
}
static struct spdk_nvme_ns_data *fake_nsdata;
int
nvme_ctrlr_cmd_identify(struct spdk_nvme_ctrlr *ctrlr, uint8_t cns, uint16_t cntid, uint32_t nsid,
uint8_t csi, void *payload, size_t payload_size,
spdk_nvme_cmd_cb cb_fn, void *cb_arg)
{
if (cns == SPDK_NVME_IDENTIFY_NS) {
assert(payload_size == sizeof(struct spdk_nvme_ns_data));
if (fake_nsdata) {
memcpy(payload, fake_nsdata, sizeof(*fake_nsdata));
} else {
memset(payload, 0, payload_size);
}
fake_cpl_sc(cb_fn, cb_arg);
return 0;
}
return -1;
}
@ -71,7 +94,8 @@ test_nvme_ns_construct(void)
{
struct spdk_nvme_ns ns = {};
uint32_t id = 1;
struct spdk_nvme_ctrlr ctrlr = {};
struct spdk_nvme_ns_data ctrlr_nsdata = {};
struct spdk_nvme_ctrlr ctrlr = { .nsdata = &ctrlr_nsdata };
nvme_ns_construct(&ns, id, &ctrlr);
CU_ASSERT(ns.id == 1);
@ -190,6 +214,39 @@ test_nvme_ns_csi(void)
nvme_ns_destruct(&ns);
}
static void
test_nvme_ns_data(void)
{
struct spdk_nvme_ns ns = {};
struct spdk_nvme_ns_data ctrlr_nsdata = {};
struct spdk_nvme_ctrlr ctrlr = { .nsdata = &ctrlr_nsdata };
struct spdk_nvme_ns_data expected_nsdata = {
.nsze = 1000,
.ncap = 1000,
};
const struct spdk_nvme_ns_data *nsdata;
fake_nsdata = &expected_nsdata;
SPDK_CU_ASSERT_FATAL(nvme_ns_construct(&ns, 1, &ctrlr) == 0);
fake_nsdata = NULL;
CU_ASSERT(spdk_nvme_ns_is_active(&ns));
CU_ASSERT(spdk_nvme_ns_get_id(&ns) == 1);
CU_ASSERT(spdk_nvme_ns_get_num_sectors(&ns) == 1000);
nsdata = spdk_nvme_ns_get_data(&ns);
CU_ASSERT(nsdata != NULL);
CU_ASSERT(nsdata->ncap == 1000);
nvme_ns_destruct(&ns);
/* Cached NS data is still accessible after destruction. But is cleared. */
CU_ASSERT(!spdk_nvme_ns_is_active(&ns));
CU_ASSERT(spdk_nvme_ns_get_id(&ns) == 1);
CU_ASSERT(spdk_nvme_ns_get_num_sectors(&ns) == 0);
CU_ASSERT(nsdata->ncap == 0);
CU_ASSERT(nsdata == spdk_nvme_ns_get_data(&ns));
}
int main(int argc, char **argv)
{
CU_pSuite suite = NULL;
@ -203,6 +260,7 @@ int main(int argc, char **argv)
CU_ADD_TEST(suite, test_nvme_ns_construct);
CU_ADD_TEST(suite, test_nvme_ns_uuid);
CU_ADD_TEST(suite, test_nvme_ns_csi);
CU_ADD_TEST(suite, test_nvme_ns_data);
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();