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_inquiry_standard *inq;
|
||||||
struct scsi_readcapacity10 *rc10;
|
struct scsi_readcapacity10 *rc10;
|
||||||
struct scsi_readtoc_list *list, *list1;
|
struct scsi_readtoc_list *list, *list1;
|
||||||
int ret, lun, i, toc_device;
|
int ret, lun, i, toc_device, full_size;
|
||||||
int media, full_size;
|
int is_blank = 0;
|
||||||
|
int no_medium = 0;
|
||||||
|
|
||||||
printf("0410_readtoc_basic:\n");
|
printf("0410_readtoc_basic:\n");
|
||||||
printf("===================\n");
|
printf("===================\n");
|
||||||
if (show_info) {
|
if (show_info) {
|
||||||
printf("Test Read TOC command.\n");
|
printf("Test Read TOC command.\n");
|
||||||
printf(" If device does not support, just verify appropriate error returned\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("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");
|
printf("\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -52,6 +56,7 @@ int T0410_readtoc_basic(const char *initiator, const char *url, int data_loss, i
|
|||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
|
|
||||||
printf("Read standard INQUIRY data ... ");
|
printf("Read standard INQUIRY data ... ");
|
||||||
/* Submit INQUIRY so we can find out the device type */
|
/* Submit INQUIRY so we can find out the device type */
|
||||||
task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 255);
|
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 ... ");
|
printf("Check device-type is either of DISK, TAPE or CD/DVD ... ");
|
||||||
switch (inq->device_type) {
|
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_DIRECT_ACCESS:
|
||||||
case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_SEQUENTIAL_ACCESS:
|
case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_SEQUENTIAL_ACCESS:
|
||||||
toc_device = 0;
|
toc_device = 0;
|
||||||
break;
|
break;
|
||||||
case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_MMC:
|
|
||||||
toc_device = 1;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
printf("[FAILED]\n");
|
/* Unknown device type */
|
||||||
printf("Device-type is not DISK, TAPE or CD/DVD. Device reported:%s\n", scsi_devtype_to_str(inq->device_type));
|
printf("[SKIPPED]\n");
|
||||||
ret = -1;
|
printf("This test is only available on SBC/SBC/SSC devices\n");
|
||||||
|
ret = -2;
|
||||||
goto finished;
|
goto finished;
|
||||||
}
|
}
|
||||||
|
scsi_free_scsi_task(task);
|
||||||
printf("[OK]\n");
|
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);
|
task = iscsi_readcapacity10_sync(iscsi, lun, 0, 0);
|
||||||
if (task == NULL) {
|
if (task == NULL) {
|
||||||
printf("[FAILED]\n");
|
printf("[FAILED]\n");
|
||||||
@@ -115,108 +123,127 @@ int T0410_readtoc_basic(const char *initiator, const char *url, int data_loss, i
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
goto finished;
|
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("[FAILED]\n");
|
||||||
printf("Readcapacity command: failed with sense. %s\n", iscsi_get_error(iscsi));
|
printf("Readcapacity command: failed with sense. %s\n", iscsi_get_error(iscsi));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
scsi_free_scsi_task(task);
|
scsi_free_scsi_task(task);
|
||||||
goto finished;
|
goto finished;
|
||||||
}
|
}
|
||||||
rc10 = scsi_datain_unmarshall(task);
|
|
||||||
if (rc10 == NULL) {
|
scsi_free_scsi_task(task);
|
||||||
printf("[FAILED]\n");
|
|
||||||
printf("failed to unmarshall readcapacity10 data. %s\n", iscsi_get_error(iscsi));
|
printf("[OK]\n");
|
||||||
ret = -1;
|
if (is_blank) {
|
||||||
scsi_free_scsi_task(task);
|
printf("Blank disk loaded. ReadTOC should fail.\n");
|
||||||
goto finished;
|
} 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:
|
test1:
|
||||||
|
printf("Verify we can READTOC format 0000b (TOC) track 0 (%s) ... ",
|
||||||
printf("Read TOC format 0000b (TOC)\n");
|
toc_device ? "On MMC Device" : "On non-MMC Device"
|
||||||
if (toc_device) {
|
);
|
||||||
printf(" On MMC Device\n");
|
|
||||||
} else {
|
|
||||||
printf(" On non-MMC Device\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
task = iscsi_readtoc_sync(iscsi, lun, 0, 0, 0, 255);
|
task = iscsi_readtoc_sync(iscsi, lun, 0, 0, 0, 255);
|
||||||
if (task == NULL) {
|
if (task == NULL) {
|
||||||
printf("[FAILED]\n");
|
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;
|
ret = -1;
|
||||||
goto finished;
|
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
|
/* If this is a non-MMC device, just verify that that comand failed
|
||||||
as expected and then bail */
|
as expected and then bail */
|
||||||
if (!toc_device) {
|
if (!toc_device) {
|
||||||
if (task->status == SCSI_STATUS_GOOD) {
|
if (task->status == SCSI_STATUS_GOOD) {
|
||||||
printf("[FAILED]\n");
|
printf("[FAILED]\n");
|
||||||
printf("READ TOC Should have failed\n");
|
printf("READTOC Should have failed\n");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
} else if (task->status != SCSI_STATUS_CHECK_CONDITION
|
} else if (task->status != SCSI_STATUS_CHECK_CONDITION
|
||||||
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|
||||||
|| task->sense.ascq != SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) {
|
|| task->sense.ascq != SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) {
|
||||||
printf("[FAILED]\n");
|
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));
|
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;
|
ret = -1;
|
||||||
} else {
|
} else {
|
||||||
printf("[OK]\n");
|
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);
|
scsi_free_scsi_task(task);
|
||||||
goto finished;
|
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");
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
if (task->status != SCSI_STATUS_GOOD) {
|
||||||
printf("[FAILED]\n");
|
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(task);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto finished;
|
goto finished;
|
||||||
}
|
}
|
||||||
|
printf("[OK]\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
test2:
|
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);
|
full_size = scsi_datain_getfullsize(task);
|
||||||
if (full_size < 4) {
|
if (full_size < 4) {
|
||||||
printf("[FAILED]\n");
|
printf("[FAILED]\n");
|
||||||
@@ -235,12 +262,13 @@ test2:
|
|||||||
}
|
}
|
||||||
printf("[OK]\n");
|
printf("[OK]\n");
|
||||||
|
|
||||||
|
|
||||||
test3:
|
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);
|
task1 = iscsi_readtoc_sync(iscsi, lun, 0, 1, 0, 255);
|
||||||
if (task1 == NULL) {
|
if (task1 == NULL) {
|
||||||
printf("[FAILED]\n");
|
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);
|
scsi_free_scsi_task(task);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto finished;
|
goto finished;
|
||||||
@@ -248,14 +276,17 @@ test3:
|
|||||||
|
|
||||||
if (task1->status != SCSI_STATUS_GOOD) {
|
if (task1->status != SCSI_STATUS_GOOD) {
|
||||||
printf("[FAILED]\n");
|
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(task);
|
||||||
scsi_free_scsi_task(task1);
|
scsi_free_scsi_task(task1);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto finished;
|
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);
|
full_size = scsi_datain_getfullsize(task1);
|
||||||
if (full_size < 4) {
|
if (full_size < 4) {
|
||||||
printf("[FAILED]\n");
|
printf("[FAILED]\n");
|
||||||
@@ -274,8 +305,10 @@ test3:
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
goto finished;
|
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 ||
|
if (list->num != list1->num ||
|
||||||
list->first != list1->first ||
|
list->first != list1->first ||
|
||||||
list->last != list1->last) {
|
list->last != list1->last) {
|
||||||
@@ -283,11 +316,11 @@ test3:
|
|||||||
printf("Read TOC header of lba 0 != TOC of lba 1.\n");
|
printf("Read TOC header of lba 0 != TOC of lba 1.\n");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
scsi_free_scsi_task(task);
|
scsi_free_scsi_task(task);
|
||||||
|
scsi_free_scsi_task(task1);
|
||||||
goto finished;
|
goto finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<list->num; i++) {
|
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 ||
|
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.control != list1->desc[i].desc.toc.control ||
|
||||||
list->desc[i].desc.toc.track != list1->desc[i].desc.toc.track ||
|
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");
|
printf("Read TOC descriptors of lba 0 != TOC of lba 1.\n");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
scsi_free_scsi_task(task);
|
scsi_free_scsi_task(task);
|
||||||
|
scsi_free_scsi_task(task1);
|
||||||
goto finished;
|
goto finished;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
printf("[OK]\n");
|
printf("[OK]\n");
|
||||||
scsi_free_scsi_task(task);
|
scsi_free_scsi_task(task);
|
||||||
|
scsi_free_scsi_task(task1);
|
||||||
|
|
||||||
|
|
||||||
finished:
|
finished:
|
||||||
|
|||||||
Reference in New Issue
Block a user