Disk: Predictable behavior for zero length reads
parent
f8a46b7196
commit
4ef8fe8794
|
|
@ -6,6 +6,9 @@ using namespace icsneo::Disk;
|
||||||
|
|
||||||
optional<uint64_t> ReadDriver::readLogicalDisk(Communication& com, device_eventhandler_t report,
|
optional<uint64_t> ReadDriver::readLogicalDisk(Communication& com, device_eventhandler_t report,
|
||||||
uint64_t pos, uint8_t* into, uint64_t amount, std::chrono::milliseconds timeout) {
|
uint64_t pos, uint8_t* into, uint64_t amount, std::chrono::milliseconds timeout) {
|
||||||
|
if(amount == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
optional<uint64_t> ret;
|
optional<uint64_t> ret;
|
||||||
|
|
||||||
// Read into here if we can't read directly into the user buffer
|
// Read into here if we can't read directly into the user buffer
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,9 @@ const APIEvent::Severity WriteDriver::NonatomicSeverity = APIEvent::Severity::Ev
|
||||||
|
|
||||||
optional<uint64_t> WriteDriver::writeLogicalDisk(Communication& com, device_eventhandler_t report, ReadDriver& readDriver,
|
optional<uint64_t> WriteDriver::writeLogicalDisk(Communication& com, device_eventhandler_t report, ReadDriver& readDriver,
|
||||||
uint64_t pos, const uint8_t* from, uint64_t amount, std::chrono::milliseconds timeout) {
|
uint64_t pos, const uint8_t* from, uint64_t amount, std::chrono::milliseconds timeout) {
|
||||||
|
if(amount == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
optional<uint64_t> ret;
|
optional<uint64_t> ret;
|
||||||
|
|
||||||
const uint32_t idealBlockSize = getBlockSizeBounds().second;
|
const uint32_t idealBlockSize = getBlockSizeBounds().second;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,15 @@ TEST_F(DiskDriverTest, Read) {
|
||||||
EXPECT_EQ(driver->readCalls, 1u);
|
EXPECT_EQ(driver->readCalls, 1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DiskDriverTest, ReadZero) {
|
||||||
|
uint8_t b = 0xCDu;
|
||||||
|
const auto amountRead = readLogicalDisk(0, &b, 0);
|
||||||
|
EXPECT_TRUE(amountRead.has_value());
|
||||||
|
EXPECT_EQ(amountRead, 0u);
|
||||||
|
EXPECT_EQ(b, 0xCDu);
|
||||||
|
EXPECT_EQ(driver->readCalls, 0u);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(DiskDriverTest, ReadUnaligned) {
|
TEST_F(DiskDriverTest, ReadUnaligned) {
|
||||||
std::array<uint8_t, 120> buf;
|
std::array<uint8_t, 120> buf;
|
||||||
buf.fill(0u);
|
buf.fill(0u);
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,17 @@ TEST_F(DiskDriverTest, Write) {
|
||||||
EXPECT_EQ(driver->writeCalls, 1u);
|
EXPECT_EQ(driver->writeCalls, 1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DiskDriverTest, WriteZero) {
|
||||||
|
uint8_t b = 0xCDu;
|
||||||
|
const auto amountWritten = writeLogicalDisk(0, &b, 0);
|
||||||
|
EXPECT_TRUE(amountWritten.has_value());
|
||||||
|
EXPECT_EQ(amountWritten, 0u);
|
||||||
|
EXPECT_EQ(driver->mockDisk[0], TEST_STRING[0]);
|
||||||
|
EXPECT_EQ(driver->atomicityChecks, 0u);
|
||||||
|
EXPECT_EQ(driver->readCalls, 0u);
|
||||||
|
EXPECT_EQ(driver->writeCalls, 0u);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(DiskDriverTest, WriteNoAtomicityCheck) {
|
TEST_F(DiskDriverTest, WriteNoAtomicityCheck) {
|
||||||
driver->supportsAtomic = false;
|
driver->supportsAtomic = false;
|
||||||
expectedErrors.push({ APIEvent::Type::AtomicOperationCompletedNonatomically, APIEvent::Severity::EventInfo });
|
expectedErrors.push({ APIEvent::Type::AtomicOperationCompletedNonatomically, APIEvent::Severity::EventInfo });
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue