ut/scsi/lun: clean up old stubs, simplify

The SCSI LUN unit test was still stubbing spdk_spdk_get_task(), which
doesn't exist anymore.  Replace it with a unit test helper function to
initialize a task, and remove the unnecessary heap allocation by putting
the tasks on the stack.

While we're here, clarify which tests should result in the task
completion function getting called by removing the (unnecessary)
spdk_scsi_task_put() calls.

Change-Id: If2b7983a66611131e6a1547dbfed2ad869bdb6e8
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/376266
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Daniel Verkamp 2017-08-29 16:32:19 -07:00 committed by Jim Harris
parent 70c3e1f2eb
commit f9958316d8

View File

@ -78,32 +78,25 @@ void spdk_trace_record(uint16_t tpoint_id, uint16_t poller_id, uint32_t size,
static void
spdk_lun_ut_cpl_task(struct spdk_scsi_task *task)
{
SPDK_CU_ASSERT_FATAL(g_task_count > 0);
g_task_count--;
}
static void
spdk_lun_ut_free_task(struct spdk_scsi_task *task)
{
free(task);
SPDK_CU_ASSERT_FATAL(g_task_count > 0);
g_task_count--;
/* This should never get called since we never call spdk_scsi_task_put(). */
SPDK_CU_ASSERT_FATAL(0);
}
static struct spdk_scsi_task *
spdk_get_task(uint32_t *owner_task_ctr)
static void
ut_init_task(struct spdk_scsi_task *task)
{
struct spdk_scsi_task *task;
task = calloc(1, sizeof(*task));
if (!task) {
return NULL;
}
memset(task, 0, sizeof(*task));
spdk_scsi_task_construct(task, spdk_lun_ut_cpl_task,
spdk_lun_ut_free_task,
NULL);
g_task_count++;
return task;
}
void *
@ -201,10 +194,6 @@ spdk_put_io_channel(struct spdk_io_channel *ch)
{
}
void spdk_event_call(struct spdk_event *event)
{
}
static _spdk_scsi_lun *
lun_construct(void)
{
@ -242,17 +231,15 @@ lun_task_mgmt_execute_null_task(void)
static void
lun_task_mgmt_execute_abort_task_null_lun_failure(void)
{
struct spdk_scsi_task *mgmt_task;
struct spdk_scsi_task mgmt_task = { 0 };
struct spdk_scsi_port initiator_port = { 0 };
int rc;
mgmt_task = spdk_get_task(NULL);
mgmt_task->lun = NULL;
mgmt_task->initiator_port = &initiator_port;
ut_init_task(&mgmt_task);
mgmt_task.lun = NULL;
mgmt_task.initiator_port = &initiator_port;
rc = spdk_scsi_lun_task_mgmt_execute(mgmt_task, SPDK_SCSI_TASK_FUNC_ABORT_TASK);
spdk_scsi_task_put(mgmt_task);
rc = spdk_scsi_lun_task_mgmt_execute(&mgmt_task, SPDK_SCSI_TASK_FUNC_ABORT_TASK);
/* returns -1 since we passed NULL for LUN */
CU_ASSERT_TRUE(rc < 0);
@ -263,8 +250,8 @@ static void
lun_task_mgmt_execute_abort_task_not_supported(void)
{
struct spdk_scsi_lun *lun;
struct spdk_scsi_task *task;
struct spdk_scsi_task *mgmt_task;
struct spdk_scsi_task task = { 0 };
struct spdk_scsi_task mgmt_task = { 0 };
struct spdk_scsi_port initiator_port = { 0 };
struct spdk_scsi_dev dev = { 0 };
uint8_t cdb[6] = { 0 };
@ -273,16 +260,16 @@ lun_task_mgmt_execute_abort_task_not_supported(void)
lun = lun_construct();
lun->dev = &dev;
mgmt_task = spdk_get_task(NULL);
mgmt_task->lun = lun;
mgmt_task->initiator_port = &initiator_port;
ut_init_task(&mgmt_task);
mgmt_task.lun = lun;
mgmt_task.initiator_port = &initiator_port;
/* Params to add regular task to the lun->tasks */
task = spdk_get_task(NULL);
task->lun = lun;
task->cdb = cdb;
ut_init_task(&task);
task.lun = lun;
task.cdb = cdb;
spdk_scsi_lun_append_task(lun, task);
spdk_scsi_lun_append_task(lun, &task);
/* task should now be on the pending_task list */
CU_ASSERT(!TAILQ_EMPTY(&lun->pending_tasks));
@ -292,38 +279,35 @@ lun_task_mgmt_execute_abort_task_not_supported(void)
/* task should now be on the tasks list */
CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
rc = spdk_scsi_lun_task_mgmt_execute(mgmt_task, SPDK_SCSI_TASK_FUNC_ABORT_TASK);
rc = spdk_scsi_lun_task_mgmt_execute(&mgmt_task, SPDK_SCSI_TASK_FUNC_ABORT_TASK);
/* returns -1 since task abort is not supported */
CU_ASSERT_TRUE(rc < 0);
CU_ASSERT(mgmt_task->response == SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED);
spdk_scsi_task_put(mgmt_task);
spdk_scsi_task_put(task);
CU_ASSERT(mgmt_task.response == SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED);
lun_destruct(lun);
CU_ASSERT_EQUAL(g_task_count, 0);
/* task is still on the tasks list */
CU_ASSERT_EQUAL(g_task_count, 1);
g_task_count = 0;
}
static void
lun_task_mgmt_execute_abort_task_all_null_lun_failure(void)
{
struct spdk_scsi_task *mgmt_task;
struct spdk_scsi_task mgmt_task = { 0 };
struct spdk_scsi_port initiator_port = { 0 };
int rc;
mgmt_task = spdk_get_task(NULL);
mgmt_task->lun = NULL;
mgmt_task->initiator_port = &initiator_port;
ut_init_task(&mgmt_task);
mgmt_task.lun = NULL;
mgmt_task.initiator_port = &initiator_port;
rc = spdk_scsi_lun_task_mgmt_execute(mgmt_task, SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET);
rc = spdk_scsi_lun_task_mgmt_execute(&mgmt_task, SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET);
/* Returns -1 since we passed NULL for lun */
CU_ASSERT_TRUE(rc < 0);
spdk_scsi_task_put(mgmt_task);
CU_ASSERT_EQUAL(g_task_count, 0);
}
@ -331,8 +315,8 @@ static void
lun_task_mgmt_execute_abort_task_all_not_supported(void)
{
struct spdk_scsi_lun *lun;
struct spdk_scsi_task *task;
struct spdk_scsi_task *mgmt_task;
struct spdk_scsi_task task = { 0 };
struct spdk_scsi_task mgmt_task = { 0 };
struct spdk_scsi_port initiator_port = { 0 };
struct spdk_scsi_dev dev = { 0 };
int rc;
@ -341,17 +325,17 @@ lun_task_mgmt_execute_abort_task_all_not_supported(void)
lun = lun_construct();
lun->dev = &dev;
mgmt_task = spdk_get_task(NULL);
mgmt_task->lun = lun;
mgmt_task->initiator_port = &initiator_port;
ut_init_task(&mgmt_task);
mgmt_task.lun = lun;
mgmt_task.initiator_port = &initiator_port;
/* Params to add regular task to the lun->tasks */
task = spdk_get_task(NULL);
task->initiator_port = &initiator_port;
task->lun = lun;
task->cdb = cdb;
ut_init_task(&task);
task.initiator_port = &initiator_port;
task.lun = lun;
task.cdb = cdb;
spdk_scsi_lun_append_task(lun, task);
spdk_scsi_lun_append_task(lun, &task);
/* task should now be on the pending_task list */
CU_ASSERT(!TAILQ_EMPTY(&lun->pending_tasks));
@ -361,36 +345,33 @@ lun_task_mgmt_execute_abort_task_all_not_supported(void)
/* task should now be on the tasks list */
CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
rc = spdk_scsi_lun_task_mgmt_execute(mgmt_task, SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET);
rc = spdk_scsi_lun_task_mgmt_execute(&mgmt_task, SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET);
/* returns -1 since task abort is not supported */
CU_ASSERT_TRUE(rc < 0);
CU_ASSERT(mgmt_task->response == SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED);
spdk_scsi_task_put(mgmt_task);
spdk_scsi_task_put(task);
CU_ASSERT(mgmt_task.response == SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED);
lun_destruct(lun);
CU_ASSERT_EQUAL(g_task_count, 0);
/* task is still on the tasks list */
CU_ASSERT_EQUAL(g_task_count, 1);
g_task_count = 0;
}
static void
lun_task_mgmt_execute_lun_reset_failure(void)
{
struct spdk_scsi_task *mgmt_task;
struct spdk_scsi_task mgmt_task = { 0 };
int rc;
mgmt_task = spdk_get_task(NULL);
mgmt_task->lun = NULL;
ut_init_task(&mgmt_task);
mgmt_task.lun = NULL;
rc = spdk_scsi_lun_task_mgmt_execute(mgmt_task, SPDK_SCSI_TASK_FUNC_LUN_RESET);
rc = spdk_scsi_lun_task_mgmt_execute(&mgmt_task, SPDK_SCSI_TASK_FUNC_LUN_RESET);
/* Returns -1 since we passed NULL for lun */
CU_ASSERT_TRUE(rc < 0);
spdk_scsi_task_put(mgmt_task);
CU_ASSERT_EQUAL(g_task_count, 0);
}
@ -398,48 +379,46 @@ static void
lun_task_mgmt_execute_lun_reset(void)
{
struct spdk_scsi_lun *lun;
struct spdk_scsi_task *mgmt_task;
struct spdk_scsi_task mgmt_task = { 0 };
struct spdk_scsi_dev dev = { 0 };
int rc;
lun = lun_construct();
lun->dev = &dev;
mgmt_task = spdk_get_task(NULL);
mgmt_task->lun = lun;
ut_init_task(&mgmt_task);
mgmt_task.lun = lun;
rc = spdk_scsi_lun_task_mgmt_execute(mgmt_task, SPDK_SCSI_TASK_FUNC_LUN_RESET);
rc = spdk_scsi_lun_task_mgmt_execute(&mgmt_task, SPDK_SCSI_TASK_FUNC_LUN_RESET);
/* Returns success */
CU_ASSERT_EQUAL(rc, 0);
spdk_scsi_task_put(mgmt_task);
lun_destruct(lun);
CU_ASSERT_EQUAL(g_task_count, 0);
/* task is still on the tasks list */
CU_ASSERT_EQUAL(g_task_count, 1);
g_task_count = 0;
}
static void
lun_task_mgmt_execute_invalid_case(void)
{
struct spdk_scsi_lun *lun;
struct spdk_scsi_task *mgmt_task;
struct spdk_scsi_task mgmt_task = { 0 };
struct spdk_scsi_dev dev = { 0 };
int rc;
lun = lun_construct();
lun->dev = &dev;
mgmt_task = spdk_get_task(NULL);
ut_init_task(&mgmt_task);
/* Pass an invalid value to the switch statement */
rc = spdk_scsi_lun_task_mgmt_execute(mgmt_task, 5);
rc = spdk_scsi_lun_task_mgmt_execute(&mgmt_task, 5);
/* Returns -1 on passing an invalid value to the switch case */
CU_ASSERT_TRUE(rc < 0);
spdk_scsi_task_put(mgmt_task);
lun_destruct(lun);
CU_ASSERT_EQUAL(g_task_count, 0);
@ -448,87 +427,89 @@ lun_task_mgmt_execute_invalid_case(void)
static void
lun_append_task_null_lun_task_cdb_spc_inquiry(void)
{
struct spdk_scsi_task *task;
struct spdk_scsi_task task = { 0 };
uint8_t cdb[6] = { 0 };
task = spdk_get_task(NULL);
task->cdb = cdb;
task->cdb[0] = SPDK_SPC_INQUIRY;
ut_init_task(&task);
task.cdb = cdb;
task.cdb[0] = SPDK_SPC_INQUIRY;
/* alloc_len >= 4096 */
task->cdb[3] = 0xFF;
task->cdb[4] = 0xFF;
task->lun = NULL;
task.cdb[3] = 0xFF;
task.cdb[4] = 0xFF;
task.lun = NULL;
spdk_scsi_task_process_null_lun(task);
spdk_scsi_task_process_null_lun(&task);
CU_ASSERT_EQUAL(task->status, SPDK_SCSI_STATUS_GOOD);
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD);
spdk_scsi_task_put(task);
spdk_scsi_task_free_data(&task);
CU_ASSERT_EQUAL(g_task_count, 0);
/* spdk_scsi_task_process_null_lun() does not call cpl_fn */
CU_ASSERT_EQUAL(g_task_count, 1);
g_task_count = 0;
}
static void
lun_append_task_null_lun_alloc_len_lt_4096(void)
{
struct spdk_scsi_task *task;
struct spdk_scsi_task task = { 0 };
uint8_t cdb[6] = { 0 };
task = spdk_get_task(NULL);
task->cdb = cdb;
task->cdb[0] = SPDK_SPC_INQUIRY;
ut_init_task(&task);
task.cdb = cdb;
task.cdb[0] = SPDK_SPC_INQUIRY;
/* alloc_len < 4096 */
task->cdb[3] = 0;
task->cdb[4] = 0;
task.cdb[3] = 0;
task.cdb[4] = 0;
/* alloc_len is set to a minimal value of 4096
* Hence, buf of size 4096 is allocated */
spdk_scsi_task_process_null_lun(task);
spdk_scsi_task_process_null_lun(&task);
CU_ASSERT_EQUAL(task->status, SPDK_SCSI_STATUS_GOOD);
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD);
spdk_scsi_task_put(task);
CU_ASSERT_EQUAL(g_task_count, 0);
/* spdk_scsi_task_process_null_lun() does not call cpl_fn */
CU_ASSERT_EQUAL(g_task_count, 1);
g_task_count = 0;
}
static void
lun_append_task_null_lun_not_supported(void)
{
struct spdk_scsi_task *task;
struct spdk_scsi_task task = { 0 };
uint8_t cdb[6] = { 0 };
task = spdk_get_task(NULL);
task->cdb = cdb;
task->lun = NULL;
ut_init_task(&task);
task.cdb = cdb;
task.lun = NULL;
spdk_scsi_task_process_null_lun(task);
spdk_scsi_task_process_null_lun(&task);
CU_ASSERT_EQUAL(task->status, SPDK_SCSI_STATUS_CHECK_CONDITION);
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
/* LUN not supported; task's data transferred should be 0 */
CU_ASSERT_EQUAL(task->data_transferred, 0);
CU_ASSERT_EQUAL(task.data_transferred, 0);
spdk_scsi_task_put(task);
CU_ASSERT_EQUAL(g_task_count, 0);
/* spdk_scsi_task_process_null_lun() does not call cpl_fn */
CU_ASSERT_EQUAL(g_task_count, 1);
g_task_count = 0;
}
static void
lun_execute_scsi_task_pending(void)
{
struct spdk_scsi_lun *lun;
struct spdk_scsi_task *task;
struct spdk_scsi_task task = { 0 };
struct spdk_scsi_dev dev = { 0 };
lun = lun_construct();
task = spdk_get_task(NULL);
task->lun = lun;
ut_init_task(&task);
task.lun = lun;
lun->dev = &dev;
g_lun_execute_fail = false;
g_lun_execute_status = SPDK_SCSI_TASK_PENDING;
spdk_scsi_lun_append_task(lun, task);
spdk_scsi_lun_append_task(lun, &task);
/* task should now be on the pending_task list */
CU_ASSERT(!TAILQ_EMPTY(&lun->pending_tasks));
@ -543,30 +524,30 @@ lun_execute_scsi_task_pending(void)
/* Assert the task has been successfully added to the tasks queue */
CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
spdk_scsi_task_put(task);
lun_destruct(lun);
CU_ASSERT_EQUAL(g_task_count, 0);
/* task is still on the tasks list */
CU_ASSERT_EQUAL(g_task_count, 1);
g_task_count = 0;
}
static void
lun_execute_scsi_task_complete(void)
{
struct spdk_scsi_lun *lun;
struct spdk_scsi_task *task;
struct spdk_scsi_task task = { 0 };
struct spdk_scsi_dev dev = { 0 };
lun = lun_construct();
task = spdk_get_task(NULL);
task->lun = lun;
ut_init_task(&task);
task.lun = lun;
lun->dev = &dev;
g_lun_execute_fail = false;
g_lun_execute_status = SPDK_SCSI_TASK_COMPLETE;
spdk_scsi_lun_append_task(lun, task);
spdk_scsi_lun_append_task(lun, &task);
/* task should now be on the pending_task list */
CU_ASSERT(!TAILQ_EMPTY(&lun->pending_tasks));
@ -581,8 +562,6 @@ lun_execute_scsi_task_complete(void)
/* Assert the task has not been added to the tasks queue */
CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
spdk_scsi_task_put(task);
lun_destruct(lun);
CU_ASSERT_EQUAL(g_task_count, 0);