Commit d6e0bbee authored by Mao Jiang's avatar Mao Jiang Committed by Tomasz Zawadzki
Browse files

test/nvmf/ctrlr_bdev: cases for ctrlr cmd



Change-Id: Idcadca62542c24c205e295e48a763a6d50e2abc7
Signed-off-by: default avatarMao Jiang <maox.jiang@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8564


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarZiye Yang <ziye.yang@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatar <dongx.yi@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
parent 2ddc2b3c
Loading
Loading
Loading
Loading
+104 −0
Original line number Diff line number Diff line
@@ -610,6 +610,109 @@ test_nvmf_bdev_ctrlr_start_zcopy(void)
	CU_ASSERT(rc < 0);
}

static void
test_nvmf_bdev_ctrlr_cmd(void)
{
	int rc;
	struct spdk_bdev bdev = {};
	struct spdk_io_channel ch = {};
	struct spdk_nvmf_request req = {};
	struct spdk_nvmf_qpair qpair = {};
	union nvmf_h2c_msg cmd = {};
	union nvmf_c2h_msg rsp = {};

	req.cmd = &cmd;
	req.rsp = &rsp;
	req.qpair = &qpair;
	req.length = 4096;
	bdev.blocklen = 512;
	bdev.blockcnt = 3;
	cmd.nvme_cmd.cdw10 = 0;
	cmd.nvme_cmd.cdw12 = 2;

	/* Compare status asynchronous */
	rc = nvmf_bdev_ctrlr_compare_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS);

	/* SLBA out of range */
	cmd.nvme_cmd.cdw10 = 3;

	rc = nvmf_bdev_ctrlr_compare_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
	CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC);
	CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_LBA_OUT_OF_RANGE);

	/* SGL length invalid */
	cmd.nvme_cmd.cdw10 = 0;
	req.length = 512;
	memset(&rsp, 0, sizeof(rsp));

	rc = nvmf_bdev_ctrlr_compare_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
	CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC);
	CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID);

	/* Device error */
	req.length = 4096;
	memset(&rsp, 0, sizeof(rsp));
	MOCK_SET(spdk_bdev_comparev_blocks, -1);

	rc = nvmf_bdev_ctrlr_compare_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
	CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC);
	CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INTERNAL_DEVICE_ERROR);

	/* bdev not support flush */
	MOCK_SET(spdk_bdev_io_type_supported, false);
	memset(&rsp, 0, sizeof(rsp));

	rc = nvmf_bdev_ctrlr_flush_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
	CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC);
	CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_SUCCESS);

	/*  Flush error */
	MOCK_SET(spdk_bdev_io_type_supported, true);
	MOCK_SET(spdk_bdev_flush_blocks, -1);
	memset(&rsp, 0, sizeof(rsp));

	rc = nvmf_bdev_ctrlr_flush_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
	CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC);
	CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INTERNAL_DEVICE_ERROR);

	/* Flush blocks status asynchronous */
	MOCK_SET(spdk_bdev_flush_blocks, 0);

	rc = nvmf_bdev_ctrlr_flush_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS);
	MOCK_CLEAR(spdk_bdev_io_type_supported);
	MOCK_CLEAR(spdk_bdev_flush_blocks);

	/* Write zeroes blocks status asynchronous */
	rc = nvmf_bdev_ctrlr_write_zeroes_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS);

	/* SLBA out of range */
	cmd.nvme_cmd.cdw10 = 3;
	memset(&rsp, 0, sizeof(rsp));

	rc = nvmf_bdev_ctrlr_write_zeroes_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
	CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC);
	CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_LBA_OUT_OF_RANGE);

	/* Write block error */
	MOCK_SET(spdk_bdev_write_zeroes_blocks, -1);
	cmd.nvme_cmd.cdw10 = 0;
	memset(&rsp, 0, sizeof(rsp));

	rc = nvmf_bdev_ctrlr_write_zeroes_cmd(&bdev, NULL, &ch, &req);
	CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
	CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC);
	CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INTERNAL_DEVICE_ERROR);
}

int main(int argc, char **argv)
{
	CU_pSuite	suite = NULL;
@@ -626,6 +729,7 @@ int main(int argc, char **argv)
	CU_ADD_TEST(suite, test_nvmf_bdev_ctrlr_identify_ns);
	CU_ADD_TEST(suite, test_spdk_nvmf_bdev_ctrlr_compare_and_write_cmd);
	CU_ADD_TEST(suite, test_nvmf_bdev_ctrlr_start_zcopy);
	CU_ADD_TEST(suite, test_nvmf_bdev_ctrlr_cmd);

	CU_basic_set_mode(CU_BRM_VERBOSE);
	CU_basic_run_tests();