unit: add a UT for the multi async reqs

The UT can test the received aer reqs number and
check if the reqs are continuous.

Change-Id: Ifa1cb9dd4cdae5526fc80fe6c1b504ad9873d0f8
Signed-off-by: Jin Yu <jin.yu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2549
Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Jin Yu 2020-05-21 02:39:17 +08:00 committed by Tomasz Zawadzki
parent b7cc4dd7dd
commit d33466d0a9

View File

@ -1590,6 +1590,74 @@ test_fused_compare_and_write(void)
CU_ASSERT(qpair.first_fused_req == NULL);
}
static void
test_multi_async_event_reqs(void)
{
struct spdk_nvmf_subsystem subsystem = {};
struct spdk_nvmf_qpair qpair = {};
struct spdk_nvmf_ctrlr ctrlr = {};
struct spdk_nvmf_request req[5] = {};
struct spdk_nvmf_ns *ns_ptrs[1] = {};
struct spdk_nvmf_ns ns = {};
union nvmf_h2c_msg cmd[5] = {};
union nvmf_c2h_msg rsp[5] = {};
struct spdk_nvmf_poll_group group = {};
struct spdk_nvmf_subsystem_poll_group sgroups = {};
int i;
ns_ptrs[0] = &ns;
subsystem.ns = ns_ptrs;
subsystem.max_nsid = 1;
subsystem.subtype = SPDK_NVMF_SUBTYPE_NVME;
ns.opts.nsid = 1;
group.sgroups = &sgroups;
qpair.ctrlr = &ctrlr;
qpair.group = &group;
ctrlr.subsys = &subsystem;
ctrlr.vcprop.cc.bits.en = 1;
for (i = 0; i < 5; i++) {
cmd[i].nvme_cmd.opc = SPDK_NVME_OPC_ASYNC_EVENT_REQUEST;
cmd[i].nvme_cmd.nsid = 1;
cmd[i].nvme_cmd.cid = i;
req[i].qpair = &qpair;
req[i].cmd = &cmd[i];
req[i].rsp = &rsp[i];
}
/* Target can store NVMF_MAX_ASYNC_EVENTS reqs */
sgroups.io_outstanding = NVMF_MAX_ASYNC_EVENTS;
for (i = 0; i < NVMF_MAX_ASYNC_EVENTS; i++) {
CU_ASSERT(nvmf_ctrlr_process_admin_cmd(&req[i]) == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS);
CU_ASSERT(ctrlr.nr_aer_reqs == i + 1);
}
CU_ASSERT(sgroups.io_outstanding == 0);
/* Exceeding the NVMF_MAX_ASYNC_EVENTS reports error */
CU_ASSERT(nvmf_ctrlr_process_admin_cmd(&req[4]) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
CU_ASSERT(ctrlr.nr_aer_reqs == NVMF_MAX_ASYNC_EVENTS);
CU_ASSERT(rsp[4].nvme_cpl.status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC);
CU_ASSERT(rsp[4].nvme_cpl.status.sc = SPDK_NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED);
/* Test if the aer_reqs keep continuous when abort a req in the middle */
CU_ASSERT(nvmf_qpair_abort(&qpair, 2) == &req[2]);
CU_ASSERT(ctrlr.aer_req[0] == &req[0]);
CU_ASSERT(ctrlr.aer_req[1] == &req[1]);
CU_ASSERT(ctrlr.aer_req[2] == &req[3]);
CU_ASSERT(nvmf_qpair_abort(&qpair, 3) == &req[3]);
CU_ASSERT(ctrlr.aer_req[0] == &req[0]);
CU_ASSERT(ctrlr.aer_req[1] == &req[1]);
CU_ASSERT(ctrlr.aer_req[2] == NULL);
CU_ASSERT(ctrlr.nr_aer_reqs == 2);
}
int main(int argc, char **argv)
{
CU_pSuite suite = NULL;
@ -1614,6 +1682,7 @@ int main(int argc, char **argv)
CU_ADD_TEST(suite, test_identify_ctrlr);
CU_ADD_TEST(suite, test_custom_admin_cmd);
CU_ADD_TEST(suite, test_fused_compare_and_write);
CU_ADD_TEST(suite, test_multi_async_event_reqs);
allocate_threads(1);
set_thread(0);