TEST: try to make 0410 nicer
0410 is the first test for the MMC commandset. This commandset is in hindsight a bit more complex than other commandsets in that we have to handle quite a lot of cases : 1, if it is not a MMC device, we should check we get INVALID_OPCODE and then bail. Then if it is a MMC device, there are at least three different cases we have to handle: 2.a If there is no medium in the device 2.b there is media, but the medium is blank 2.c there is readable medium this makes MMC tests a lot more complex than other commandsets so we have to try to get this one as nice and simple as possible so we can reuse this test as the framework when adding other MMC tests. (even the 2.b test is not 100% right, since if the medium is BR, then a blank disk will fail with sense, but blank pre-BD mediums will not fail the READTOC command)
This commit is contained in:
@@ -29,16 +29,20 @@ int T0410_readtoc_basic(const char *initiator, const char *url, int data_loss, i
|
||||
struct scsi_inquiry_standard *inq;
|
||||
struct scsi_readcapacity10 *rc10;
|
||||
struct scsi_readtoc_list *list, *list1;
|
||||
int ret, lun, i, toc_device;
|
||||
int media, full_size;
|
||||
int ret, lun, i, toc_device, full_size;
|
||||
int is_blank = 0;
|
||||
int no_medium = 0;
|
||||
|
||||
printf("0410_readtoc_basic:\n");
|
||||
printf("===================\n");
|
||||
if (show_info) {
|
||||
printf("Test Read TOC command.\n");
|
||||
printf(" If device does not support, just verify appropriate error returned\n");
|
||||
printf("1, Check we can read the TOC: track 0, non-MSF.\n");
|
||||
printf("1, Verify we can read the TOC: track 0, non-MSF. (non-MMC devices should return sense)\n");
|
||||
printf("2, Make sure at least 4 bytes returned as header.\n");
|
||||
printf("3, Verify we can read the TOC: track 1, non-MSF.\n");
|
||||
printf("4, Make sure at least 4 bytes returned as header.\n");
|
||||
printf("5, Verify track 0 and 1 both returned the same data.\n");
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -52,6 +56,7 @@ int T0410_readtoc_basic(const char *initiator, const char *url, int data_loss, i
|
||||
|
||||
ret = 0;
|
||||
|
||||
|
||||
printf("Read standard INQUIRY data ... ");
|
||||
/* Submit INQUIRY so we can find out the device type */
|
||||
task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 255);
|
||||
@@ -92,22 +97,25 @@ int T0410_readtoc_basic(const char *initiator, const char *url, int data_loss, i
|
||||
|
||||
printf("Check device-type is either of DISK, TAPE or CD/DVD ... ");
|
||||
switch (inq->device_type) {
|
||||
case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_MMC:
|
||||
toc_device = 1;
|
||||
break;
|
||||
case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS:
|
||||
case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_SEQUENTIAL_ACCESS:
|
||||
toc_device = 0;
|
||||
break;
|
||||
case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_MMC:
|
||||
toc_device = 1;
|
||||
break;
|
||||
default:
|
||||
printf("[FAILED]\n");
|
||||
printf("Device-type is not DISK, TAPE or CD/DVD. Device reported:%s\n", scsi_devtype_to_str(inq->device_type));
|
||||
ret = -1;
|
||||
/* Unknown device type */
|
||||
printf("[SKIPPED]\n");
|
||||
printf("This test is only available on SBC/SBC/SSC devices\n");
|
||||
ret = -2;
|
||||
goto finished;
|
||||
}
|
||||
scsi_free_scsi_task(task);
|
||||
printf("[OK]\n");
|
||||
|
||||
printf("CD/DVD Device. Check if media present.\n");
|
||||
|
||||
printf("CD/DVD Device. Check if medium present ... ");
|
||||
task = iscsi_readcapacity10_sync(iscsi, lun, 0, 0);
|
||||
if (task == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
@@ -115,108 +123,127 @@ int T0410_readtoc_basic(const char *initiator, const char *url, int data_loss, i
|
||||
ret = -1;
|
||||
goto finished;
|
||||
}
|
||||
if (task->status != SCSI_STATUS_GOOD) {
|
||||
if (task->status == SCSI_STATUS_GOOD) {
|
||||
rc10 = scsi_datain_unmarshall(task);
|
||||
if (rc10 == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
printf("failed to unmarshall readcapacity10 data. %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
goto finished;
|
||||
}
|
||||
/* LBA will return 0, if the medium is blank. */
|
||||
is_blank = rc10->lba ? 0 : 1;
|
||||
}
|
||||
/* If we get 'medium not present' there is no medium in the drive */
|
||||
if (task->status == SCSI_STATUS_CHECK_CONDITION
|
||||
&& task->sense.key == SCSI_SENSE_NOT_READY
|
||||
&& (task->sense.ascq == SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT
|
||||
|| task->sense.ascq == SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_OPEN
|
||||
|| task->sense.ascq == SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_CLOSED)) {
|
||||
no_medium = 1;
|
||||
printf("[OK]\n");
|
||||
printf("No medium in drive. Medium access commands should fail\n");
|
||||
goto test1;
|
||||
} else if (task->status != SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("Readcapacity command: failed with sense. %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
goto finished;
|
||||
}
|
||||
rc10 = scsi_datain_unmarshall(task);
|
||||
if (rc10 == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
printf("failed to unmarshall readcapacity10 data. %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
goto finished;
|
||||
|
||||
scsi_free_scsi_task(task);
|
||||
|
||||
printf("[OK]\n");
|
||||
if (is_blank) {
|
||||
printf("Blank disk loaded. ReadTOC should fail.\n");
|
||||
} else {
|
||||
printf("There is a disk in the drive. ReadTOC should work.\n");
|
||||
}
|
||||
|
||||
/* LBA will return 0, if there is no media. */
|
||||
media = rc10->lba ? 1 : 0;
|
||||
|
||||
|
||||
test1:
|
||||
|
||||
printf("Read TOC format 0000b (TOC)\n");
|
||||
if (toc_device) {
|
||||
printf(" On MMC Device\n");
|
||||
} else {
|
||||
printf(" On non-MMC Device\n");
|
||||
}
|
||||
printf("Verify we can READTOC format 0000b (TOC) track 0 (%s) ... ",
|
||||
toc_device ? "On MMC Device" : "On non-MMC Device"
|
||||
);
|
||||
|
||||
task = iscsi_readtoc_sync(iscsi, lun, 0, 0, 0, 255);
|
||||
if (task == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
printf("Failed to send READ TOC command : %s\n", iscsi_get_error(iscsi));
|
||||
printf("Failed to send READTOC command : %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
goto finished;
|
||||
}
|
||||
|
||||
|
||||
/* If no medium, just check if we have appropriate error and bail. */
|
||||
if (no_medium) {
|
||||
if (task->status == SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("READTOC Should have failed since no medium is loaded.\n");
|
||||
scsi_free_scsi_task(task);
|
||||
ret = -1;
|
||||
goto finished;
|
||||
}
|
||||
|
||||
if (task->status != SCSI_STATUS_CHECK_CONDITION
|
||||
|| task->sense.key != SCSI_SENSE_NOT_READY
|
||||
|| (task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT && task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_OPEN
|
||||
&& task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_CLOSED)) {
|
||||
printf("[FAILED]\n");
|
||||
printf("READTOC failed but ascq was wrong. Should "
|
||||
"have failed with MEDIUM_NOT_PRESENT. "
|
||||
"Sense:%s\n", iscsi_get_error(iscsi));
|
||||
scsi_free_scsi_task(task);
|
||||
ret = -1;
|
||||
goto finished;
|
||||
}
|
||||
|
||||
printf("[OK]\n");
|
||||
printf("No disk, we got the correct sense code that medium is not present. Skipping the remainder of the test\n");
|
||||
scsi_free_scsi_task(task);
|
||||
goto finished;
|
||||
}
|
||||
|
||||
|
||||
/* If this is a non-MMC device, just verify that that comand failed
|
||||
as expected and then bail */
|
||||
if (!toc_device) {
|
||||
if (task->status == SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("READ TOC Should have failed\n");
|
||||
printf("READTOC Should have failed\n");
|
||||
ret = -1;
|
||||
} else if (task->status != SCSI_STATUS_CHECK_CONDITION
|
||||
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|
||||
|| task->sense.ascq != SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) {
|
||||
printf("[FAILED]\n");
|
||||
printf("READ TOC failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/INVALID OPERATOR. Sense:%s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
} else {
|
||||
printf("[OK]\n");
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
scsi_free_scsi_task(task);
|
||||
goto finished;
|
||||
}
|
||||
|
||||
|
||||
/* If no media, just check if we have appropriate error and bail. */
|
||||
if (!media) {
|
||||
printf("No media, check we get appropriate error.\n");
|
||||
if (task->status == SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("READ TOC Should have failed\n");
|
||||
printf("READTOC failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/INVALID OPERATION_CODE. Sense:%s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
} else if (task->status != SCSI_STATUS_CHECK_CONDITION
|
||||
|| task->sense.key != SCSI_SENSE_NOT_READY
|
||||
|| (task->sense.ascq
|
||||
!= SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT
|
||||
&& task->sense.ascq
|
||||
!= SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_OPEN
|
||||
&& task->sense.ascq
|
||||
!= SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_CLOSED)) {
|
||||
printf("[FAILED]\n");
|
||||
printf("READ TOC failed but ascq was wrong. Should "
|
||||
"have failed with MEDIUM_NOT_PRESENT. "
|
||||
"Sense:%s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
} else {
|
||||
printf("[OK]\n");
|
||||
ret = 0;
|
||||
printf("Not an MMC device so READTOC failed as it should. Skipping rest of test\n");
|
||||
}
|
||||
|
||||
scsi_free_scsi_task(task);
|
||||
goto finished;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* We should only still be here if we are an MMC device and
|
||||
have media. */
|
||||
if (task->status != SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("READ TOC command failed : %s\n", iscsi_get_error(iscsi));
|
||||
printf("READTOC command failed : %s\n", iscsi_get_error(iscsi));
|
||||
scsi_free_scsi_task(task);
|
||||
ret = -1;
|
||||
goto finished;
|
||||
}
|
||||
printf("[OK]\n");
|
||||
|
||||
|
||||
|
||||
test2:
|
||||
/* If we get here, there is a disk loaded and it contains data */
|
||||
printf("Verify we got at least 4 bytes of data for track 0 ... ");
|
||||
full_size = scsi_datain_getfullsize(task);
|
||||
if (full_size < 4) {
|
||||
printf("[FAILED]\n");
|
||||
@@ -235,12 +262,13 @@ test2:
|
||||
}
|
||||
printf("[OK]\n");
|
||||
|
||||
|
||||
test3:
|
||||
printf("Check lba of 1 is same as lba 0\n");
|
||||
printf("Verify we can READTOC format 0000b (TOC) track 1 ... ");
|
||||
task1 = iscsi_readtoc_sync(iscsi, lun, 0, 1, 0, 255);
|
||||
if (task1 == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
printf("Failed to send READ TOC command : %s\n", iscsi_get_error(iscsi));
|
||||
printf("Failed to send READTOC command : %s\n", iscsi_get_error(iscsi));
|
||||
scsi_free_scsi_task(task);
|
||||
ret = -1;
|
||||
goto finished;
|
||||
@@ -248,14 +276,17 @@ test3:
|
||||
|
||||
if (task1->status != SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("READ TOC command failed : %s\n", iscsi_get_error(iscsi));
|
||||
printf("READTOC command failed : %s\n", iscsi_get_error(iscsi));
|
||||
scsi_free_scsi_task(task);
|
||||
scsi_free_scsi_task(task1);
|
||||
ret = -1;
|
||||
goto finished;
|
||||
}
|
||||
printf("[OK]\n");
|
||||
|
||||
|
||||
test4:
|
||||
printf("Verify we got at least 4 bytes of data for track 1 ... ");
|
||||
full_size = scsi_datain_getfullsize(task1);
|
||||
if (full_size < 4) {
|
||||
printf("[FAILED]\n");
|
||||
@@ -274,8 +305,10 @@ test3:
|
||||
ret = -1;
|
||||
goto finished;
|
||||
}
|
||||
scsi_free_scsi_task(task1);
|
||||
printf("[OK]\n");
|
||||
|
||||
test5:
|
||||
printf("Verify track 0 and 1 both returned the same data ... ");
|
||||
if (list->num != list1->num ||
|
||||
list->first != list1->first ||
|
||||
list->last != list1->last) {
|
||||
@@ -283,11 +316,11 @@ test3:
|
||||
printf("Read TOC header of lba 0 != TOC of lba 1.\n");
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
scsi_free_scsi_task(task1);
|
||||
goto finished;
|
||||
}
|
||||
|
||||
for (i=0; i<list->num; i++) {
|
||||
printf(" TOC descriptor %i\n", i);
|
||||
if (list->desc[i].desc.toc.adr != list1->desc[i].desc.toc.adr ||
|
||||
list->desc[i].desc.toc.control != list1->desc[i].desc.toc.control ||
|
||||
list->desc[i].desc.toc.track != list1->desc[i].desc.toc.track ||
|
||||
@@ -296,13 +329,13 @@ test3:
|
||||
printf("Read TOC descriptors of lba 0 != TOC of lba 1.\n");
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
scsi_free_scsi_task(task1);
|
||||
goto finished;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
printf("[OK]\n");
|
||||
scsi_free_scsi_task(task);
|
||||
scsi_free_scsi_task(task1);
|
||||
|
||||
|
||||
finished:
|
||||
|
||||
Reference in New Issue
Block a user