Commit acfd87ca authored by xiaoxiangxzhang's avatar xiaoxiangxzhang Committed by Tomasz Zawadzki
Browse files

UT/nvmf_ctrlr:test for get/set features_host_behavior_support



Signed-off-by: default avatarxiaoxiangxzhang <xiaoxiangx.zhang@intel.com>
Change-Id: I3b23d11d8dd2be6f260b5be6d92afe8116cbc0c8
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12287


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarGangCao <gang.cao@intel.com>
parent 1a14eb4e
Loading
Loading
Loading
Loading
+129 −0
Original line number Diff line number Diff line
@@ -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);