From 6b28465a46358cdb9b13db04bc69d8dad1a7bbcc Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Wed, 12 Sep 2012 06:55:51 -0700 Subject: [PATCH] TESTS: Add basic test of standard INQUIRY data --- Makefile.am | 1 + test-tool/0400_inquiry_basic.c | 164 +++++++++++++++++++++++++++++++++ test-tool/iscsi-test.c | 2 + test-tool/iscsi-test.h | 2 + 4 files changed, 169 insertions(+) create mode 100644 test-tool/0400_inquiry_basic.c diff --git a/Makefile.am b/Makefile.am index 2588aeb..8836a8d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -127,6 +127,7 @@ bin_iscsi_test_SOURCES = test-tool/iscsi-test.c \ test-tool/0385_preventallow_lun_reset.c \ test-tool/0386_preventallow_2_it_nexuses.c \ test-tool/0390_mandatory_opcodes_sbc.c \ + test-tool/0400_inquiry_basic.c \ \ test-tool/1000_cmdsn_invalid.c \ test-tool/1010_datasn_invalid.c \ diff --git a/test-tool/0400_inquiry_basic.c b/test-tool/0400_inquiry_basic.c new file mode 100644 index 0000000..870cbfd --- /dev/null +++ b/test-tool/0400_inquiry_basic.c @@ -0,0 +1,164 @@ +/* + Copyright (C) 2012 by Ronnie Sahlberg + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . +*/ + +#include +#include +#include "iscsi.h" +#include "scsi-lowlevel.h" +#include "iscsi-test.h" + +int T0400_inquiry_basic(const char *initiator, const char *url, int data_loss, int show_info) +{ + struct iscsi_context *iscsi; + struct scsi_task *task; + struct scsi_inquiry_standard *inq; + int ret, lun; + int full_size; + + printf("0400_inquiry_basic:\n"); + printf("===================\n"); + if (show_info) { + printf("Test the standard INQUIRY data format.\n"); + printf("1, Check we can read the standard INQUIRY data\n"); + printf("2, Standard data must be at least 36 bytes in size\n"); + printf("3, Device-type must be either of DISK/TAPE/CDROM\n"); + printf("4, Check that peripheral qualifier field is 0\n"); + printf("5, Check that the version field is valid\n"); + printf("6, Check that response data format is valid\n"); + printf("\n"); + return 0; + } + + iscsi = iscsi_context_login(initiator, url, &lun); + if (iscsi == NULL) { + printf("Failed to login to target\n"); + return -1; + } + + + ret = 0; + + + + printf("Read standard INQUIRY data ... "); + /* See how big this inquiry data is */ + task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 255); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send INQUIRY command : %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto finished; + } + if (task->status != SCSI_STATUS_GOOD) { + printf("[FAILED]\n"); + printf("INQUIRY command failed : %s\n", iscsi_get_error(iscsi)); + scsi_free_scsi_task(task); + ret = -1; + goto finished; + } + full_size = scsi_datain_getfullsize(task); + if (full_size > task->datain.size) { + scsi_free_scsi_task(task); + + /* we need more data for the full list */ + if ((task = iscsi_inquiry_sync(iscsi, lun, 0, 0, full_size)) == NULL) { + printf("[FAILED]\n"); + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto finished; + } + } + inq = scsi_datain_unmarshall(task); + if (inq == NULL) { + printf("[FAILED]\n"); + printf("failed to unmarshall inquiry datain blob\n"); + scsi_free_scsi_task(task); + ret = -1; + goto finished; + } + printf("[OK]\n"); + +test2: + printf("Check that standard data is >= 36 bytes in size ... "); + if (full_size < 36) { + printf("[FAILED]\n"); + printf("Standard INQUIRY data is less than 36 bytes.\n"); + scsi_free_scsi_task(task); + ret = -1; + goto finished; + } + printf("[OK]\n"); + + +test3: + printf("Check device-type is either of DISK, TAPE or CD/DVD ... "); + switch (inq->device_type) { + case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS: + case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_SEQUENTIAL_ACCESS: + case SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_MMC: + 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; + goto test4; + } + printf("[OK]\n"); + + +test4: + printf("Check PREIPHERAL QUALIFIER FIELD is 0 ... "); + if (inq->qualifier != 0) { + printf("[FAILED]\n"); + printf("QUALIFIER was not 0, it was %d\n", inq->qualifier); + ret = -1; + goto test5; + } + printf("[OK]\n"); + +test5: + printf("Check VERSION field is either 0x4, 0x5 or 0x6 ... "); + switch (inq->version) { + case 0x4: /* SPC-2 */ + case 0x5: /* SPC-3 */ + case 0x6: /* SPC-4 */ + break; + default: + printf("[FAILED]\n"); + printf("Invalid VERSION:%d. Should be 0x4, 0x5 or 0x6\n", inq->version); + ret = -1; + goto test6; + } + printf("[OK]\n"); + +test6: + printf("Check RESPONSE DATA FORMAT is 2 ... "); + if (inq->response_data_format != 2) { + printf("[FAILED]\n"); + printf("Invalid RESPONSE_DATA_FORMAT:%d. Should be 2\n", inq->response_data_format); + ret = -1; + goto test7; + } + printf("[OK]\n"); + +test7: + +finished: + iscsi_logout_sync(iscsi); + iscsi_destroy_context(iscsi); + return ret; +} diff --git a/test-tool/iscsi-test.c b/test-tool/iscsi-test.c index a948060..6108256 100644 --- a/test-tool/iscsi-test.c +++ b/test-tool/iscsi-test.c @@ -201,6 +201,8 @@ struct scsi_test tests[] = { /* support for mandatory opcodes*/ { "T0390_mandatory_opcodes_sbc", T0390_mandatory_opcodes_sbc }, +/* inquiry*/ +{ "T0400_inquiry_basic", T0400_inquiry_basic }, /* iSCSI protocol tests */ diff --git a/test-tool/iscsi-test.h b/test-tool/iscsi-test.h index 5904ef9..83ad14e 100644 --- a/test-tool/iscsi-test.h +++ b/test-tool/iscsi-test.h @@ -156,6 +156,8 @@ int T0386_preventallow_2_itl_nexuses(const char *initiator, const char *url, int int T0390_mandatory_opcodes_sbc(const char *initiator, const char *url, int data_loss, int show_info); +int T0400_inquiry_basic(const char *initiator, const char *url, int data_loss, int show_info); + int T1000_cmdsn_invalid(const char *initiator, const char *url, int data_loss, int show_info); int T1010_datasn_invalid(const char *initiator, const char *url, int data_loss, int show_info); int T1020_bufferoffset_invalid(const char *initiator, const char *url, int data_loss, int show_info);