Disk: Predictable behavior for zero length reads

v0.3.0-dev
Paul Hollinsky 2022-02-28 01:54:21 -05:00
parent f8a46b7196
commit 4ef8fe8794
4 changed files with 26 additions and 0 deletions

View File

@ -6,6 +6,9 @@ using namespace icsneo::Disk;
optional<uint64_t> ReadDriver::readLogicalDisk(Communication& com, device_eventhandler_t report,
uint64_t pos, uint8_t* into, uint64_t amount, std::chrono::milliseconds timeout) {
if(amount == 0)
return 0;
optional<uint64_t> ret;
// Read into here if we can't read directly into the user buffer

View File

@ -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,
uint64_t pos, const uint8_t* from, uint64_t amount, std::chrono::milliseconds timeout) {
if(amount == 0)
return 0;
optional<uint64_t> ret;
const uint32_t idealBlockSize = getBlockSizeBounds().second;

View File

@ -11,6 +11,15 @@ TEST_F(DiskDriverTest, Read) {
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) {
std::array<uint8_t, 120> buf;
buf.fill(0u);

View File

@ -12,6 +12,17 @@ TEST_F(DiskDriverTest, Write) {
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) {
driver->supportsAtomic = false;
expectedErrors.push({ APIEvent::Type::AtomicOperationCompletedNonatomically, APIEvent::Severity::EventInfo });