TEST-TOOL: Add a --info argument to print more detailed infor what a test does

Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
This commit is contained in:
Ronnie Sahlberg
2012-06-03 09:08:12 +10:00
parent 9e09a46ddd
commit 288fd5e9fe
48 changed files with 600 additions and 320 deletions

View File

@@ -58,7 +58,7 @@ bin_iscsi_test_SOURCES = test-tool/iscsi-test.c \
test-tool/0102_read10_0blocks.c test-tool/0103_read10_rdprotect.c \
test-tool/0104_read10_flags.c test-tool/0105_read10_invalid.c \
test-tool/0110_readcapacity10_simple.c \
test-tool/0111_readcapacity10_pmi.c test-tool/0120_read6_simple.c \
test-tool/0120_read6_simple.c \
test-tool/0121_read6_beyond_eol.c test-tool/0122_read6_invalid.c \
test-tool/0130_verify10_simple.c test-tool/0131_verify10_mismatch.c \
test-tool/0132_verify10_mismatch_no_cmp.c \

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0100_read10_simple(const char *initiator, const char *url)
int T0100_read10_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,16 @@ int T0100_read10_simple(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0100_read10_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic READ10 functionality.\n");
printf("1, Verify we can read the first 1-256 blocks of the LUN.\n");
printf("2, Verify we can read the last 1-256 blocks of the LUN.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0101_read10_beyond_eol(const char *initiator, const char *url)
int T0101_read10_beyond_eol(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,16 @@ int T0101_read10_beyond_eol(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0101_read10_beyond_eol:\n");
printf("=======================\n");
if (show_info) {
printf("Test that READ10 fails if reading beyond end-of-lun.\n");
printf("1, Read 1-256 blocks one block beyond end-of-lun.\n");
printf("2, Read 2-256 blocks all but one beyond end-of-lun.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");
@@ -79,16 +89,11 @@ int T0101_read10_beyond_eol(const char *initiator, const char *url)
scsi_free_scsi_task(task);
goto finished;
}
if (task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST) {
printf("[FAILED]\n");
printf("Read10 beyond end-of-lun did not return sense key ILLEGAL_REQUEST.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
if (task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("Read10 beyond end-of-lun did not return sense ascq LBA OUT OF RANGE.\n");
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("READ10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
@@ -115,16 +120,11 @@ int T0101_read10_beyond_eol(const char *initiator, const char *url)
scsi_free_scsi_task(task);
goto finished;
}
if (task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST) {
printf("[FAILED]\n");
printf("Read10 beyond end-of-lun did not return sense key ILLEGAL_REQUEST.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
if (task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("Read10 beyond end-of-lun did not return sense ascq LBA OUT OF RANGE.\n");
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("READ10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0102_read10_0blocks(const char *initiator, const char *url)
int T0102_read10_0blocks(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,18 @@ int T0102_read10_0blocks(const char *initiator, const char *url)
int ret, lun;
uint32_t block_size, num_blocks;
printf("0102_read10_0blocks:\n");
printf("====================\n");
if (show_info) {
printf("Test that READ10 works correctly when reading 0 number of blocks.\n");
printf("1, Read at LBA:0 should work.\n");
printf("2, Read at LBA:end-of-lun+1 should fail.\n");
printf("3, Read at LBA:end-of-lun+2 should fail.\n");
printf("4, Read at LBA:-1 should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");
@@ -90,9 +102,18 @@ int T0102_read10_0blocks(const char *initiator, const char *url)
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
if (task->status == SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Read10 of 0 one block beyond end-of-lun failed with sense.\n");
printf("Read10 of 0 blocks one block beyond end-of-lun should fail.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("READ10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
@@ -110,9 +131,18 @@ int T0102_read10_0blocks(const char *initiator, const char *url)
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
if (task->status == SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Read10 of 0 two blocks beyond end-of-lun failed with sense.\n");
printf("Read10 of 0 blocks two blocks beyond end-of-lun should fail.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("READ10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
@@ -130,9 +160,18 @@ int T0102_read10_0blocks(const char *initiator, const char *url)
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
if (task->status == SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Read10 of 0 at lba:-1 failed with sense.\n");
printf("Read10 of 0 blocks at lba:-1 should fail.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("READ10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;

View File

@@ -22,7 +22,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0103_read10_rdprotect(const char *initiator, const char *url)
int T0103_read10_rdprotect(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,15 @@ int T0103_read10_rdprotect(const char *initiator, const char *url)
struct scsi_inquiry_standard *inq;
int ret, i, lun;
printf("0103_read10_rdprotect:\n");
printf("======================\n");
if (show_info) {
printf("Test how READ10 handles the rdprotect bits\n");
printf("1, Any non-zero valued for rdprotect should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -22,12 +22,25 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0104_read10_flags(const char *initiator, const char *url)
int T0104_read10_flags(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
int ret, lun;
printf("0104_read10_flags:\n");
printf("=======================\n");
if (show_info) {
printf("Test how READ10 handles DPO, FUA and FUA_NV flags.\n");
printf("1, DPO:1 should work\n");
printf("2, FUA:1 and FUA_NV:0 should work\n");
printf("3, FUA:1 and FUA_NV:1 should work\n");
printf("4, FUA:0 and FUA_NV:1 should work\n");
printf("5, DPO:1 , FUA:1 and FUA_NV:1 should work\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -22,7 +22,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0105_read10_invalid(const char *initiator, const char *url)
int T0105_read10_invalid(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,19 @@ int T0105_read10_invalid(const char *initiator, const char *url)
char buf[512];
int ret, lun;
printf("0105_read10_invalid:\n");
printf("=======================\n");
if (show_info) {
printf("Test various protocol violations.\n");
printf("1, Read 1 block but set xferlength to 0. Should result in residual overflow of 512 bytes.\n");
printf("2, Read 1 block but set xferlength to 1024. Should result in residual underflow of 512 bytes.\n");
printf("3, Read 1 block but set xferlength to 200. Should result in residual overflow of 312 bytes.\n");
printf("4, Read 2 blocks but set xferlength to 512. Should result in residual overflow of 512 bytes.\n");
printf("5, Read 1 block but send one block as data-out write on the iSCSI level. Should result in both residual overflow and underflow of 512 bytes.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0110_readcapacity10_simple(const char *initiator, const char *url)
int T0110_readcapacity10_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,15 @@ int T0110_readcapacity10_simple(const char *initiator, const char *url)
ret = 0;
printf("0110_readcapacity10_simple:\n");
printf("===========================\n");
if (show_info) {
printf("Test that basic READCAPACITY10 works\n");
printf("1, Readcapacity10 should work.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -1,182 +0,0 @@
/*
Copyright (C) 2010 by Ronnie Sahlberg <ronniesahlberg@gmail.com>
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 <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include "iscsi.h"
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0111_readcapacity10_pmi(const char *initiator, const char *url)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
int ret, lun;
struct scsi_readcapacity10 *rc10;
uint32_t block_size, num_blocks;
ret = 0;
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");
return -1;
}
/* find the size of the LUN */
task = iscsi_readcapacity10_sync(iscsi, lun, 0, 0);
if (task == NULL) {
printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
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 to unmarshall readcapacity10 data. %s\n", iscsi_get_error(iscsi));
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
block_size = rc10->block_size;
num_blocks = rc10->lba;
scsi_free_scsi_task(task);
/* lba != 0 and pmi == 0 is an error */
printf("Readcapacity10 PMI==0 LBA!=0 ... ");
task = iscsi_readcapacity10_sync(iscsi, lun, 10, 0);
if (task == NULL) {
printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq !=SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB ) {
printf("[FAILED]\n");
printf("Readcapacity10 PMI==0 and LBA!=0 should fail with sense code.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
/* PMI==1 LBA==0 */
printf("Readcapacity10 PMI==1 LBA==0 ... ");
task = iscsi_readcapacity10_sync(iscsi, lun, 0, 1);
if (task == NULL) {
printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Readcapacity10 PMI==1 and LBA==0 should not fail with sense code.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
/* PMI==1 LBA==EOL-1 */
printf("Readcapacity10 PMI==1 LBA==EOL-1 ... ");
task = iscsi_readcapacity10_sync(iscsi, lun, num_blocks-1, 1);
if (task == NULL) {
printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Readcapacity10 PMI==1 and LBA==EOL-1 should not fail with sense code.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
/* PMI==1 LBA==EOL */
printf("Readcapacity10 PMI==1 LBA==EOL ... ");
task = iscsi_readcapacity10_sync(iscsi, lun, num_blocks, 1);
if (task == NULL) {
printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Readcapacity10 PMI==1 and LBA==EOL should not fail with sense code.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
/* PMI==1 LBA==EOL+1 */
printf("Readcapacity10 PMI==1 LBA==EOL+1 ... ");
task = iscsi_readcapacity10_sync(iscsi, lun, num_blocks+1, 1);
if (task == NULL) {
printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Readcapacity10 PMI==1 and LBA==EOL+1 should not fail with sense code.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
/* PMI==1 LBA==-1 */
printf("Readcapacity10 PMI==1 LBA==-1 ... ");
task = iscsi_readcapacity10_sync(iscsi, lun, 0xffffffff, 1);
if (task == NULL) {
printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Readcapacity10 PMI==1 and LBA==-1 should not fail with sense code.\n");
ret = -1;
scsi_free_scsi_task(task);
goto finished;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
finished:
iscsi_logout_sync(iscsi);
iscsi_destroy_context(iscsi);
return ret;
}

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0120_read6_simple(const char *initiator, const char *url)
int T0120_read6_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,15 @@ int T0120_read6_simple(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0120_read6_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic READ6 functionality.\n");
printf("1, Verify we can read the first 1-256 blocks of the LUN using READ6.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0121_read6_beyond_eol(const char *initiator, const char *url)
int T0121_read6_beyond_eol(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,17 @@ int T0121_read6_beyond_eol(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0121_read6_beyond_eol:\n");
printf("======================\n");
if (show_info) {
printf("Test that READ6 fails if reading beyond end-of-lun.\n");
printf("1, Read 1-256 blocks one block beyond end-of-lun.\n");
printf("2, Read 2-256 blocks all but one beyond end-of-lun.\n");
printf("3, Read 0(==256) blocks 128 blocks beyond end-of-lun.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -22,7 +22,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0122_read6_invalid(const char *initiator, const char *url)
int T0122_read6_invalid(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,19 @@ int T0122_read6_invalid(const char *initiator, const char *url)
char buf[512];
int ret, lun;
printf("0122_read6_invalid:\n");
printf("=======================\n");
if (show_info) {
printf("Test various protocol violations.\n");
printf("1, Read 1 block but set xferlength to 0. Should result in residual overflow of 512 bytes.\n");
printf("2, Read 1 block but set xferlength to 1024. Should result in residual underflow of 512 bytes.\n");
printf("3, Read 1 block but set xferlength to 200. Should result in residual overflow of 312 bytes.\n");
printf("4, Read 2 blocks but set xferlength to 512. Should result in residual overflow of 512 bytes.\n");
printf("5, Read 1 block but send one block as data-out write on the iSCSI level. Should result in both residual overflow and underflow of 512 bytes.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0130_verify10_simple(const char *initiator, const char *url)
int T0130_verify10_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,15 @@ int T0130_verify10_simple(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0130_verify10_simple:\n");
printf("=====================\n");
if (show_info) {
printf("Test basic VERIFY10 functionality.\n");
printf("1, Read and verify the first 1-256 blocks of the LUN using READ10/VERIFY10.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -21,7 +21,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0131_verify10_mismatch(const char *initiator, const char *url)
int T0131_verify10_mismatch(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,15 @@ int T0131_verify10_mismatch(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0131_verify10_mismatch:\n");
printf("=======================\n");
if (show_info) {
printf("Test basic VERIFY10 functionality.\n");
printf("1, Verify the first 1-256 blocks with a deliberate error detects the mismatch.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -21,7 +21,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url)
int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,15 @@ int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0132_verify10_mismatch_no_cmp:\n");
printf("==============================\n");
if (show_info) {
printf("Test VERIFY10 BYTCHK:0 should not detect mismatches.\n");
printf("1, Verify the first 1-256 blocks does nto detect a mismatch if BYTCHK is 0\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");
@@ -67,7 +76,7 @@ int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url)
/* read and verify the first 1 - 256 blocks at the start of the LUN */
printf("Read+verify first 1-256 blocks ... ");
for (i = 1; i <= 256; i++) {
char *buf;
unsigned char *buf;
task = iscsi_read10_sync(iscsi, lun, 0, i * block_size, block_size);
if (task == NULL) {

View File

@@ -20,13 +20,22 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0160_readcapacity16_simple(const char *initiator, const char *url)
int T0160_readcapacity16_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret, lun;
printf("0160_readcapacity16_simple:\n");
printf("===========================\n");
if (show_info) {
printf("Test that basic READCAPACITY16 works\n");
printf("1, Readcapacity16 should work.\n");
printf("\n");
return 0;
}
ret = 0;
iscsi = iscsi_context_login(initiator, url, &lun);

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0170_unmap_simple(const char *initiator, const char *url)
int T0170_unmap_simple(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,16 @@ int T0170_unmap_simple(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0170_unmap_simple:\n");
printf("==================\n");
if (show_info) {
printf("Test basic UNMAP functionality.\n");
printf("1, Test UNMAP the first 1-256 blocks of the LUN.\n");
printf("2, Test UNMAP the last 1-256 blocks of the LUN.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0171_unmap_zero(const char *initiator, const char *url)
int T0171_unmap_zero(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,18 @@ int T0171_unmap_zero(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0171_unmap_zero:\n");
printf("================\n");
if (show_info) {
printf("Test UNMAP of 0 blocks.\n");
printf("1, Try to UNMAP 0 blocks at LBA 0 to LBA 255\n");
printf("2, Try to UNMAP 0 blocks at 0 to 255 blocks from end-of-lun\n");
printf("3, Try to UNMAP 0 blocks at 1 to 256 blocks beyond end-of-lun\n");
printf("4, Send UNMAP without any block descriptors\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");
@@ -75,7 +87,7 @@ int T0171_unmap_zero(const char *initiator, const char *url)
ret = 0;
/* unmap no blocks at the first 0 - 256 blocks at the start of the LUN */
/* unmap no blocks at LBA 0 - 255 */
printf("Unmapping of no block at lbas 0-255 blocks ... ");
for (i=0; i<=255; i++) {
struct unmap_list list[1];

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0180_writesame10_unmap(const char *initiator, const char *url)
int T0180_writesame10_unmap(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,16 @@ int T0180_writesame10_unmap(const char *initiator, const char *url)
uint32_t block_size, num_blocks;
int lbppb;
printf("0180_writesame10_unmap:\n");
printf("=======================\n");
if (show_info) {
printf("Test basic WRITESAME10-UNMAP functionality.\n");
printf("1, UNMAP the first 1-256 blocks at the start of the LUN\n");
printf("2, UNMAP the last 1-256 blocks at the end of the LUN\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url)
int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,15 @@ int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url)
uint32_t block_size, num_blocks;
int lbppb;
printf("0181_writesame10_unmap_unaligned:\n");
printf("=================================\n");
if (show_info) {
printf("Test unaligned WRITESAME10-UNMAP functionality.\n");
printf("1, UNMAP the first 1-lbppb blocks at the start of the LUN\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0190_writesame16_unmap(const char *initiator, const char *url)
int T0190_writesame16_unmap(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,16 @@ int T0190_writesame16_unmap(const char *initiator, const char *url)
uint32_t block_size, num_blocks;
int lbppb;
printf("0190_writesame16_unmap:\n");
printf("=======================\n");
if (show_info) {
printf("Test basic WRITESAME16-UNMAP functionality.\n");
printf("1, UNMAP the first 1-256 blocks at the start of the LUN\n");
printf("2, UNMAP the last 1-256 blocks at the end of the LUN\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url)
int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,15 @@ int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url)
uint32_t block_size, num_blocks;
int lbppb;
printf("0191_writesame16_unmap_unaligned:\n");
printf("=================================\n");
if (show_info) {
printf("Test unaligned WRITESAME16-UNMAP functionality.\n");
printf("1, UNMAP the first 1-lbppb blocks at the start of the LUN\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0200_read16_simple(const char *initiator, const char *url)
int T0200_read16_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,16 @@ int T0200_read16_simple(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0200_read16_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic READ16 functionality.\n");
printf("1, Verify we can read the first 1-256 blocks of the LUN.\n");
printf("2, Verify we can read the last 1-256 blocks of the LUN.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,13 +20,22 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0201_read16_rdprotect(const char *initiator, const char *url)
int T0201_read16_rdprotect(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
uint32_t block_size, num_blocks;
uint32_t block_size;
printf("0201_read16_rdprotect:\n");
printf("======================\n");
if (show_info) {
printf("Test how READ16 handles the rdprotect bits\n");
printf("1, Any non-zero valued for rdprotect should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {

View File

@@ -20,14 +20,26 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0202_read16_flags(const char *initiator, const char *url)
int T0202_read16_flags(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
int ret = 0, lun;
uint32_t block_size;
printf("0202_read16_flags:\n");
printf("==================\n");
if (show_info) {
printf("Test how READ16 handles the flag bits\n");
printf("1, Reading with DPO should work\n");
printf("2, Reading with FUA should work\n");
printf("3, Reading with FUA_NV should work\n");
printf("4, Reading with FUA+FUA_NV should work\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,15 +20,26 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0203_read16_0blocks(const char *initiator, const char *url)
int T0203_read16_0blocks(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
int ret = 0, lun;
uint32_t block_size;
uint64_t num_blocks;
printf("0203_read16_0blocks:\n");
printf("====================\n");
if (show_info) {
printf("Test that READ16 works correctly when reading 0 number of blocks.\n");
printf("1, Read at 0 should work.\n");
printf("2, Read at end-of-lun should work.\n");
printf("3, Read beyond end-of-lun should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0204_read16_beyondeol(const char *initiator, const char *url)
int T0204_read16_beyondeol(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,15 @@ int T0204_read16_beyondeol(const char *initiator, const char *url)
uint32_t block_size;
uint64_t num_blocks;
printf("0204_read16_beyond_eol:\n");
printf("=======================\n");
if (show_info) {
printf("Test that READ16 fails if reading beyond end-of-lun.\n");
printf("1, Read 1-256 blocks one block beyond end-of-lun.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0210_read12_simple(const char *initiator, const char *url)
int T0210_read12_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -28,6 +28,16 @@ int T0210_read12_simple(const char *initiator, const char *url)
int ret, i, lun;
uint32_t block_size, num_blocks;
printf("0210_read12_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic READ12 functionality.\n");
printf("1, Verify we can read the first 1-256 blocks of the LUN.\n");
printf("2, Verify we can read the last 1-256 blocks of the LUN.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,13 +20,22 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0211_read12_rdprotect(const char *initiator, const char *url)
int T0211_read12_rdprotect(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
uint32_t block_size, num_blocks;
uint32_t block_size;
printf("0211_read12_rdprotect:\n");
printf("======================\n");
if (show_info) {
printf("Test how READ12 handles the rdprotect bits\n");
printf("1, Any non-zero valued for rdprotect should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {

View File

@@ -20,14 +20,26 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0212_read12_flags(const char *initiator, const char *url)
int T0212_read12_flags(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
int ret = 0, lun;
uint32_t block_size;
printf("0212_read12_flags:\n");
printf("==================\n");
if (show_info) {
printf("Test how READ12 handles the flag bits\n");
printf("1, Reading with DPO should work\n");
printf("2, Reading with FUA should work\n");
printf("3, Reading with FUA_NV should work\n");
printf("4, Reading with FUA+FUA_NV should work\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,15 +20,26 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0213_read12_0blocks(const char *initiator, const char *url)
int T0213_read12_0blocks(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
int ret = 0, lun;
uint32_t block_size;
uint64_t num_blocks;
printf("0213_read12_0blocks:\n");
printf("====================\n");
if (show_info) {
printf("Test that READ12 works correctly when reading 0 number of blocks.\n");
printf("1, Read at 0 should work.\n");
printf("2, Read at end-of-lun should work.\n");
printf("3, Read beyond end-of-lun should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0214_read12_beyondeol(const char *initiator, const char *url)
int T0214_read12_beyondeol(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,15 @@ int T0214_read12_beyondeol(const char *initiator, const char *url)
uint32_t block_size;
uint64_t num_blocks;
printf("0214_read12_beyond_eol:\n");
printf("=======================\n");
if (show_info) {
printf("Test that READ12 fails if reading beyond end-of-lun.\n");
printf("1, Read 1-256 blocks one block beyond end-of-lun.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0220_write16_simple(const char *initiator, const char *url)
int T0220_write16_simple(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,16 @@ int T0220_write16_simple(const char *initiator, const char *url)
uint64_t num_blocks;
unsigned char data[512 * 256];
printf("0220_write16_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic WRITE16 functionality.\n");
printf("1, Verify we can write the first 1-256 blocks of the LUN.\n");
printf("2, Verify we can write the last 1-256 blocks of the LUN.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,15 +20,24 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0221_write16_wrprotect(const char *initiator, const char *url)
int T0221_write16_wrprotect(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
uint32_t block_size, num_blocks;
uint32_t block_size;
unsigned char data[256 * 512];
printf("0221_write16_wrprotect:\n");
printf("======================\n");
if (show_info) {
printf("Test how WRITE16 handles the wrprotect bits\n");
printf("1, Any non-zero valued for wrprotect should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0222_write16_flags(const char *initiator, const char *url)
int T0222_write16_flags(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,18 @@ int T0222_write16_flags(const char *initiator, const char *url)
uint32_t block_size;
unsigned char data[256 * 512];
printf("0222_write16_flags:\n");
printf("===================\n");
if (show_info) {
printf("Test how WRITE16 handles the flags\n");
printf("1, Write with DPU should work.\n");
printf("2, Write with FUA should work.\n");
printf("3, Write with FUA_NV should work.\n");
printf("4, Write with FUA+FUA_NV should work.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,15 +20,26 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0223_write16_0blocks(const char *initiator, const char *url)
int T0223_write16_0blocks(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
int ret = 0, lun;
uint32_t block_size;
uint64_t num_blocks;
printf("0223_write16_0blocks:\n");
printf("====================\n");
if (show_info) {
printf("Test that WRITE16 works correctly when writing 0 number of blocks.\n");
printf("1, Read at LBA:0 should work.\n");
printf("2, Read at LBA:end-of-lun should work.\n");
printf("3, Read at LBA:end-of-lun+1 should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0224_write16_beyondeol(const char *initiator, const char *url)
int T0224_write16_beyondeol(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,15 @@ int T0224_write16_beyondeol(const char *initiator, const char *url)
uint64_t num_blocks;
unsigned char data[258 * 512];
printf("0224_write16_beyond_eol:\n");
printf("=======================\n");
if (show_info) {
printf("Test that WRITE16 fails if writing beyond end-of-lun.\n");
printf("1, Writing 1-256 blocks beyond end-of-lun should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0230_write12_simple(const char *initiator, const char *url)
int T0230_write12_simple(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,16 @@ int T0230_write12_simple(const char *initiator, const char *url)
uint64_t num_blocks;
unsigned char data[512 * 256];
printf("0230_write12_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic WRITE12 functionality.\n");
printf("1, Verify we can write the first 1-256 blocks of the LUN.\n");
printf("2, Verify we can write the last 1-256 blocks of the LUN.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,15 +20,24 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0231_write12_wrprotect(const char *initiator, const char *url)
int T0231_write12_wrprotect(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
uint32_t block_size, num_blocks;
uint32_t block_size;
unsigned char data[256 * 512];
printf("0231_write12_wrprotect:\n");
printf("======================\n");
if (show_info) {
printf("Test how WRITE12 handles the wrprotect bits\n");
printf("1, Any non-zero valued for wrprotect should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0232_write12_flags(const char *initiator, const char *url)
int T0232_write12_flags(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,18 @@ int T0232_write12_flags(const char *initiator, const char *url)
uint32_t block_size;
unsigned char data[256 * 512];
printf("0232_write12_flags:\n");
printf("===================\n");
if (show_info) {
printf("Test how WRITE12 handles the flags\n");
printf("1, Write with DPU should work.\n");
printf("2, Write with FUA should work.\n");
printf("3, Write with FUA_NV should work.\n");
printf("4, Write with FUA+FUA_NV should work.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,15 +20,26 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0233_write12_0blocks(const char *initiator, const char *url)
int T0233_write12_0blocks(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret = 0, i, lun;
int ret = 0, lun;
uint32_t block_size;
uint64_t num_blocks;
printf("0233_write12_0blocks:\n");
printf("====================\n");
if (show_info) {
printf("Test that WRITE12 works correctly when writing 0 number of blocks.\n");
printf("1, Read at LBA:0 should work.\n");
printf("2, Read at LBA:end-of-lun should work.\n");
printf("3, Read at LBA:end-of-lun+1 should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0234_write12_beyondeol(const char *initiator, const char *url)
int T0234_write12_beyondeol(const char *initiator, const char *url, int data_loss, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -30,6 +30,15 @@ int T0234_write12_beyondeol(const char *initiator, const char *url)
uint64_t num_blocks;
unsigned char data[258 * 512];
printf("0234_write12_beyond_eol:\n");
printf("=======================\n");
if (show_info) {
printf("Test that WRITE12 fails if writing beyond end-of-lun.\n");
printf("1, Writing 1-256 blocks beyond end-of-lun should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0240_prefetch10_simple(const char *initiator, const char *url)
int T0240_prefetch10_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,16 @@ int T0240_prefetch10_simple(const char *initiator, const char *url)
uint32_t block_size;
uint64_t num_blocks;
printf("0240_prefetch10_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic PREFETCH10 functionality.\n");
printf("1, Verify we can prefetch the first 1-256 blocks of the LUN.\n");
printf("2, Verify we can prefetch the last 1-256 blocks of the LUN.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,7 +20,7 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0250_prefetch16_simple(const char *initiator, const char *url)
int T0250_prefetch16_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
@@ -29,6 +29,16 @@ int T0250_prefetch16_simple(const char *initiator, const char *url)
uint32_t block_size;
uint64_t num_blocks;
printf("0250_prefetch16_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic PREFETCH16 functionality.\n");
printf("1, Verify we can prefetch the first 1-256 blocks of the LUN.\n");
printf("2, Verify we can prefetch the last 1-256 blocks of the LUN.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,15 +20,25 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0260_get_lba_status_simple(const char *initiator, const char *url)
int T0260_get_lba_status_simple(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret, i, lun;
int ret, lun;
uint32_t block_size;
uint64_t num_blocks;
printf("0260_get_lba_status_simple:\n");
printf("===================\n");
if (show_info) {
printf("Test basic GET_LBA_STATUS functionality.\n");
printf("1, Verify we can read a descriptor at the start of the lun.\n");
printf("2, Verify we can read a descriptor at the end of the lun.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -20,15 +20,24 @@
#include "scsi-lowlevel.h"
#include "iscsi-test.h"
int T0264_get_lba_status_beyondeol(const char *initiator, const char *url)
int T0264_get_lba_status_beyondeol(const char *initiator, const char *url, int data_loss _U_, int show_info)
{
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret, i, lun;
int ret, lun;
uint32_t block_size;
uint64_t num_blocks;
printf("0264_get_lba_status_beyondeol:\n");
printf("==============================\n");
if (show_info) {
printf("Test GET_LBA_STATUS functionality for beyond end-of-lun requests\n");
printf("1, Reading a descriptor beyond the end of the lun should fail.\n");
printf("\n");
return 0;
}
iscsi = iscsi_context_login(initiator, url, &lun);
if (iscsi == NULL) {
printf("Failed to login to target\n");

View File

@@ -29,11 +29,12 @@
#include "iscsi-test.h"
const char *initiator = "iqn.2010-11.iscsi-test";
int data_loss = 0;
static int data_loss = 0;
static int show_info = 0;
struct scsi_test {
const char *name;
int (*test)(const char *initiator, const char *url);
int (*test)(const char *initiator, const char *url, int data_loss, int show_info);
};
struct scsi_test tests[] = {
@@ -47,7 +48,6 @@ struct scsi_test tests[] = {
/* readcapacity10*/
{ "T0110_readcapacity10_simple", T0110_readcapacity10_simple },
{ "T0111_readcapacity10_pmi", T0111_readcapacity10_pmi },
/* read6*/
{ "T0120_read6_simple", T0120_read6_simple },
@@ -128,6 +128,7 @@ void print_help(void)
fprintf(stderr, " -i, --initiator-name=iqn-name Initiatorname to use\n");
fprintf(stderr, " -t, --test=test-name Which test to run. Default is to run all tests.\n");
fprintf(stderr, " -l, --list List all tests.\n");
fprintf(stderr, " --dataloss All destructive tests.\n");
fprintf(stderr, "\n");
fprintf(stderr, "Help options:\n");
fprintf(stderr, " -?, --help Show this help message\n");
@@ -206,6 +207,7 @@ int main(int argc, const char *argv[])
{ "list", 'l', POPT_ARG_NONE, &list_tests, 0, "List all tests", NULL },
{ "initiator-name", 'i', POPT_ARG_STRING, &initiator, 0, "Initiatorname to use", "iqn-name" },
{ "test", 't', POPT_ARG_STRING, &testname, 0, "Which test to run", "testname" },
{ "info", 'i', POPT_ARG_NONE, &show_info, 0, "Show information about the test", "testname" },
{ "dataloss", 0, POPT_ARG_NONE, &data_loss, 0, "Allow destructuve tests", NULL },
POPT_TABLEEND
};
@@ -254,9 +256,7 @@ int main(int argc, const char *argv[])
continue;
}
printf("=========\n");
printf("Running test %s\n", test->name);
res = test->test(initiator, url);
res = test->test(initiator, url, data_loss, show_info);
if (res == 0) {
printf("TEST %s [OK]\n", test->name);
} else {

View File

@@ -18,65 +18,62 @@
*/
struct iscsi_context *iscsi_context_login(const char *initiatorname, const char *url, int *lun);
extern int data_loss;
int T0100_read10_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0101_read10_beyond_eol(const char *initiator, const char *url, int data_loss, int show_info);
int T0102_read10_0blocks(const char *initiator, const char *url, int data_loss, int show_info);
int T0103_read10_rdprotect(const char *initiator, const char *url, int data_loss, int show_info);
int T0104_read10_flags(const char *initiator, const char *url, int data_loss, int show_info);
int T0105_read10_invalid(const char *initiator, const char *url, int data_loss, int show_info);
int T0100_read10_simple(const char *initiator, const char *url);
int T0101_read10_beyond_eol(const char *initiator, const char *url);
int T0102_read10_0blocks(const char *initiator, const char *url);
int T0103_read10_rdprotect(const char *initiator, const char *url);
int T0104_read10_flags(const char *initiator, const char *url);
int T0105_read10_invalid(const char *initiator, const char *url);
int T0110_readcapacity10_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0110_readcapacity10_simple(const char *initiator, const char *url);
int T0111_readcapacity10_pmi(const char *initiator, const char *url);
int T0120_read6_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0121_read6_beyond_eol(const char *initiator, const char *url, int data_loss, int show_info);
int T0122_read6_invalid(const char *initiator, const char *url, int data_loss, int show_info);
int T0120_read6_simple(const char *initiator, const char *url);
int T0121_read6_beyond_eol(const char *initiator, const char *url);
int T0122_read6_invalid(const char *initiator, const char *url);
int T0130_verify10_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0131_verify10_mismatch(const char *initiator, const char *url, int data_loss, int show_info);
int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url, int data_loss, int show_info);
int T0130_verify10_simple(const char *initiator, const char *url);
int T0131_verify10_mismatch(const char *initiator, const char *url);
int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url);
int T0160_readcapacity16_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0160_readcapacity16_simple(const char *initiator, const char *url);
int T0170_unmap_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0171_unmap_zero(const char *initiator, const char *url, int data_loss, int show_info);
int T0170_unmap_simple(const char *initiator, const char *url);
int T0171_unmap_zero(const char *initiator, const char *url);
int T0180_writesame10_unmap(const char *initiator, const char *url, int data_loss, int show_info);
int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url, int data_loss, int show_info);
int T0180_writesame10_unmap(const char *initiator, const char *url);
int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url);
int T0190_writesame16_unmap(const char *initiator, const char *url, int data_loss, int show_info);
int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url, int data_loss, int show_info);
int T0190_writesame16_unmap(const char *initiator, const char *url);
int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url);
int T0200_read16_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0201_read16_rdprotect(const char *initiator, const char *url, int data_loss, int show_info);
int T0202_read16_flags(const char *initiator, const char *url, int data_loss, int show_info);
int T0203_read16_0blocks(const char *initiator, const char *url, int data_loss, int show_info);
int T0204_read16_beyondeol(const char *initiator, const char *url, int data_loss, int show_info);
int T0200_read16_simple(const char *initiator, const char *url);
int T0201_read16_rdprotect(const char *initiator, const char *url);
int T0202_read16_flags(const char *initiator, const char *url);
int T0203_read16_0blocks(const char *initiator, const char *url);
int T0204_read16_beyondeol(const char *initiator, const char *url);
int T0210_read12_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0211_read12_rdprotect(const char *initiator, const char *url, int data_loss, int show_info);
int T0212_read12_flags(const char *initiator, const char *url, int data_loss, int show_info);
int T0213_read12_0blocks(const char *initiator, const char *url, int data_loss, int show_info);
int T0214_read12_beyondeol(const char *initiator, const char *url, int data_loss, int show_info);
int T0210_read12_simple(const char *initiator, const char *url);
int T0211_read12_rdprotect(const char *initiator, const char *url);
int T0212_read12_flags(const char *initiator, const char *url);
int T0213_read12_0blocks(const char *initiator, const char *url);
int T0214_read12_beyondeol(const char *initiator, const char *url);
int T0220_write16_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0221_write16_wrprotect(const char *initiator, const char *url, int data_loss, int show_info);
int T0222_write16_flags(const char *initiator, const char *url, int data_loss, int show_info);
int T0223_write16_0blocks(const char *initiator, const char *url, int data_loss, int show_info);
int T0224_write16_beyondeol(const char *initiator, const char *url, int data_loss, int show_info);
int T0220_write16_simple(const char *initiator, const char *url);
int T0221_write16_wrprotect(const char *initiator, const char *url);
int T0222_write16_flags(const char *initiator, const char *url);
int T0223_write16_0blocks(const char *initiator, const char *url);
int T0224_write16_beyondeol(const char *initiator, const char *url);
int T0230_write12_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0231_write12_wrprotect(const char *initiator, const char *url, int data_loss, int show_info);
int T0232_write12_flags(const char *initiator, const char *url, int data_loss, int show_info);
int T0233_write12_0blocks(const char *initiator, const char *url, int data_loss, int show_info);
int T0234_write12_beyondeol(const char *initiator, const char *url, int data_loss, int show_info);
int T0230_write12_simple(const char *initiator, const char *url);
int T0231_write12_wrprotect(const char *initiator, const char *url);
int T0232_write12_flags(const char *initiator, const char *url);
int T0233_write12_0blocks(const char *initiator, const char *url);
int T0234_write12_beyondeol(const char *initiator, const char *url);
int T0240_prefetch10_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0240_prefetch10_simple(const char *initiator, const char *url);
int T0250_prefetch16_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0250_prefetch16_simple(const char *initiator, const char *url);
int T0260_get_lba_status_simple(const char *initiator, const char *url);
int T0264_get_lba_status_beyondeol(const char *initiator, const char *url);
int T0260_get_lba_status_simple(const char *initiator, const char *url, int data_loss, int show_info);
int T0264_get_lba_status_beyondeol(const char *initiator, const char *url, int data_loss, int show_info);