From b5804ee4992d0bc7f7a7d2cbbbe6a43b33195dd8 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Tue, 23 Apr 2013 21:29:25 -0700 Subject: [PATCH] TESTS: Update WRITE10/12 to allow it to fail with invalid operation code. Both these opcodes are Optional in all SBC standards. --- test-tool/iscsi-support.c | 71 ++++++++++++++++++++++++++++- test-tool/test_write10_0blocks.c | 5 ++ test-tool/test_write10_beyond_eol.c | 5 ++ test-tool/test_write10_flags.c | 5 ++ test-tool/test_write10_residuals.c | 7 +++ test-tool/test_write10_simple.c | 6 ++- test-tool/test_write10_wrprotect.c | 5 ++ test-tool/test_write12_0blocks.c | 5 ++ test-tool/test_write12_beyond_eol.c | 5 ++ test-tool/test_write12_flags.c | 5 ++ test-tool/test_write12_residuals.c | 7 +++ test-tool/test_write12_simple.c | 6 ++- test-tool/test_write12_wrprotect.c | 5 ++ 13 files changed, 134 insertions(+), 3 deletions(-) diff --git a/test-tool/iscsi-support.c b/test-tool/iscsi-support.c index 7689b24..d732c6c 100644 --- a/test-tool/iscsi-support.c +++ b/test-tool/iscsi-support.c @@ -968,7 +968,6 @@ verify_write_works(struct iscsi_context *iscsi, int lun, unsigned char *buf) iscsi_get_error(iscsi)); return -1; } - if (task->status != SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE10 command: failed with sense: %s", @@ -3394,6 +3393,13 @@ write10(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + return -2; + } if (task->status != SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE10 command: " "failed with sense. %s", iscsi_get_error(iscsi)); @@ -3432,6 +3438,13 @@ write10_invalidfieldincdb(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + return -2; + } if (task->status == SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE10 successful but should " "have failed with ILLEGAL_REQUEST/INVALID_FIELD_IN_CDB"); @@ -3480,6 +3493,13 @@ write10_lbaoutofrange(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + return -2; + } if (task->status == SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE10 successful but should " "have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE"); @@ -3527,6 +3547,13 @@ write10_writeprotected(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + return -2; + } if (task->status == SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE10 successful but should " "have failed with DATA_PROTECTION/WRITE_PROTECTED"); @@ -3575,6 +3602,13 @@ write10_nomedium(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + return -2; + } if (task->status == SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE10 successful but should " "have failed with NOT_READY/MEDIUM_NOT_PRESENT*"); @@ -3624,6 +3658,13 @@ write12(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + return -2; + } if (task->status != SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE12 command: " "failed with sense. %s", iscsi_get_error(iscsi)); @@ -3662,6 +3703,13 @@ write12_invalidfieldincdb(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + return -2; + } if (task->status == SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE12 successful but should " "have failed with ILLEGAL_REQUEST/INVALID_FIELD_IN_CDB"); @@ -3710,6 +3758,13 @@ write12_lbaoutofrange(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + return -2; + } if (task->status == SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE12 successful but should " "have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE"); @@ -3757,6 +3812,13 @@ write12_writeprotected(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + return -2; + } if (task->status == SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE12 successful but should " "have failed with DATA_PROTECTION/WRITE_PROTECTED"); @@ -3805,6 +3867,13 @@ write12_nomedium(struct iscsi_context *iscsi, int lun, uint32_t lba, iscsi_get_error(iscsi)); return -1; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + scsi_free_scsi_task(task); + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + return -2; + } if (task->status == SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITE12 successful but should " "have failed with NOT_READY/MEDIUM_NOT_PRESENT*"); diff --git a/test-tool/test_write10_0blocks.c b/test-tool/test_write10_0blocks.c index bfd1fea..426c850 100644 --- a/test-tool/test_write10_0blocks.c +++ b/test-tool/test_write10_0blocks.c @@ -44,6 +44,11 @@ test_write10_0blocks(void) logging(LOG_VERBOSE, "Test WRITE10 0-blocks one block past end-of-LUN"); ret = write10_lbaoutofrange(iscsic, tgt_lun, num_blocks + 1, 0, block_size, 0, 0, 0, 0, 0, NULL); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE16 is not implemented."); + CU_PASS("WRITE10 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); diff --git a/test-tool/test_write10_beyond_eol.c b/test-tool/test_write10_beyond_eol.c index 271e000..1c8c93e 100644 --- a/test-tool/test_write10_beyond_eol.c +++ b/test-tool/test_write10_beyond_eol.c @@ -45,6 +45,11 @@ test_write10_beyond_eol(void) i * block_size, block_size, 0, 0, 0, 0, 0, buf); free(buf); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + CU_PASS("WRITE10 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); } diff --git a/test-tool/test_write10_flags.c b/test-tool/test_write10_flags.c index cd40ec2..3d24c08 100644 --- a/test-tool/test_write10_flags.c +++ b/test-tool/test_write10_flags.c @@ -41,6 +41,11 @@ test_write10_flags(void) ret = write10(iscsic, tgt_lun, 0, block_size, block_size, 0, 1, 0, 0, 0, buf); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + CU_PASS("WRITE10 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); diff --git a/test-tool/test_write10_residuals.c b/test-tool/test_write10_residuals.c index 0c8e9b5..3c8c674 100644 --- a/test-tool/test_write10_residuals.c +++ b/test-tool/test_write10_residuals.c @@ -66,6 +66,13 @@ test_write10_residuals(void) CU_ASSERT_PTR_NOT_NULL(task_ret); CU_ASSERT_NOT_EQUAL(task->status, SCSI_STATUS_CANCELLED); /* XXX redundant? */ + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + CU_PASS("WRITE10 is not implemented."); + return; + } logging(LOG_VERBOSE, "Verify that the target returned SUCCESS"); if (task->status != SCSI_STATUS_GOOD) { logging(LOG_VERBOSE, "[FAILED] Target returned error %s", diff --git a/test-tool/test_write10_simple.c b/test-tool/test_write10_simple.c index 5845a22..e79edb8 100644 --- a/test-tool/test_write10_simple.c +++ b/test-tool/test_write10_simple.c @@ -1,4 +1,3 @@ - /* Copyright (C) 2013 Ronnie Sahlberg @@ -42,6 +41,11 @@ test_write10_simple(void) ret = write10(iscsic, tgt_lun, 0, i * block_size, block_size, 0, 0, 0, 0, 0, buf); free(buf); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + CU_PASS("WRITE10 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); } diff --git a/test-tool/test_write10_wrprotect.c b/test-tool/test_write10_wrprotect.c index 08f179c..683f1bd 100644 --- a/test-tool/test_write10_wrprotect.c +++ b/test-tool/test_write10_wrprotect.c @@ -44,6 +44,11 @@ test_write10_wrprotect(void) ret = write10_invalidfieldincdb(iscsic, tgt_lun, 0, block_size, block_size, i, 0, 0, 0, 0, buf); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE10 is not implemented."); + CU_PASS("WRITE10 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); } free(buf); diff --git a/test-tool/test_write12_0blocks.c b/test-tool/test_write12_0blocks.c index 4443ee1..ea720a8 100644 --- a/test-tool/test_write12_0blocks.c +++ b/test-tool/test_write12_0blocks.c @@ -39,6 +39,11 @@ test_write12_0blocks(void) logging(LOG_VERBOSE, "Test WRITE12 0-blocks at LBA==0"); ret = write12(iscsic, tgt_lun, 0, 0, block_size, 0, 0, 0, 0, 0, NULL); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + CU_PASS("WRITE12 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test WRITE12 0-blocks one block past end-of-LUN"); diff --git a/test-tool/test_write12_beyond_eol.c b/test-tool/test_write12_beyond_eol.c index d59dc7b..deb3f2e 100644 --- a/test-tool/test_write12_beyond_eol.c +++ b/test-tool/test_write12_beyond_eol.c @@ -45,6 +45,11 @@ test_write12_beyond_eol(void) i * block_size, block_size, 0, 0, 0, 0, 0, buf); free(buf); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + CU_PASS("WRITE12 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); } diff --git a/test-tool/test_write12_flags.c b/test-tool/test_write12_flags.c index 5013fa3..c212ed5 100644 --- a/test-tool/test_write12_flags.c +++ b/test-tool/test_write12_flags.c @@ -41,6 +41,11 @@ test_write12_flags(void) ret = write12(iscsic, tgt_lun, 0, block_size, block_size, 0, 1, 0, 0, 0, buf); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + CU_PASS("WRITE12 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); diff --git a/test-tool/test_write12_residuals.c b/test-tool/test_write12_residuals.c index 1126fbd..15ca5fb 100644 --- a/test-tool/test_write12_residuals.c +++ b/test-tool/test_write12_residuals.c @@ -66,6 +66,13 @@ test_write12_residuals(void) CU_ASSERT_PTR_NOT_NULL(task_ret); CU_ASSERT_NOT_EQUAL(task->status, SCSI_STATUS_CANCELLED); /* XXX redundant? */ + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + CU_PASS("WRITE12 is not implemented."); + return; + } logging(LOG_VERBOSE, "Verify that the target returned SUCCESS"); if (task->status != SCSI_STATUS_GOOD) { logging(LOG_VERBOSE, "[FAILED] Target returned error %s", diff --git a/test-tool/test_write12_simple.c b/test-tool/test_write12_simple.c index 9ef85a0..580d61b 100644 --- a/test-tool/test_write12_simple.c +++ b/test-tool/test_write12_simple.c @@ -1,4 +1,3 @@ - /* Copyright (C) 2013 Ronnie Sahlberg @@ -42,6 +41,11 @@ test_write12_simple(void) ret = write12(iscsic, tgt_lun, 0, i * block_size, block_size, 0, 0, 0, 0, 0, buf); free(buf); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + CU_PASS("WRITE12 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); } diff --git a/test-tool/test_write12_wrprotect.c b/test-tool/test_write12_wrprotect.c index b1bfef7..1bb7845 100644 --- a/test-tool/test_write12_wrprotect.c +++ b/test-tool/test_write12_wrprotect.c @@ -44,6 +44,11 @@ test_write12_wrprotect(void) ret = write12_invalidfieldincdb(iscsic, tgt_lun, 0, block_size, block_size, i, 0, 0, 0, 0, buf); + if (ret == -2) { + logging(LOG_NORMAL, "[SKIPPED] WRITE12 is not implemented."); + CU_PASS("WRITE12 is not implemented."); + return; + } CU_ASSERT_EQUAL(ret, 0); } free(buf);