package org.jscsi.target.scsi;
import org.jscsi.parser.OperationCode;
import org.jscsi.parser.ProtocolDataUnit;
import org.jscsi.parser.ProtocolDataUnitFactory;
import org.jscsi.parser.scsi.SCSICommandParser;
import org.jscsi.target.scsi.cdb.RequestSenseCdb;
import org.jscsi.target.scsi.sense.AdditionalSenseBytes;
import org.jscsi.target.scsi.sense.AdditionalSenseCodeAndQualifier;
import org.jscsi.target.scsi.sense.DescriptorFormatSenseData;
import org.jscsi.target.scsi.sense.ErrorType;
import org.jscsi.target.scsi.sense.FixedFormatSenseData;
import org.jscsi.target.scsi.sense.SenseData;
import org.jscsi.target.scsi.sense.SenseKey;
import org.jscsi.target.scsi.sense.information.FourByteInformation;
import org.jscsi.target.scsi.sense.senseDataDescriptor.SenseDataDescriptor;
import org.jscsi.target.scsi.sense.senseDataDescriptor.senseKeySpecific.FieldPointerSenseKeySpecificData;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* This class tests the behavior of a scsi response data segment.
*
* @author Andreas Rain
*
*/
public class ScsiResponseDataSegmentTest {
/**
* None-empty data segment
*/
static ScsiResponseDataSegment nonEmpty;
@BeforeClass
public void beforeClass() {
/**
* The following part simulates a none-empty ScsiResponseDataSegment.
* It's copied for the most part from the RequestSenseStage
*/
final ProtocolDataUnit pdu =
new ProtocolDataUnitFactory().create(false, true, OperationCode.LOGIN_REQUEST, "None", "None");
final SCSICommandParser parser = new SCSICommandParser(pdu);
parser.setExpectedDataTransferLength(8);
// get command details in CDB
final RequestSenseCdb cdb = new RequestSenseCdb(parser.getCDB());
SenseData senseData;
if (cdb.getDescriptorFormat()) {
// descriptor format sense data has been requested
senseData = new DescriptorFormatSenseData(ErrorType.CURRENT,// errorType
SenseKey.ILLEGAL_REQUEST,// sense key
AdditionalSenseCodeAndQualifier.INVALID_FIELD_IN_CDB,// additional
// sense
// code
// and
// qualifier
new SenseDataDescriptor[0]);// sense data descriptors
} else {
// fixed format sense data has been requested
senseData = new FixedFormatSenseData(false,// valid
ErrorType.CURRENT,// error type
false,// file mark
false,// end of medium
false,// incorrect length indicator
SenseKey.ILLEGAL_REQUEST,// sense key
new FourByteInformation(),// information
new FourByteInformation(),// command specific
// information
AdditionalSenseCodeAndQualifier.INVALID_FIELD_IN_CDB,// additional
// sense
// code
// and
// qualifier
(byte)0,// field replaceable unit code
new FieldPointerSenseKeySpecificData(true,// senseKeySpecificDataValid
true,// commandData (i.e. invalid field in CDB)
true,// bitPointerValid
3,// bitPointer
8),// fieldPointer,// sense key specific data, only
// report first problem
new AdditionalSenseBytes());// additional sense bytes
}
nonEmpty = new ScsiResponseDataSegment(senseData, parser.getExpectedDataTransferLength());
}
@Test
public void testNoneEmpty() {
nonEmpty.serialize();
}
@Test
public void testEmpty() {
ScsiResponseDataSegment.EMPTY_DATA_SEGMENT.serialize();
}
}