mirror of
https://github.com/akuker/RASCSI.git
synced 2026-04-24 07:16:46 +00:00
Code cleanup, especially casts, lambdas, data types, encapsulation (#952)
* Unit test updates * Lambda syntax cleanup * Use new-style casts * Use std::none_of when saving the cache * Use to_integer instead of casts * Use accessors for getting CDB data * Made ctrl_t private * Improved encapsulation * Replaced pointers by references * Removed all remaining occurrences of DWORD and BYTE, making os.h obsolete
This commit is contained in:
@@ -110,12 +110,12 @@ TEST(AbstractControllerTest, ProcessPhase)
|
||||
controller.ProcessPhase();
|
||||
|
||||
controller.SetPhase(BUS::phase_t::reselection);
|
||||
EXPECT_THAT([&controller]() { controller.ProcessPhase(); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { controller.ProcessPhase(); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ABORTED_COMMAND),
|
||||
Property(&scsi_exception::get_asc, asc::NO_ADDITIONAL_SENSE_INFORMATION))));
|
||||
|
||||
controller.SetPhase(BUS::phase_t::reserved);
|
||||
EXPECT_THAT([&controller]() { controller.ProcessPhase(); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { controller.ProcessPhase(); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ABORTED_COMMAND),
|
||||
Property(&scsi_exception::get_asc, asc::NO_ADDITIONAL_SENSE_INFORMATION))));
|
||||
}
|
||||
@@ -143,6 +143,7 @@ TEST(AbstractControllerTest, DeviceLunLifeCycle)
|
||||
EXPECT_EQ(nullptr, controller.GetDeviceForLun(0));
|
||||
EXPECT_TRUE(controller.RemoveDevice(device1));
|
||||
EXPECT_EQ(0, controller.GetLunCount());
|
||||
EXPECT_FALSE(controller.RemoveDevice(device1));
|
||||
}
|
||||
|
||||
TEST(AbstractControllerTest, ExtractInitiatorId)
|
||||
@@ -163,8 +164,8 @@ TEST(AbstractControllerTest, GetOpcode)
|
||||
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
cmd[0] = 0x12;
|
||||
EXPECT_EQ(0x12, (int)controller.GetOpcode());
|
||||
cmd[0] = static_cast<int>(scsi_command::eCmdInquiry);
|
||||
EXPECT_EQ(scsi_command::eCmdInquiry, controller.GetOpcode());
|
||||
}
|
||||
|
||||
TEST(AbstractControllerTest, GetLun)
|
||||
@@ -179,7 +180,17 @@ TEST(AbstractControllerTest, GetLun)
|
||||
EXPECT_EQ(LUN, controller.GetLun());
|
||||
}
|
||||
|
||||
TEST(AbstractControllerTest, SetLength)
|
||||
TEST(AbstractControllerTest, Blocks)
|
||||
{
|
||||
MockAbstractController controller(make_shared<MockBus>(), 0);
|
||||
|
||||
controller.SetBlocks(1);
|
||||
EXPECT_EQ(1, controller.GetBlocks());
|
||||
controller.DecrementBlocks();
|
||||
EXPECT_EQ(0, controller.GetBlocks());
|
||||
}
|
||||
|
||||
TEST(AbstractControllerTest, Length)
|
||||
{
|
||||
MockAbstractController controller(make_shared<MockBus>(), 0);
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
TEST(CTapDriverTest, Crc32)
|
||||
{
|
||||
array<BYTE, ETH_FRAME_LEN> buf;
|
||||
array<uint8_t, ETH_FRAME_LEN> buf;
|
||||
|
||||
buf.fill(0x00);
|
||||
EXPECT_EQ(0xe3d887bb, CTapDriver::Crc32(buf.data(), ETH_FRAME_LEN));
|
||||
@@ -30,12 +30,12 @@ TEST(CTapDriverTest, Crc32)
|
||||
EXPECT_EQ(0x29cbd638, CTapDriver::Crc32(buf.data(), ETH_FRAME_LEN));
|
||||
|
||||
for (size_t i = 0; i < buf.size(); i++) {
|
||||
buf[i] = (BYTE)i;
|
||||
buf[i] = (uint8_t)i;
|
||||
}
|
||||
EXPECT_EQ(0xe7870705, CTapDriver::Crc32(buf.data(), ETH_FRAME_LEN));
|
||||
|
||||
for (size_t i = buf.size() - 1; i > 0; i--) {
|
||||
buf[i] = (BYTE)i;
|
||||
buf[i] = (uint8_t)i;
|
||||
}
|
||||
EXPECT_EQ(0xe7870705, CTapDriver::Crc32(buf.data(), ETH_FRAME_LEN));
|
||||
}
|
||||
|
||||
+45
-52
@@ -34,7 +34,7 @@ TEST(DiskTest, Rezero)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdRezero); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdRezero); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "REZERO must fail because drive is not ready";
|
||||
@@ -55,7 +55,7 @@ TEST(DiskTest, FormatUnit)
|
||||
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdFormat); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdFormat); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "FORMAT UNIT must fail because drive is not ready";
|
||||
@@ -68,7 +68,7 @@ TEST(DiskTest, FormatUnit)
|
||||
|
||||
cmd[1] = 0x10;
|
||||
cmd[4] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdFormat); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdFormat); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))));
|
||||
}
|
||||
@@ -80,7 +80,7 @@ TEST(DiskTest, ReassignBlocks)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReassign); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReassign); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "REASSIGN must fail because drive is not ready";
|
||||
@@ -101,7 +101,7 @@ TEST(DiskTest, Seek6)
|
||||
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdSeek6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdSeek6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "SEEK(6) must fail for a medium with 0 blocks";
|
||||
@@ -109,7 +109,7 @@ TEST(DiskTest, Seek6)
|
||||
disk->SetBlockCount(1);
|
||||
// Block count
|
||||
cmd[4] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdSeek6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdSeek6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "SEEK(6) must fail because drive is not ready";
|
||||
@@ -130,7 +130,7 @@ TEST(DiskTest, Seek10)
|
||||
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdSeek10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdSeek10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "SEEK(10) must fail for a medium with 0 blocks";
|
||||
@@ -138,7 +138,7 @@ TEST(DiskTest, Seek10)
|
||||
disk->SetBlockCount(1);
|
||||
// Block count
|
||||
cmd[5] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdSeek10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdSeek10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "SEEK(10) must fail because drive is not ready";
|
||||
@@ -157,13 +157,13 @@ TEST(DiskTest, ReadCapacity10)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadCapacity10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadCapacity10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "READ CAPACITY(10) must fail because drive is not ready";
|
||||
|
||||
disk->SetReady(true);
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadCapacity10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadCapacity10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "READ CAPACITY(10) must fail because the medium has no capacity";
|
||||
@@ -171,18 +171,16 @@ TEST(DiskTest, ReadCapacity10)
|
||||
disk->SetBlockCount(0x12345678);
|
||||
EXPECT_CALL(controller, DataIn());
|
||||
EXPECT_TRUE(disk->Dispatch(scsi_command::eCmdReadCapacity10));
|
||||
EXPECT_EQ(0x12, controller.GetBuffer()[0]);
|
||||
EXPECT_EQ(0x34, controller.GetBuffer()[1]);
|
||||
EXPECT_EQ(0x56, controller.GetBuffer()[2]);
|
||||
EXPECT_EQ(0x77, controller.GetBuffer()[3]);
|
||||
auto& buf = controller.GetBuffer();
|
||||
EXPECT_EQ(0x1234, GetInt16(buf, 0));
|
||||
EXPECT_EQ(0x5677, GetInt16(buf, 2));
|
||||
|
||||
disk->SetBlockCount(0x1234567887654321);
|
||||
EXPECT_CALL(controller, DataIn());
|
||||
EXPECT_TRUE(disk->Dispatch(scsi_command::eCmdReadCapacity10));
|
||||
EXPECT_EQ(0xff, controller.GetBuffer()[0]);
|
||||
EXPECT_EQ(0xff, controller.GetBuffer()[1]);
|
||||
EXPECT_EQ(0xff, controller.GetBuffer()[2]);
|
||||
EXPECT_EQ(0xff, controller.GetBuffer()[3]);
|
||||
buf = controller.GetBuffer();
|
||||
EXPECT_EQ(0xffff, GetInt16(buf, 0));
|
||||
EXPECT_EQ(0xffff, GetInt16(buf, 2));
|
||||
}
|
||||
|
||||
TEST(DiskTest, ReadCapacity16)
|
||||
@@ -195,20 +193,20 @@ TEST(DiskTest, ReadCapacity16)
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
cmd[1] = 0x00;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Neither READ CAPACITY(16) nor READ LONG(16)";
|
||||
|
||||
// READ CAPACITY(16), not READ LONG(16)
|
||||
cmd[1] = 0x10;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "READ CAPACITY(16) must fail because drive is not ready";
|
||||
|
||||
disk->SetReady(true);
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "READ CAPACITY(16) must fail because the medium has no capacity";
|
||||
@@ -217,18 +215,13 @@ TEST(DiskTest, ReadCapacity16)
|
||||
disk->SetSectorSizeInBytes(1024);
|
||||
EXPECT_CALL(controller, DataIn());
|
||||
EXPECT_TRUE(disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16));
|
||||
EXPECT_EQ(0x12, controller.GetBuffer()[0]);
|
||||
EXPECT_EQ(0x34, controller.GetBuffer()[1]);
|
||||
EXPECT_EQ(0x56, controller.GetBuffer()[2]);
|
||||
EXPECT_EQ(0x78, controller.GetBuffer()[3]);
|
||||
EXPECT_EQ(0x87, controller.GetBuffer()[4]);
|
||||
EXPECT_EQ(0x65, controller.GetBuffer()[5]);
|
||||
EXPECT_EQ(0x43, controller.GetBuffer()[6]);
|
||||
EXPECT_EQ(0x20, controller.GetBuffer()[7]);
|
||||
EXPECT_EQ(0x00, controller.GetBuffer()[8]);
|
||||
EXPECT_EQ(0x00, controller.GetBuffer()[9]);
|
||||
EXPECT_EQ(0x04, controller.GetBuffer()[10]);
|
||||
EXPECT_EQ(0x00, controller.GetBuffer()[11]);
|
||||
const auto& buf = controller.GetBuffer();
|
||||
EXPECT_EQ(0x1234, GetInt16(buf, 0));
|
||||
EXPECT_EQ(0x5678, GetInt16(buf, 2));
|
||||
EXPECT_EQ(0x8765, GetInt16(buf, 4));
|
||||
EXPECT_EQ(0x4320, GetInt16(buf, 6));
|
||||
EXPECT_EQ(0x0000, GetInt16(buf, 8));
|
||||
EXPECT_EQ(0x0400, GetInt16(buf, 10));
|
||||
}
|
||||
|
||||
TEST(DiskTest, Read6)
|
||||
@@ -238,7 +231,7 @@ TEST(DiskTest, Read6)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdRead6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdRead6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "READ(6) must fail for a medium with 0 blocks";
|
||||
@@ -253,7 +246,7 @@ TEST(DiskTest, Read10)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdRead10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdRead10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "READ(10) must fail for a medium with 0 blocks";
|
||||
@@ -273,7 +266,7 @@ TEST(DiskTest, Read16)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdRead16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdRead16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "READ(16) must fail for a medium with 0 blocks";
|
||||
@@ -293,7 +286,7 @@ TEST(DiskTest, Write6)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdWrite6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdWrite6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "WRIte(6) must fail for a medium with 0 blocks";
|
||||
@@ -308,7 +301,7 @@ TEST(DiskTest, Write10)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdWrite10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdWrite10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "WRITE(10) must fail for a medium with 0 blocks";
|
||||
@@ -328,7 +321,7 @@ TEST(DiskTest, Write16)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdWrite16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdWrite16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "WRITE(16) must fail for a medium with 0 blocks";
|
||||
@@ -348,7 +341,7 @@ TEST(DiskTest, Verify10)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdVerify10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdVerify10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "VERIFY(10) must fail for a medium with 0 blocks";
|
||||
@@ -368,7 +361,7 @@ TEST(DiskTest, Verify16)
|
||||
|
||||
controller.AddDevice(disk);
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdVerify16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdVerify16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "VERIFY(16) must fail for a medium with 0 blocks";
|
||||
@@ -395,14 +388,14 @@ TEST(DiskTest, ReadLong10)
|
||||
EXPECT_EQ(status::GOOD, controller.GetStatus());
|
||||
|
||||
cmd[2] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadLong10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadLong10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "READ LONG(10) must fail because the capacity is exceeded";
|
||||
cmd[2] = 0;
|
||||
|
||||
cmd[7] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadLong10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadLong10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "READ LONG(10) must fail because it currently only supports 0 bytes transfer length";
|
||||
@@ -420,7 +413,7 @@ TEST(DiskTest, ReadLong16)
|
||||
// READ LONG(16), not READ CAPACITY(16)
|
||||
cmd[1] = 0x11;
|
||||
cmd[2] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "READ LONG(16) must fail because the capacity is exceeded";
|
||||
@@ -431,7 +424,7 @@ TEST(DiskTest, ReadLong16)
|
||||
EXPECT_EQ(status::GOOD, controller.GetStatus());
|
||||
|
||||
cmd[13] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdReadCapacity16_ReadLong16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "READ LONG(16) must fail because it currently only supports 0 bytes transfer length";
|
||||
@@ -451,14 +444,14 @@ TEST(DiskTest, WriteLong10)
|
||||
EXPECT_EQ(status::GOOD, controller.GetStatus());
|
||||
|
||||
cmd[2] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdWriteLong10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdWriteLong10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "WRITE LONG(10) must fail because the capacity is exceeded";
|
||||
cmd[2] = 0;
|
||||
|
||||
cmd[7] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdWriteLong10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdWriteLong10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "WRITE LONG(10) must fail because it currently only supports 0 bytes transfer length";
|
||||
@@ -474,7 +467,7 @@ TEST(DiskTest, WriteLong16)
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
cmd[2] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdWriteLong16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdWriteLong16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LBA_OUT_OF_RANGE))))
|
||||
<< "WRITE LONG(16) must fail because the capacity is exceeded";
|
||||
@@ -485,7 +478,7 @@ TEST(DiskTest, WriteLong16)
|
||||
EXPECT_EQ(status::GOOD, controller.GetStatus());
|
||||
|
||||
cmd[13] = 1;
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdWriteLong16); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdWriteLong16); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "WRITE LONG(16) must fail because it currently only supports 0 bytes transfer length";
|
||||
@@ -520,14 +513,14 @@ TEST(DiskTest, StartStopUnit)
|
||||
|
||||
disk->SetReady(false);
|
||||
EXPECT_CALL(*disk, FlushCache).Times(0);
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdStartStop); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdStartStop); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LOAD_OR_EJECT_FAILED))));
|
||||
|
||||
disk->SetReady(true);
|
||||
disk->SetLocked(true);
|
||||
EXPECT_CALL(*disk, FlushCache).Times(0);
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdStartStop); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdStartStop); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::LOAD_OR_EJECT_FAILED))));
|
||||
|
||||
@@ -554,7 +547,7 @@ TEST(DiskTest, PreventAllowMediumRemoval)
|
||||
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
EXPECT_THAT([&disk]() { disk->Dispatch(scsi_command::eCmdRemoval); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { disk->Dispatch(scsi_command::eCmdRemoval); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))))
|
||||
<< "REMOVAL must fail because drive is not ready";
|
||||
|
||||
@@ -69,7 +69,7 @@ TEST(HostServicesTest, StartStopUnit)
|
||||
|
||||
// START
|
||||
cmd[4] = 0x01;
|
||||
EXPECT_THAT([&services]() { services->Dispatch(scsi_command::eCmdStartStop); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { services->Dispatch(scsi_command::eCmdStartStop); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))));
|
||||
}
|
||||
@@ -81,13 +81,13 @@ TEST(HostServicesTest, ModeSense6)
|
||||
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
EXPECT_THAT([&services]() { services->Dispatch(scsi_command::eCmdModeSense6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { services->Dispatch(scsi_command::eCmdModeSense6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Unsupported mode page was returned";
|
||||
|
||||
cmd[2] = 0x20;
|
||||
EXPECT_THAT([&services]() { services->Dispatch(scsi_command::eCmdModeSense6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { services->Dispatch(scsi_command::eCmdModeSense6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Block descriptors are not supported";
|
||||
@@ -97,7 +97,7 @@ TEST(HostServicesTest, ModeSense6)
|
||||
cmd[4] = 255;
|
||||
EXPECT_CALL(controller, DataIn());
|
||||
EXPECT_TRUE(services->Dispatch(scsi_command::eCmdModeSense6));
|
||||
vector<BYTE>& buffer = controller.GetBuffer();
|
||||
vector<uint8_t>& buffer = controller.GetBuffer();
|
||||
// Major version 1
|
||||
EXPECT_EQ(0x01, buffer[6]);
|
||||
// Minor version 0
|
||||
@@ -122,13 +122,13 @@ TEST(HostServicesTest, ModeSense10)
|
||||
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
EXPECT_THAT([&services]() { services->Dispatch(scsi_command::eCmdModeSense10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { services->Dispatch(scsi_command::eCmdModeSense10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Unsupported mode page was returned";
|
||||
|
||||
cmd[2] = 0x20;
|
||||
EXPECT_THAT([&services]() { services->Dispatch(scsi_command::eCmdModeSense10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { services->Dispatch(scsi_command::eCmdModeSense10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Block descriptors are not supported";
|
||||
@@ -138,7 +138,7 @@ TEST(HostServicesTest, ModeSense10)
|
||||
cmd[8] = 255;
|
||||
EXPECT_CALL(controller, DataIn());
|
||||
EXPECT_TRUE(services->Dispatch(scsi_command::eCmdModeSense10));
|
||||
vector<BYTE>& buffer = controller.GetBuffer();
|
||||
vector<uint8_t>& buffer = controller.GetBuffer();
|
||||
// Major version 1
|
||||
EXPECT_EQ(0x01, buffer[10]);
|
||||
// Minor version 0
|
||||
|
||||
+13
-11
@@ -52,13 +52,13 @@ public:
|
||||
MOCK_METHOD(void, SetIO, (bool), (override));
|
||||
MOCK_METHOD(bool, GetREQ, (), (const override));
|
||||
MOCK_METHOD(void, SetREQ, (bool), (override));
|
||||
MOCK_METHOD(BYTE, GetDAT, (), (override));
|
||||
MOCK_METHOD(void, SetDAT, (BYTE), (override));
|
||||
MOCK_METHOD(uint8_t, GetDAT, (), (override));
|
||||
MOCK_METHOD(void, SetDAT, (uint8_t), (override));
|
||||
MOCK_METHOD(bool, GetDP, (), (const override));
|
||||
MOCK_METHOD(uint32_t, Acquire, (), (override));
|
||||
MOCK_METHOD(int, CommandHandShake, (BYTE *), (override));
|
||||
MOCK_METHOD(int, ReceiveHandShake, (BYTE *, int), (override));
|
||||
MOCK_METHOD(int, SendHandShake, (BYTE *, int, int), (override));
|
||||
MOCK_METHOD(int, CommandHandShake, (uint8_t *), (override));
|
||||
MOCK_METHOD(int, ReceiveHandShake, (uint8_t *, int), (override));
|
||||
MOCK_METHOD(int, SendHandShake, (uint8_t *, int, int), (override));
|
||||
MOCK_METHOD(bool, GetSignal, (int), (const override));
|
||||
MOCK_METHOD(void, SetSignal, (int, bool), (override));
|
||||
|
||||
@@ -98,7 +98,8 @@ class MockAbstractController : public AbstractController //NOSONAR Having many f
|
||||
FRIEND_TEST(AbstractControllerTest, ExtractInitiatorId);
|
||||
FRIEND_TEST(AbstractControllerTest, GetOpcode);
|
||||
FRIEND_TEST(AbstractControllerTest, GetLun);
|
||||
FRIEND_TEST(AbstractControllerTest, SetLength);
|
||||
FRIEND_TEST(AbstractControllerTest, Blocks);
|
||||
FRIEND_TEST(AbstractControllerTest, Length);
|
||||
FRIEND_TEST(AbstractControllerTest, UpdateOffsetAndLength);
|
||||
FRIEND_TEST(AbstractControllerTest, Offset);
|
||||
FRIEND_TEST(PrimaryDeviceTest, Inquiry);
|
||||
@@ -158,6 +159,7 @@ public:
|
||||
|
||||
// Permit access to all tests without the need for numerous FRIEND_TEST
|
||||
vector<int>& GetCmd() { return AbstractController::GetCmd(); } //NOSONAR Hides function on purpose
|
||||
shared_ptr<BUS> GetBus() { return AbstractController::GetBus(); } //NOSONAR Hides function on purpose
|
||||
};
|
||||
|
||||
class MockScsiController : public ScsiController
|
||||
@@ -183,7 +185,7 @@ public:
|
||||
using ScsiController::ScsiController;
|
||||
explicit MockScsiController(shared_ptr<NiceMock<MockBus>> bus, int target_id) : ScsiController(bus, target_id) {}
|
||||
explicit MockScsiController(shared_ptr<MockBus> bus, int target_id) : ScsiController(bus, target_id) {}
|
||||
MockScsiController(shared_ptr<MockBus> bus) : ScsiController(bus, 0) {}
|
||||
explicit MockScsiController(shared_ptr<MockBus> bus) : ScsiController(bus, 0) {}
|
||||
~MockScsiController() override = default;
|
||||
|
||||
};
|
||||
@@ -234,8 +236,8 @@ class MockModePageDevice : public ModePageDevice
|
||||
public:
|
||||
|
||||
MOCK_METHOD(vector<byte>, InquiryInternal, (), (const));
|
||||
MOCK_METHOD(int, ModeSense6, (const vector<int>&, vector<BYTE>&), (const override));
|
||||
MOCK_METHOD(int, ModeSense10, (const vector<int>&, vector<BYTE>&), (const override));
|
||||
MOCK_METHOD(int, ModeSense6, (const vector<int>&, vector<uint8_t>&), (const override));
|
||||
MOCK_METHOD(int, ModeSense10, (const vector<int>&, vector<uint8_t>&), (const override));
|
||||
|
||||
MockModePageDevice() : ModePageDevice(UNDEFINED, 0) {}
|
||||
~MockModePageDevice() override = default;
|
||||
@@ -277,8 +279,8 @@ public:
|
||||
|
||||
MOCK_METHOD(vector<byte>, InquiryInternal, (), (const));
|
||||
MOCK_METHOD(void, Open, (), (override));
|
||||
MOCK_METHOD(int, ModeSense6, (const vector<int>&, vector<BYTE>&), (const override));
|
||||
MOCK_METHOD(int, ModeSense10, (const vector<int>&, vector<BYTE>&), (const override));
|
||||
MOCK_METHOD(int, ModeSense6, (const vector<int>&, vector<uint8_t>&), (const override));
|
||||
MOCK_METHOD(int, ModeSense10, (const vector<int>&, vector<uint8_t>&), (const override));
|
||||
MOCK_METHOD(void, SetUpModePages, ((map<int, vector<byte>>&), int, bool), (const override));
|
||||
|
||||
MockStorageDevice() : StorageDevice(UNDEFINED, 0) {}
|
||||
|
||||
@@ -27,31 +27,39 @@ TEST(ModePageDeviceTest, SupportsSaveParameters)
|
||||
TEST(ModePageDeviceTest, AddModePages)
|
||||
{
|
||||
vector<int> cdb(6);
|
||||
vector<BYTE> buf(512);
|
||||
vector<uint8_t> buf(512);
|
||||
MockModePageDevice device;
|
||||
|
||||
// Page 0
|
||||
cdb[2] = 0x00;
|
||||
EXPECT_THROW(device.AddModePages(cdb, buf, 0, 12, 255), scsi_exception)
|
||||
EXPECT_THAT([&] { device.AddModePages(cdb, buf, 0, 12, 255); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Data were returned for non-existing mode page 0";
|
||||
|
||||
// All pages, non changeable
|
||||
cdb[2] = 0x3f;
|
||||
EXPECT_EQ(0, device.AddModePages(cdb, buf, 0, 0, 255));
|
||||
EXPECT_EQ(3, device.AddModePages(cdb, buf, 0, 3, 255));
|
||||
EXPECT_THROW(device.AddModePages(cdb, buf, 0, 12, -1), scsi_exception) << "Maximum size was ignored";
|
||||
EXPECT_THAT([&] { device.AddModePages(cdb, buf, 0, 12, -1); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Maximum size was ignored";
|
||||
|
||||
// All pages, changeable
|
||||
cdb[2]= 0x7f;
|
||||
EXPECT_EQ(0, device.AddModePages(cdb, buf, 0, 0, 255));
|
||||
EXPECT_EQ(3, device.AddModePages(cdb, buf, 0, 3, 255));
|
||||
EXPECT_THROW(device.AddModePages(cdb, buf, 0, 12, -1), scsi_exception) << "Maximum size was ignored";
|
||||
EXPECT_THAT([&] { device.AddModePages(cdb, buf, 0, 12, -1); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Maximum size was ignored";
|
||||
}
|
||||
|
||||
TEST(ModePageDeviceTest, Page0)
|
||||
{
|
||||
vector<int> cdb(6);
|
||||
vector<BYTE> buf(512);
|
||||
vector<uint8_t> buf(512);
|
||||
MockPage0ModePageDevice device;
|
||||
|
||||
cdb[2] = 0x3f;
|
||||
@@ -106,11 +114,15 @@ TEST(ModePageDeviceTest, ModeSelect)
|
||||
{
|
||||
MockModePageDevice device;
|
||||
vector<int> cmd;
|
||||
vector<BYTE> buf;
|
||||
vector<uint8_t> buf;
|
||||
|
||||
EXPECT_THROW(device.ModeSelect(scsi_command::eCmdModeSelect6, cmd, buf, 0), scsi_exception)
|
||||
EXPECT_THAT([&] { device.ModeSelect(scsi_command::eCmdModeSelect6, cmd, buf, 0); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_COMMAND_OPERATION_CODE))))
|
||||
<< "Unexpected MODE SELECT(6) default implementation";
|
||||
EXPECT_THROW(device.ModeSelect(scsi_command::eCmdModeSelect10, cmd, buf, 0), scsi_exception)
|
||||
EXPECT_THAT([&] { device.ModeSelect(scsi_command::eCmdModeSelect10, cmd, buf, 0); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_COMMAND_OPERATION_CODE))))
|
||||
<< "Unexpected MODE SELECT(10) default implementation";
|
||||
}
|
||||
|
||||
@@ -127,7 +139,7 @@ TEST(ModePageDeviceTest, ModeSelect6)
|
||||
EXPECT_TRUE(device->Dispatch(scsi_command::eCmdModeSelect6));
|
||||
|
||||
cmd[1] = 0x01;
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdModeSelect6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdModeSelect6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Saving parameters is not supported by base class";
|
||||
@@ -146,7 +158,7 @@ TEST(ModePageDeviceTest, ModeSelect10)
|
||||
EXPECT_TRUE(device->Dispatch(scsi_command::eCmdModeSelect10));
|
||||
|
||||
cmd[1] = 0x01;
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdModeSelect10); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdModeSelect10); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Saving parameters is not supported for by base class";
|
||||
|
||||
@@ -141,33 +141,33 @@ TEST(PrimaryDeviceTest, TestUnitReady)
|
||||
device->SetAttn(true);
|
||||
device->SetReady(false);
|
||||
EXPECT_CALL(controller, DataIn()).Times(0);
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::UNIT_ATTENTION),
|
||||
Property(&scsi_exception::get_asc, asc::POWER_ON_OR_RESET))));
|
||||
|
||||
device->SetReset(false);
|
||||
EXPECT_CALL(controller, DataIn()).Times(0);
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::UNIT_ATTENTION),
|
||||
Property(&scsi_exception::get_asc, asc::NOT_READY_TO_READY_CHANGE))));
|
||||
|
||||
device->SetReset(true);
|
||||
device->SetAttn(false);
|
||||
EXPECT_CALL(controller, DataIn()).Times(0);
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::UNIT_ATTENTION),
|
||||
Property(&scsi_exception::get_asc, asc::POWER_ON_OR_RESET))));
|
||||
|
||||
device->SetReset(false);
|
||||
device->SetAttn(true);
|
||||
EXPECT_CALL(controller, DataIn()).Times(0);
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::UNIT_ATTENTION),
|
||||
Property(&scsi_exception::get_asc, asc::NOT_READY_TO_READY_CHANGE))));
|
||||
|
||||
device->SetAttn(false);
|
||||
EXPECT_CALL(controller, DataIn()).Times(0);
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdTestUnitReady); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))));
|
||||
|
||||
@@ -222,14 +222,14 @@ TEST(PrimaryDeviceTest, Inquiry)
|
||||
|
||||
cmd[1] = 0x01;
|
||||
EXPECT_CALL(*controller, DataIn()).Times(0);
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdInquiry); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdInquiry); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "EVPD bit is not supported";
|
||||
|
||||
cmd[2] = 0x01;
|
||||
EXPECT_CALL(*controller, DataIn()).Times(0);
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdInquiry); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdInquiry); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "PAGE CODE field is not supported";
|
||||
@@ -257,7 +257,7 @@ TEST(PrimaryDeviceTest, RequestSense)
|
||||
cmd[4] = 255;
|
||||
|
||||
device->SetReady(false);
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdRequestSense); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdRequestSense); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))));
|
||||
|
||||
@@ -281,20 +281,20 @@ TEST(PrimaryDeviceTest, SendDiagnostic)
|
||||
EXPECT_EQ(status::GOOD, controller.GetStatus());
|
||||
|
||||
cmd[1] = 0x10;
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdSendDiag); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdSendDiag); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "SEND DIAGNOSTIC must fail because PF bit is not supported";
|
||||
cmd[1] = 0;
|
||||
|
||||
cmd[3] = 1;
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdSendDiag); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdSendDiag); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "SEND DIAGNOSTIC must fail because parameter list is not supported";
|
||||
cmd[3] = 0;
|
||||
cmd[4] = 1;
|
||||
EXPECT_THAT([&device]() { device->Dispatch(scsi_command::eCmdSendDiag); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device->Dispatch(scsi_command::eCmdSendDiag); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "SEND DIAGNOSTIC must fail because parameter list is not supported";
|
||||
@@ -320,7 +320,7 @@ TEST(PrimaryDeviceTest, ReportLuns)
|
||||
|
||||
EXPECT_CALL(controller, DataIn());
|
||||
EXPECT_TRUE(device1->Dispatch(scsi_command::eCmdReportLuns));
|
||||
const vector<BYTE>& buffer = controller.GetBuffer();
|
||||
const vector<uint8_t>& buffer = controller.GetBuffer();
|
||||
EXPECT_EQ(0x00, buffer[0]) << "Wrong data length";
|
||||
EXPECT_EQ(0x00, buffer[1]) << "Wrong data length";
|
||||
EXPECT_EQ(0x00, buffer[2]) << "Wrong data length";
|
||||
@@ -343,7 +343,7 @@ TEST(PrimaryDeviceTest, ReportLuns)
|
||||
EXPECT_EQ(LUN2, buffer[23]) << "Wrong LUN2 number";
|
||||
|
||||
cmd[2] = 0x01;
|
||||
EXPECT_THAT([&device1]() { device1->Dispatch(scsi_command::eCmdReportLuns); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { device1->Dispatch(scsi_command::eCmdReportLuns); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Only SELECT REPORT mode 0 is supported";
|
||||
@@ -371,7 +371,7 @@ TEST(PrimaryDeviceTest, Dispatch)
|
||||
|
||||
TEST(PrimaryDeviceTest, WriteByteSequence)
|
||||
{
|
||||
vector<BYTE> data;
|
||||
vector<uint8_t> data;
|
||||
MockPrimaryDevice device(0);
|
||||
|
||||
EXPECT_FALSE(device.WriteByteSequence(data, 0)) << "Primary device does not support writing byte sequences";
|
||||
|
||||
@@ -489,10 +489,10 @@ TEST_F(RascsiExecutorTest, ValidateImageFile)
|
||||
|
||||
string full_path;
|
||||
auto device = dynamic_pointer_cast<StorageDevice>(device_factory.CreateDevice(controller_manager, SCHD, 0, "test"));
|
||||
EXPECT_TRUE(executor.ValidateImageFile(context, device, "", full_path));
|
||||
EXPECT_TRUE(executor.ValidateImageFile(context, *device, "", full_path));
|
||||
EXPECT_TRUE(full_path.empty());
|
||||
|
||||
EXPECT_FALSE(executor.ValidateImageFile(context, device, "/non_existing_file", full_path));
|
||||
EXPECT_FALSE(executor.ValidateImageFile(context, *device, "/non_existing_file", full_path));
|
||||
EXPECT_TRUE(full_path.empty());
|
||||
}
|
||||
|
||||
@@ -589,47 +589,47 @@ TEST_F(RascsiExecutorTest, ValidateOperationAgainstDevice)
|
||||
|
||||
auto device = make_shared<MockPrimaryDevice>(0);
|
||||
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, ATTACH));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, DETACH));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, ATTACH));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, DETACH));
|
||||
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, START));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, STOP));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, INSERT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, EJECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, PROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, UNPROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, START));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, STOP));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, INSERT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, EJECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, PROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, UNPROTECT));
|
||||
|
||||
device->SetStoppable(true);
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, START));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, STOP));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, INSERT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, EJECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, PROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, UNPROTECT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, START));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, STOP));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, INSERT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, EJECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, PROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, UNPROTECT));
|
||||
|
||||
device->SetRemovable(true);
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, START));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, STOP));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, INSERT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, EJECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, PROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, UNPROTECT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, START));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, STOP));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, INSERT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, EJECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, PROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, UNPROTECT));
|
||||
|
||||
device->SetProtectable(true);
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, START));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, STOP));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, INSERT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, EJECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, PROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, device, UNPROTECT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, START));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, STOP));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, INSERT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, EJECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, PROTECT));
|
||||
EXPECT_FALSE(executor.ValidateOperationAgainstDevice(context, *device, UNPROTECT));
|
||||
|
||||
device->SetReady(true);
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, START));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, STOP));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, INSERT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, EJECT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, PROTECT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, device, UNPROTECT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, START));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, STOP));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, INSERT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, EJECT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, PROTECT));
|
||||
EXPECT_TRUE(executor.ValidateOperationAgainstDevice(context, *device, UNPROTECT));
|
||||
}
|
||||
|
||||
TEST_F(RascsiExecutorTest, ValidateIdAndLun)
|
||||
@@ -661,26 +661,26 @@ TEST_F(RascsiExecutorTest, SetProductData)
|
||||
|
||||
auto device = make_shared<MockPrimaryDevice>(0);
|
||||
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, *device));
|
||||
|
||||
definition.set_vendor("123456789");
|
||||
EXPECT_FALSE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_FALSE(executor.SetProductData(context, definition, *device));
|
||||
definition.set_vendor("1");
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, *device));
|
||||
definition.set_vendor("12345678");
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, *device));
|
||||
|
||||
definition.set_product("12345678901234567");
|
||||
EXPECT_FALSE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_FALSE(executor.SetProductData(context, definition, *device));
|
||||
definition.set_product("1");
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, *device));
|
||||
definition.set_product("1234567890123456");
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, *device));
|
||||
|
||||
definition.set_revision("12345");
|
||||
EXPECT_FALSE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_FALSE(executor.SetProductData(context, definition, *device));
|
||||
definition.set_revision("1");
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, *device));
|
||||
definition.set_revision("1234");
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, device));
|
||||
EXPECT_TRUE(executor.SetProductData(context, definition, *device));
|
||||
}
|
||||
|
||||
@@ -19,11 +19,13 @@ TEST(ScsiCommandUtilTest, ModeSelect6)
|
||||
const int LENGTH = 26;
|
||||
|
||||
vector<int> cdb(6);
|
||||
vector<BYTE> buf(LENGTH);
|
||||
vector<uint8_t> buf(LENGTH);
|
||||
|
||||
// PF (vendor-specific parameter format)
|
||||
cdb[1] = 0x00;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 0), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 0); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Vendor-specific parameters are not supported";
|
||||
|
||||
cdb[0] = 0x15;
|
||||
@@ -33,22 +35,30 @@ TEST(ScsiCommandUtilTest, ModeSelect6)
|
||||
buf[9] = 0x00;
|
||||
buf[10] = 0x02;
|
||||
buf[11] = 0x00;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 256), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 256); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Requested sector size does not match current sector size";
|
||||
|
||||
// Page 0
|
||||
buf[12] = 0x00;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 512), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 512); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Unsupported page 0 was not rejected";
|
||||
|
||||
// Page 3 (Format Device Page)
|
||||
buf[12] = 0x03;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 512), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 512); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Requested sector size does not match current sector size";
|
||||
|
||||
// Match the requested to the current sector size
|
||||
buf[24] = 0x02;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH - 1, 512), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH - 1, 512); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Not enough command parameters";
|
||||
|
||||
ModeSelect(scsi_command::eCmdModeSelect6, cdb, buf, LENGTH, 512);
|
||||
@@ -59,11 +69,13 @@ TEST(ScsiCommandUtilTest, ModeSelect10)
|
||||
const int LENGTH = 30;
|
||||
|
||||
vector<int> cdb(10);
|
||||
vector<BYTE> buf(LENGTH);
|
||||
vector<uint8_t> buf(LENGTH);
|
||||
|
||||
// PF (vendor-specific parameter format)
|
||||
cdb[1] = 0x00;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 0), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 0); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Vendor-specific parameters are not supported";
|
||||
|
||||
// PF (standard parameter format)
|
||||
@@ -72,22 +84,30 @@ TEST(ScsiCommandUtilTest, ModeSelect10)
|
||||
buf[13] = 0x00;
|
||||
buf[14] = 0x02;
|
||||
buf[15] = 0x00;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 256), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 256); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Requested sector size does not match current sector size";
|
||||
|
||||
// Page 0
|
||||
buf[16] = 0x00;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 512), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 512); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Unsupported page 0 was not rejected";
|
||||
|
||||
// Page 3 (Format Device Page)
|
||||
buf[16] = 0x03;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 512), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 512); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Requested sector size does not match current sector size";
|
||||
|
||||
// Match the requested to the current sector size
|
||||
buf[28] = 0x02;
|
||||
EXPECT_THROW(ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH - 1, 512), scsi_exception)
|
||||
EXPECT_THAT([&] { ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH - 1, 512); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_PARAMETER_LIST))))
|
||||
<< "Not enough command parameters";
|
||||
|
||||
ModeSelect(scsi_command::eCmdModeSelect10, cdb, buf, LENGTH, 512);
|
||||
@@ -129,7 +149,7 @@ TEST(ScsiCommandUtilTest, AddAppleVendorModePage)
|
||||
|
||||
TEST(ScsiCommandUtilTest, GetInt16)
|
||||
{
|
||||
vector<BYTE> b = { 0xfe, 0xdc };
|
||||
vector<uint8_t> b = { 0xfe, 0xdc };
|
||||
EXPECT_EQ(0xfedc, GetInt16(b, 0));
|
||||
|
||||
vector<int> v = { 0x12, 0x34 };
|
||||
@@ -164,7 +184,7 @@ TEST(ScsiCommandUtilTest, SetInt16)
|
||||
|
||||
TEST(ScsiCommandUtilTest, SetInt32)
|
||||
{
|
||||
vector<BYTE> buf(4);
|
||||
vector<uint8_t> buf(4);
|
||||
SetInt32(buf, 0, 0x12345678);
|
||||
EXPECT_EQ(0x12, buf[0]);
|
||||
EXPECT_EQ(0x34, buf[1]);
|
||||
@@ -181,7 +201,7 @@ TEST(ScsiCommandUtilTest, SetInt32)
|
||||
|
||||
TEST(ScsiCommandUtilTest, SetInt64)
|
||||
{
|
||||
vector<BYTE> buf(8);
|
||||
vector<uint8_t> buf(8);
|
||||
SetInt64(buf, 0, 0x1234567887654321);
|
||||
EXPECT_EQ(0x12, buf[0]);
|
||||
EXPECT_EQ(0x34, buf[1]);
|
||||
|
||||
@@ -36,7 +36,7 @@ TEST(ScsiDaynaportTest, TestUnitReady)
|
||||
|
||||
TEST(ScsiDaynaportTest, Read)
|
||||
{
|
||||
vector<BYTE> buf(0);
|
||||
vector<uint8_t> buf(0);
|
||||
NiceMock<MockAbstractController> controller(make_shared<MockBus>(), 0);
|
||||
auto daynaport = dynamic_pointer_cast<SCSIDaynaPort>(CreateDevice(SCDP, controller));
|
||||
|
||||
@@ -49,7 +49,7 @@ TEST(ScsiDaynaportTest, Read)
|
||||
|
||||
TEST(ScsiDaynaportTest, WriteBytes)
|
||||
{
|
||||
vector<BYTE> buf(0);
|
||||
vector<uint8_t> buf(0);
|
||||
NiceMock<MockAbstractController> controller(make_shared<MockBus>(), 0);
|
||||
auto daynaport = dynamic_pointer_cast<SCSIDaynaPort>(CreateDevice(SCDP, controller));
|
||||
|
||||
@@ -68,7 +68,7 @@ TEST(ScsiDaynaportTest, Read6)
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
cmd[5] = 0xff;
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdRead6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdRead6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Invalid data format";
|
||||
@@ -82,7 +82,7 @@ TEST(ScsiDaynaportTest, Write6)
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
cmd[5] = 0x00;
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdWrite6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdWrite6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Invalid transfer length";
|
||||
@@ -90,7 +90,7 @@ TEST(ScsiDaynaportTest, Write6)
|
||||
cmd[3] = -1;
|
||||
cmd[4] = -8;
|
||||
cmd[5] = 0x80;
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdWrite6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdWrite6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Invalid transfer length";
|
||||
@@ -98,7 +98,7 @@ TEST(ScsiDaynaportTest, Write6)
|
||||
cmd[3] = 0;
|
||||
cmd[4] = 0;
|
||||
cmd[5] = 0xff;
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdWrite6); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdWrite6); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Invalid transfer length";
|
||||
@@ -125,7 +125,7 @@ TEST(ScsiDaynaportTest, SetInterfaceMode)
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
// Unknown interface command
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdSetIfaceMode); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdSetIfaceMode); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_COMMAND_OPERATION_CODE))));
|
||||
|
||||
@@ -141,19 +141,19 @@ TEST(ScsiDaynaportTest, SetInterfaceMode)
|
||||
|
||||
// Not implemented
|
||||
cmd[5] = SCSIDaynaPort::CMD_SCSILINK_STATS;
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdSetIfaceMode); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdSetIfaceMode); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_COMMAND_OPERATION_CODE))));
|
||||
|
||||
// Not implemented
|
||||
cmd[5] = SCSIDaynaPort::CMD_SCSILINK_ENABLE;
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdSetIfaceMode); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdSetIfaceMode); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_COMMAND_OPERATION_CODE))));
|
||||
|
||||
// Not implemented
|
||||
cmd[5] = SCSIDaynaPort::CMD_SCSILINK_SET;
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdSetIfaceMode); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdSetIfaceMode); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_COMMAND_OPERATION_CODE))));
|
||||
}
|
||||
@@ -165,7 +165,7 @@ TEST(ScsiDaynaportTest, SetMcastAddr)
|
||||
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdSetMcastAddr); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdSetMcastAddr); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Length of 0 is not supported";
|
||||
@@ -183,13 +183,13 @@ TEST(ScsiDaynaportTest, EnableInterface)
|
||||
vector<int>& cmd = controller.GetCmd();
|
||||
|
||||
// Enable
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdEnableInterface); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdEnableInterface); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ABORTED_COMMAND),
|
||||
Property(&scsi_exception::get_asc, asc::NO_ADDITIONAL_SENSE_INFORMATION))));
|
||||
|
||||
// Disable
|
||||
cmd[5] = 0x80;
|
||||
EXPECT_THAT([&daynaport]() { daynaport->Dispatch(scsi_command::eCmdEnableInterface); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { daynaport->Dispatch(scsi_command::eCmdEnableInterface); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ABORTED_COMMAND),
|
||||
Property(&scsi_exception::get_asc, asc::NO_ADDITIONAL_SENSE_INFORMATION))));
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ TEST(ScsiPrinterTest, Print)
|
||||
|
||||
cmd[3] = 0xff;
|
||||
cmd[4] = 0xff;
|
||||
EXPECT_THAT([&printer]() { printer->Dispatch(scsi_command::eCmdPrint); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { printer->Dispatch(scsi_command::eCmdPrint); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ILLEGAL_REQUEST),
|
||||
Property(&scsi_exception::get_asc, asc::INVALID_FIELD_IN_CDB))))
|
||||
<< "Buffer overflow was not reported";
|
||||
@@ -112,7 +112,7 @@ TEST(ScsiPrinterTest, SynchronizeBuffer)
|
||||
NiceMock<MockAbstractController> controller(make_shared<MockBus>(), 0);
|
||||
auto printer = CreateDevice(SCLP, controller);
|
||||
|
||||
EXPECT_THAT([&printer]() { printer->Dispatch(scsi_command::eCmdSynchronizeBuffer); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { printer->Dispatch(scsi_command::eCmdSynchronizeBuffer); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::ABORTED_COMMAND),
|
||||
Property(&scsi_exception::get_asc, asc::NO_ADDITIONAL_SENSE_INFORMATION))))
|
||||
<< "Nothing to print";
|
||||
@@ -125,7 +125,7 @@ TEST(ScsiPrinterTest, WriteByteSequence)
|
||||
NiceMock<MockAbstractController> controller(make_shared<MockBus>(), 0);
|
||||
auto printer = dynamic_pointer_cast<SCSIPrinter>(CreateDevice(SCLP, controller));
|
||||
|
||||
vector<BYTE> buf(1);
|
||||
vector<uint8_t> buf(1);
|
||||
EXPECT_TRUE(printer->WriteByteSequence(buf, buf.size()));
|
||||
printer->Cleanup();
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ TEST(ScsiCdTest, ReadToc)
|
||||
|
||||
controller.AddDevice(cd);
|
||||
|
||||
EXPECT_THAT([&cd]() { cd->Dispatch(scsi_command::eCmdReadToc); }, Throws<scsi_exception>(AllOf(
|
||||
EXPECT_THAT([&] { cd->Dispatch(scsi_command::eCmdReadToc); }, Throws<scsi_exception>(AllOf(
|
||||
Property(&scsi_exception::get_sense_key, sense_key::NOT_READY),
|
||||
Property(&scsi_exception::get_asc, asc::MEDIUM_NOT_PRESENT))));
|
||||
|
||||
|
||||
@@ -57,14 +57,14 @@ TEST(ScsiHdNecTest, TestAddFormatPage)
|
||||
hd.SetUpModePages(pages, 0x03, false);
|
||||
EXPECT_EQ(1, pages.size()) << "Unexpected number of mode pages";
|
||||
vector<byte>& page_3 = pages[3];
|
||||
EXPECT_EQ(0x80, (int)page_3[0] & 0x80);
|
||||
EXPECT_EQ(0, (int)page_3[20]);
|
||||
EXPECT_EQ(0x80, to_integer<int>(page_3[0]) & 0x80);
|
||||
EXPECT_EQ(0, to_integer<int>(page_3[20]));
|
||||
|
||||
hd.SetRemovable(true);
|
||||
// Non changeable
|
||||
hd.SetUpModePages(pages, 0x03, false);
|
||||
page_3 = pages[3];
|
||||
EXPECT_EQ(0x20, (int)page_3[20]);
|
||||
EXPECT_EQ(0x20, to_integer<int>(page_3[20]));
|
||||
|
||||
pages.clear();
|
||||
// Changeable
|
||||
|
||||
@@ -97,7 +97,7 @@ TEST(ScsiHdTest, ModeSelect)
|
||||
const unordered_set<uint32_t> sector_sizes = { 512 };
|
||||
MockSCSIHD hd(0, sector_sizes, false);
|
||||
vector<int> cmd(10);
|
||||
vector<BYTE> buf(255);
|
||||
vector<uint8_t> buf(255);
|
||||
|
||||
hd.SetSectorSizeInBytes(512);
|
||||
|
||||
|
||||
@@ -65,8 +65,8 @@ TEST(ScsiMoTest, TestAddVendorPage)
|
||||
EXPECT_EQ(1, pages.size()) << "Unexpected number of mode pages";
|
||||
vector<byte>& page_32 = pages[32];
|
||||
EXPECT_EQ(12, page_32.size());
|
||||
EXPECT_EQ(0, (int)page_32[2]) << "Wrong format mode";
|
||||
EXPECT_EQ(0, (int)page_32[3]) << "Wrong format type";
|
||||
EXPECT_EQ(0, to_integer<int>(page_32[2])) << "Wrong format mode";
|
||||
EXPECT_EQ(0, to_integer<int>(page_32[3])) << "Wrong format type";
|
||||
EXPECT_EQ(0x12345678, GetInt32(page_32, 4)) << "Wrong number of blocks";
|
||||
EXPECT_EQ(0, GetInt16(page_32, 8)) << "Wrong number of spare blocks";
|
||||
EXPECT_EQ(0, GetInt16(page_32, 10));
|
||||
@@ -116,8 +116,8 @@ TEST(ScsiMoTest, TestAddVendorPage)
|
||||
|
||||
// Changeable page
|
||||
mo.SetUpModePages(pages, 0x20, true);
|
||||
EXPECT_EQ(0, (int)page_32[2]);
|
||||
EXPECT_EQ(0, (int)page_32[3]);
|
||||
EXPECT_EQ(0, to_integer<int>(page_32[2]));
|
||||
EXPECT_EQ(0, to_integer<int>(page_32[3]));
|
||||
EXPECT_EQ(0, GetInt32(page_32, 4));
|
||||
EXPECT_EQ(0, GetInt16(page_32, 8));
|
||||
EXPECT_EQ(0, GetInt16(page_32, 10));
|
||||
@@ -128,7 +128,7 @@ TEST(ScsiMoTest, ModeSelect)
|
||||
const unordered_set<uint32_t> sector_sizes = { 1024, 2048 };
|
||||
MockSCSIMO mo(0, sector_sizes);
|
||||
vector<int> cmd(10);
|
||||
vector<BYTE> buf(255);
|
||||
vector<uint8_t> buf(255);
|
||||
|
||||
mo.SetSectorSizeInBytes(2048);
|
||||
|
||||
|
||||
+10
-11
@@ -22,8 +22,7 @@ using namespace filesystem;
|
||||
shared_ptr<PrimaryDevice> CreateDevice(PbDeviceType type, MockAbstractController& controller, const string& extension)
|
||||
{
|
||||
DeviceFactory device_factory;
|
||||
auto bus = make_shared<MockBus>();
|
||||
auto controller_manager = make_shared<ControllerManager>(bus);
|
||||
auto controller_manager = make_shared<ControllerManager>(controller.GetBus());
|
||||
|
||||
auto device = device_factory.CreateDevice(*controller_manager, type, 0, extension);
|
||||
|
||||
@@ -44,11 +43,11 @@ void TestInquiry(PbDeviceType type, device_type t, scsi_level l, const string& i
|
||||
cmd[4] = 255;
|
||||
EXPECT_CALL(controller, DataIn());
|
||||
EXPECT_TRUE(device->Dispatch(scsi_command::eCmdInquiry));
|
||||
const vector<BYTE>& buffer = controller.GetBuffer();
|
||||
EXPECT_EQ((int)t, buffer[0]);
|
||||
const vector<uint8_t>& buffer = controller.GetBuffer();
|
||||
EXPECT_EQ(t, static_cast<device_type>(buffer[0]));
|
||||
EXPECT_EQ(removable ? 0x80: 0x00, buffer[1]);
|
||||
EXPECT_EQ((int)l, buffer[2]);
|
||||
EXPECT_EQ((int)l > (int)scsi_level::SCSI_2 ? (int)scsi_level::SCSI_2 : (int)l, buffer[3]);
|
||||
EXPECT_EQ(l, static_cast<scsi_level>(buffer[2]));
|
||||
EXPECT_EQ(l > scsi_level::SCSI_2 ? scsi_level::SCSI_2 : l, static_cast<scsi_level>(buffer[3]));
|
||||
EXPECT_EQ(additional_length, buffer[4]);
|
||||
string product_data;
|
||||
if (ident.size() == 24) {
|
||||
@@ -96,15 +95,15 @@ path CreateTempFile(int size)
|
||||
|
||||
int GetInt16(const vector<byte>& buf, int offset)
|
||||
{
|
||||
assert(buf.size() > (size_t)offset + 1);
|
||||
assert(buf.size() > static_cast<size_t>(offset) + 1);
|
||||
|
||||
return ((int)buf[offset] << 8) | (int)buf[offset + 1];
|
||||
return (to_integer<int>(buf[offset]) << 8) | to_integer<int>(buf[offset + 1]);
|
||||
}
|
||||
|
||||
uint32_t GetInt32(const vector<byte>& buf, int offset)
|
||||
{
|
||||
assert(buf.size() > (size_t)offset + 3);
|
||||
assert(buf.size() > static_cast<size_t>(offset) + 3);
|
||||
|
||||
return ((uint32_t)buf[offset] << 24) | ((uint32_t)buf[offset + 1] << 16) |
|
||||
((uint32_t)buf[offset + 2] << 8) | (uint32_t)buf[offset + 3];
|
||||
return (to_integer<uint32_t>(buf[offset]) << 24) | (to_integer<uint32_t>(buf[offset + 1]) << 16) |
|
||||
(to_integer<uint32_t>(buf[offset + 2]) << 8) | to_integer<uint32_t>(buf[offset + 3]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user