Commit 40daee4a authored by Michael Davis's avatar Michael Davis Committed by Cedric Caffy
Browse files

[rao_lto] Adds unit tests for new SCSI commands

parent cb12599f
......@@ -120,7 +120,23 @@ namespace SCSI {
/* Like network, SCSI is BigEndian */
return (uint64_t) ntohl ( (*(uint64_t *) t << 32) >> 32) << 32 | ntohl(*(uint64_t *) t >>32);
}
/**
* Helper function to deal with endianness.
*
* The REOWP SCSI command assigns 48 bits to store the LOGICAL OBJECT IDENTIFIER (although other
* commands use 64 bits or sometimes 32 bits). This function converts the 48-bit byte array
* into a 64-bit unsigned integer.
*
* @param t byte array in SCSI order representing a 48-bit number
* @return 64-bit unsigned integer
*/
inline uint64_t toU48(const unsigned char(& t)[6])
{
/* Like network, SCSI is BigEndian */
return (uint64_t) ntohl ( (*(uint64_t *) t << 32) >> 16) << 32 | ntohl(*(uint64_t *) t >>16);
}
/**
* Helper function to deal with endianness.
* @param t byte array in SCSI order representing a 32 bits number
......
......@@ -904,6 +904,95 @@ namespace unitTests {
ASSERT_EQ(0xCDU, testUnitReadyCDB.control);
}
TEST(castor_tape_SCSI_Structures, readEndOfWrapPositionCDB_t) {
castor::tape::SCSI::Structures::readEndOfWrapPositionCDB_t readEndOfWrapPositionCDB;
unsigned char *buff = reinterpret_cast<unsigned char*>(&readEndOfWrapPositionCDB);
// Make sure this struct is a POD (plain old data without virtual table) and has the right size
ASSERT_EQ(12U, sizeof(readEndOfWrapPositionCDB));
// Check proper initialization and location of struct members match the bit/byte locations defined in LTO-8 reference
ASSERT_EQ(buff[0], 0xA3);
ASSERT_EQ(buff[1], 0x1F);
ASSERT_EQ(buff[2], 0x45);
ASSERT_EQ(0U, readEndOfWrapPositionCDB.WNV);
buff[3] = 0x01;
ASSERT_EQ(1U, readEndOfWrapPositionCDB.WNV);
ASSERT_EQ(0U, readEndOfWrapPositionCDB.RA);
buff[3] = 0x02;
ASSERT_EQ(1U, readEndOfWrapPositionCDB.RA);
ASSERT_EQ(0U, readEndOfWrapPositionCDB.wrapNumber);
buff[5] = 0xAB;
ASSERT_EQ(0xAB, readEndOfWrapPositionCDB.wrapNumber);
ASSERT_EQ(0U, castor::tape::SCSI::Structures::toU32(readEndOfWrapPositionCDB.allocationLength));
buff[6] = 0x0A; buff[7] = 0xBC; buff[8] = 0xDE; buff[9] = 0xF0;
ASSERT_EQ(0xABCDEF0, castor::tape::SCSI::Structures::toU32(readEndOfWrapPositionCDB.allocationLength));
ASSERT_EQ(0U, readEndOfWrapPositionCDB.control);
buff[11] = 0xBC;
ASSERT_EQ(0xBC, readEndOfWrapPositionCDB.control);
}
TEST(castor_tape_SCSI_Structures, readEndOfWrapPositionDataShortForm_t) {
castor::tape::SCSI::Structures::readEndOfWrapPositionDataShortForm_t readEndOfWrapPositionDataShortForm;
unsigned char *buff = reinterpret_cast<unsigned char*>(&readEndOfWrapPositionDataShortForm);
// Make sure this struct is a POD (plain old data without virtual table) and has the right size
ASSERT_EQ(10U, sizeof(readEndOfWrapPositionDataShortForm));
// Check proper initialization and location of struct members match the bit/byte locations defined in LTO-8 reference
ASSERT_EQ(0U, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataShortForm.responseDataLength));
buff[0] = 0x0A; buff[1] = 0xB0;
ASSERT_EQ(0xAB0, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataShortForm.responseDataLength));
// Reserved
buff[2] = 0xFF; buf[3] = 0xFF;
// In this record, the logical object identifier is 6 bytes (48 bits).
ASSERT_EQ(0U, castor::tape::SCSI::Structures::toU48(readEndOfWrapPositionDataShortForm.logicalObjectIdentifier));
buff[4] = 0xAB; buff[5] = 0xCD; buff[6] = 0xEF; buff[7] = 0x12; buff[8] = 0x34; buff[9] = 0x56;
ASSERT_EQ(0xABCDEF123456, castor::tape::SCSI::Structures::toU48(readEndOfWrapPositionDataShortForm.logicalObjectIdentifier));
}
TEST(castor_tape_SCSI_Structures, readEndOfWrapPositionDataLongForm_t) {
castor::tape::SCSI::Structures::readEndOfWrapPositionDataLongForm_t readEndOfWrapPositionDataLongForm;
unsigned char *buff = reinterpret_cast<unsigned char*>(&readEndOfWrapPositionDataLongForm);
// Make sure this struct is a POD (plain old data without virtual table) and has the right size
ASSERT_EQ(4+(12*maxLTOTapeWraps), sizeof(readEndOfWrapPositionDataLongForm));
// Check proper initialization and location of struct members match the bit/byte locations defined in LTO-8 reference
ASSERT_EQ(0U, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.responseDataLength));
buff[0] = 0x0A; buff[1] = 0xB0;
ASSERT_EQ(0xAB0, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.responseDataLength));
for(int wrap = 0; wrap < maxLTOTapeWraps; ++wrap) {
int offset = 4 + (wrap * 12);
ASSERT_EQ(0U, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.wrapDescriptior[wrap].wrapNumber));
buff[offset + 0] = 0xAB;
buff[offset + 1] = 0xCD;
ASSERT_EQ(0xABCD, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.wrapDescriptior[wrap].wrapNumber));
ASSERT_EQ(0U, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.wrapDescriptior[wrap].partition));
buff[offset + 2] = 0xEF;
buff[offset + 3] = 0x01;
ASSERT_EQ(0xEF01, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.wrapDescriptior[wrap].partition));
// Reserved
buff[offset + 4] = 0xFF; buff[offset + 5] = 0xFF;
// In this record, the logical object identifier is 6 bytes (48 bits).
ASSERT_EQ(0U, castor::tape::SCSI::Structures::toU48(readEndOfWrapPositionDataLongForm.wrapDescriptior[wrap].logicalObjectIdentifier));
buff[offset + 6] = 0xAB; buff[offset + 7] = 0xCD; buff[offset + 8] = 0xEF;
buff[offset + 9] = 0x12; buff[offset + 10] = 0x34; buff[offset + 11] = 0x56;
ASSERT_EQ(0xABCDEF123456, castor::tape::SCSI::Structures::toU48(readEndOfWrapPositionDataLongForm.wrapDescriptior[wrap].logicalObjectIdentifier));
}
}
TEST(castor_tape_SCSI_Structures, requestSenseCDB_t) {
castor::tape::SCSI::Structures::requestSenseCDB_t requestSenseCDB;
unsigned char *buff = reinterpret_cast<unsigned char*>(&requestSenseCDB);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment