From acfd87ca963b97bc595843544a688284189b6432 Mon Sep 17 00:00:00 2001 From: xiaoxiangxzhang Date: Fri, 15 Apr 2022 18:50:54 +0800 Subject: [PATCH] UT/nvmf_ctrlr:test for get/set features_host_behavior_support Signed-off-by: xiaoxiangxzhang Change-Id: I3b23d11d8dd2be6f260b5be6d92afe8116cbc0c8 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12287 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris Reviewed-by: GangCao --- test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c | 129 ++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index 1429a7960..e09f63c8c 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -2765,6 +2765,133 @@ test_nvmf_property_set(void) CU_ASSERT(req.rsp->prop_get_rsp.value.u64 == 0xDDADBEEF); } +static void +test_nvmf_ctrlr_get_features_host_behavior_support(void) +{ + int rc; + struct spdk_nvmf_request req = {}; + struct spdk_nvmf_qpair qpair = {}; + struct spdk_nvmf_ctrlr ctrlr = {}; + struct spdk_nvme_host_behavior *host_behavior; + struct spdk_nvme_host_behavior behavior = {}; + union nvmf_h2c_msg cmd = {}; + union nvmf_c2h_msg rsp = {}; + + qpair.ctrlr = &ctrlr; + req.qpair = &qpair; + req.cmd = &cmd; + req.rsp = &rsp; + + /* Invalid data */ + req.data = NULL; + req.length = sizeof(struct spdk_nvme_host_behavior); + + rc = nvmf_ctrlr_get_features_host_behavior_support(&req); + CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); + CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); + CU_ASSERT(req.data == NULL); + + /* Wrong structure length */ + req.data = &behavior; + req.length = sizeof(struct spdk_nvme_host_behavior) - 1; + + rc = nvmf_ctrlr_get_features_host_behavior_support(&req); + CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); + CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); + + /* Get Features Host Behavior Support Success */ + req.data = &behavior; + req.length = sizeof(struct spdk_nvme_host_behavior); + ctrlr.acre_enabled = true; + host_behavior = (struct spdk_nvme_host_behavior *)req.data; + host_behavior->acre = false; + + rc = nvmf_ctrlr_get_features_host_behavior_support(&req); + CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(host_behavior->acre == true); +} + +static void +test_nvmf_ctrlr_set_features_host_behavior_support(void) +{ + int rc; + struct spdk_nvmf_request req = {}; + struct spdk_nvmf_qpair qpair = {}; + struct spdk_nvmf_ctrlr ctrlr = {}; + struct spdk_nvme_host_behavior host_behavior = {}; + union nvmf_h2c_msg cmd = {}; + union nvmf_c2h_msg rsp = {}; + + qpair.ctrlr = &ctrlr; + req.qpair = &qpair; + req.cmd = &cmd; + req.rsp = &rsp; + req.iov[0].iov_base = &host_behavior; + req.iov[0].iov_len = sizeof(host_behavior); + + /* Invalid iovcnt */ + req.iovcnt = 0; + rc = SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; + req.rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; + req.rsp->nvme_cpl.status.sc = SPDK_NVME_SC_SUCCESS; + + rc = nvmf_ctrlr_set_features_host_behavior_support(&req); + CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); + CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); + + /* Invalid iov_len */ + req.iovcnt = 1; + req.iov[0].iov_len = 0; + rc = SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; + req.rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; + req.rsp->nvme_cpl.status.sc = SPDK_NVME_SC_SUCCESS; + + rc = nvmf_ctrlr_set_features_host_behavior_support(&req); + CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); + CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); + + /* acre is false */ + host_behavior.acre = 0; + req.iov[0].iov_len = sizeof(struct spdk_nvme_host_behavior); + rc = SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; + req.rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; + req.rsp->nvme_cpl.status.sc = SPDK_NVME_SC_SUCCESS; + + rc = nvmf_ctrlr_set_features_host_behavior_support(&req); + CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); + CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_SUCCESS); + CU_ASSERT(ctrlr.acre_enabled == false); + + /* acre is true */ + host_behavior.acre = 1; + req.iov[0].iov_len = sizeof(struct spdk_nvme_host_behavior); + rc = SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; + req.rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; + req.rsp->nvme_cpl.status.sc = SPDK_NVME_SC_SUCCESS; + + rc = nvmf_ctrlr_set_features_host_behavior_support(&req); + CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); + CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_SUCCESS); + CU_ASSERT(ctrlr.acre_enabled == true); + + /* Invalid acre */ + host_behavior.acre = 2; + rc = SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; + req.rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; + req.rsp->nvme_cpl.status.sc = SPDK_NVME_SC_SUCCESS; + + rc = nvmf_ctrlr_set_features_host_behavior_support(&req); + CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); + CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); + CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); +} + int main(int argc, char **argv) { CU_pSuite suite = NULL; @@ -2800,6 +2927,8 @@ int main(int argc, char **argv) CU_ADD_TEST(suite, test_zcopy_read); CU_ADD_TEST(suite, test_zcopy_write); CU_ADD_TEST(suite, test_nvmf_property_set); + CU_ADD_TEST(suite, test_nvmf_ctrlr_get_features_host_behavior_support); + CU_ADD_TEST(suite, test_nvmf_ctrlr_set_features_host_behavior_support); allocate_threads(1); set_thread(0);