#include "kernel/filesystem/device_inode.hpp" #include "kernel/test_support/cpu.hpp" #include "kernel/test_support/devices/block_device.hpp" #include "kernel/test_support/devices/character_device.hpp" #include #include #include #include #include #include SCENARIO("Device inode construction", "[filesystem][device_inode]") { GIVEN("a block device") { auto device = kstd::make_shared(0, 0, "test_block_device", 512, 3 * 512); WHEN("constructing a device inode with the block device") { auto inode = kernel::filesystem::device_inode{device}; THEN("the device inode has the correct device") { REQUIRE(inode.device() == device); } THEN("the device inode has the correct kind") { REQUIRE(inode.is_device()); REQUIRE_FALSE(inode.is_directory()); REQUIRE_FALSE(inode.is_regular()); } } WHEN("constructing a device inode with a null device") { THEN("the constructor panics") { REQUIRE_THROWS_AS((kernel::filesystem::device_inode{nullptr}), kernel::tests::cpu::halt); } } } } SCENARIO("Device inode read/write", "[filesystem][device_inode]") { GIVEN("a block device and a device inode for that device") { auto device = kstd::make_shared(0, 0, "test_block_device", 512, 3 * 512); auto inode = kernel::filesystem::device_inode{device}; WHEN("writing to the device inode") { kstd::vector write_buffer(1024); for (size_t i = 0; i < write_buffer.size(); ++i) { write_buffer[i] = static_cast(i % 256); } auto bytes_written = inode.write(write_buffer.data(), 256, write_buffer.size()); THEN("the correct number of bytes is written") { REQUIRE(bytes_written == 1024); } THEN("the data written matches the data read back from the device inode") { kstd::vector read_buffer(1024); auto bytes_read = inode.read(read_buffer.data(), 256, read_buffer.size()); REQUIRE(bytes_read == write_buffer.size()); REQUIRE(read_buffer == write_buffer); } } } } SCENARIO("Device inode read/write with a non-block device", "[filesystem][device_inode]") { GIVEN("a non-block device and a device inode for that device") { auto device = kstd::make_shared(0, 0, "test_character_device"); auto inode = kernel::filesystem::device_inode{device}; WHEN("reading from the device inode") { kstd::vector read_buffer(512); THEN("the system panics") { REQUIRE_THROWS_AS(inode.read(read_buffer.data(), 0, read_buffer.size()), kernel::tests::cpu::halt); } } WHEN("writing to the device inode") { kstd::vector write_buffer(512); THEN("the system panics") { REQUIRE_THROWS_AS(inode.write(write_buffer.data(), 0, write_buffer.size()), kernel::tests::cpu::halt); } } } }