diff --git a/Makefile.am b/Makefile.am index f2c8b81..01c0daa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -199,6 +199,7 @@ bin_iscsi_test_cu_SOURCES = test-tool/iscsi-test-cu.c \ test-tool/test_iscsi_cmdsn_toohigh.c \ test-tool/test_iscsi_cmdsn_toolow.c \ test-tool/test_mandatory_sbc.c \ + test-tool/test_modesense6_all_pages.c \ test-tool/test_nomedia_sbc.c \ test-tool/test_orwrite_simple.c \ test-tool/test_orwrite_beyond_eol.c \ diff --git a/test-tool/iscsi-test-cu.c b/test-tool/iscsi-test-cu.c index eb51d80..9f2f02d 100644 --- a/test-tool/iscsi-test-cu.c +++ b/test-tool/iscsi-test-cu.c @@ -82,6 +82,11 @@ static CU_TestInfo tests_mandatory[] = { CU_TEST_INFO_NULL }; +static CU_TestInfo tests_modesense6[] = { + { (char *)"AllPages", test_modesense6_all_pages }, + CU_TEST_INFO_NULL +}; + static CU_TestInfo tests_nomedia[] = { { (char *)"NoMediaSBC", test_nomedia_sbc }, CU_TEST_INFO_NULL @@ -387,6 +392,8 @@ static CU_SuiteInfo scsi_suites[] = { tests_inquiry }, { (char *)"Mandatory", test_setup, test_teardown, tests_mandatory }, + { (char *)"ModeSense6", test_setup, test_teardown, + tests_modesense6 }, { (char *)"NoMedia", test_setup, test_teardown, tests_nomedia }, { (char *)"OrWrite", test_setup, test_teardown, @@ -493,6 +500,8 @@ static CU_SuiteInfo all_suites[] = { tests_inquiry }, { (char *)"Mandatory", test_setup, test_teardown, tests_mandatory }, + { (char *)"ModeSense6", test_setup, test_teardown, + tests_modesense6 }, { (char *)"NoMedia", test_setup, test_teardown, tests_nomedia }, { (char *)"OrWrite", test_setup, test_teardown, @@ -573,6 +582,8 @@ static CU_SuiteInfo scsi_usb_sbc_suites[] = { tests_inquiry }, { (char *)"Mandatory", test_setup, test_teardown, tests_mandatory }, + { (char *)"ModeSense6", test_setup, test_teardown, + tests_modesense6 }, { (char *)"OrWrite", test_setup, test_teardown, tests_orwrite }, { (char *)"Prefetch10", test_setup, test_teardown, diff --git a/test-tool/iscsi-test-cu.h b/test-tool/iscsi-test-cu.h index 893841f..8132ea4 100644 --- a/test-tool/iscsi-test-cu.h +++ b/test-tool/iscsi-test-cu.h @@ -56,6 +56,8 @@ void test_iscsi_cmdsn_toolow(void); void test_mandatory_sbc(void); +void test_modesense6_all_pages(void); + void test_nomedia_sbc(void); void test_orwrite_simple(void); diff --git a/test-tool/test_modesense6_all_pages.c b/test-tool/test_modesense6_all_pages.c new file mode 100644 index 0000000..9e0e1d8 --- /dev/null +++ b/test-tool/test_modesense6_all_pages.c @@ -0,0 +1,82 @@ +/* + Copyright (C) 2013 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-support.h" +#include "iscsi-test-cu.h" + +void +test_modesense6_all_pages(void) +{ + struct scsi_mode_sense *ms; + + logging(LOG_VERBOSE, LOG_BLANK_LINE); + logging(LOG_VERBOSE, "Test of MODESENSE6 AllPages"); + + + if (task != NULL) { + scsi_free_scsi_task(task); + task = NULL; + } + + logging(LOG_VERBOSE, "Send MODESENSE6 command to fetch AllPages"); + task = iscsi_modesense6_sync(iscsic, tgt_lun, 0, + SCSI_MODESENSE_PC_CURRENT, + SCSI_MODESENSE_PAGECODE_RETURN_ALL_PAGES, + 0, 255); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + logging(LOG_VERBOSE, "[FAILED] Failed to send MODE_SENSE6 " + "command:%s", + iscsi_get_error(iscsic)); + CU_FAIL("[FAILED] Failed to fetch the All Pages page."); + return; + } + logging(LOG_VERBOSE, "[SUCCESS] All Pages fetched."); + + + logging(LOG_VERBOSE, "Try to unmarshall the DATA-IN buffer."); + ms = scsi_datain_unmarshall(task); + if (ms == NULL) { + logging(LOG_VERBOSE, "[FAILED] failed to unmarshall mode sense " + "datain buffer"); + CU_FAIL("[FAILED] Failed to unmarshall the data-in buffer."); + scsi_free_scsi_task(task); + task = NULL; + return; + } + logging(LOG_VERBOSE, "[SUCCESS] Unmarshalling successful."); + + + logging(LOG_VERBOSE, "Verify that mode data length is >= 3"); + if (ms->mode_data_length >= 3) { + logging(LOG_VERBOSE, "[SUCCESS] Mode data length is >= 3"); + } else { + logging(LOG_VERBOSE, "[FAILED] Mode data length is < 3"); + } + CU_ASSERT_TRUE(ms->mode_data_length >= 3); + + + if (task != NULL) { + scsi_free_scsi_task(task); + task = NULL; + } +}