diff options
| -rw-r--r-- | kernel/kernel/filesystems/fat32/boot_sector.hpp | 6 | ||||
| -rw-r--r-- | kernel/kernel/filesystems/fat32/filesystem.tests.cpp | 51 | ||||
| l--------- | kernel/kernel/test_support/vfs/test_assets/fat32.img | 1 |
3 files changed, 55 insertions, 3 deletions
diff --git a/kernel/kernel/filesystems/fat32/boot_sector.hpp b/kernel/kernel/filesystems/fat32/boot_sector.hpp index 10f31672..b5789b92 100644 --- a/kernel/kernel/filesystems/fat32/boot_sector.hpp +++ b/kernel/kernel/filesystems/fat32/boot_sector.hpp @@ -37,14 +37,14 @@ namespace kernel::filesystems::fat32 std::uint32_t root_cluster; std::uint16_t filesystem_info_sector; std::uint16_t backup_boot_sector; - std::array<std::uint8_t, 12> reserved; + std::array<std::uint8_t, 12> reserved; // NOLINT(readability-magic-numbers) std::uint8_t drive_number; std::uint8_t reserved1; std::uint8_t extended_boot_signature; std::uint32_t volume_id; - std::array<char, 11> volume_label; // NOLINT + std::array<char, 11> volume_label; // NOLINT(readability-magic-numbers) std::array<char, 8> filesystem_type; - std::array<std::uint8_t, 420> boot_code; // NOLINT + std::array<std::uint8_t, 420> boot_code; // NOLINT(readability-magic-numbers) std::uint16_t boot_signature; }; diff --git a/kernel/kernel/filesystems/fat32/filesystem.tests.cpp b/kernel/kernel/filesystems/fat32/filesystem.tests.cpp index cc35cd74..8e4bc8c1 100644 --- a/kernel/kernel/filesystems/fat32/filesystem.tests.cpp +++ b/kernel/kernel/filesystems/fat32/filesystem.tests.cpp @@ -1,15 +1,25 @@ #include <kernel/filesystems/fat32/filesystem.hpp> +#include <kernel/devices/storage.hpp> +#include <kernel/filesystems/fat32/error.hpp> +#include <kernel/test_support/devices/block_device.hpp> +#include <kernel/test_support/vfs/storage_boot_module_fixture.hpp> +#include <kernel/vfs/device_inode.hpp> #include <kernel/vfs/filesystem.hpp> #include <kapi/filesystem.hpp> #include <kstd/memory.hpp> #include <kstd/print.hpp> +#include <kstd/units.hpp> #include <kstd/vector.hpp> #include <catch2/catch_test_macros.hpp> +#include <filesystem> + +using namespace kstd::units_literals; + SCENARIO("fat32 filesystem mount and lookup", "[filesystem][fat32][filesystem]") { GIVEN("a mounted fat32 filesystem") @@ -46,3 +56,44 @@ SCENARIO("fat32 filesystem mount and lookup", "[filesystem][fat32][filesystem]") } } } + +SCENARIO_METHOD(kernel::tests::vfs::storage_boot_module_fixture, "Fat32 filesystem probe with real image", + "[filesystem][fat32][filesystem][img]") +{ + auto const image_path = std::filesystem::path{KERNEL_TEST_ASSETS_DIR} / "fat32.img"; + + GIVEN("a block device containing a fat32 image") + { + REQUIRE(std::filesystem::exists(image_path)); + REQUIRE_NOTHROW(setup_modules_from_img({"test_img_module"}, {image_path})); + + auto boot_device = kernel::devices::storage::determine_boot_device(); + REQUIRE(boot_device); + + auto dev_inode = kstd::make_shared<kernel::vfs::device_inode>(boot_device); + auto fs = kstd::make_shared<kernel::filesystems::fat32::filesystem>(); + + THEN("probe accepts the boot sector") + { + REQUIRE(fs->probe(dev_inode)); + } + } +} + +SCENARIO("Fat32 filesystem rejects invalid boot signature", "[filesystem][fat32][filesystem]") +{ + auto const block_size = 512_B; + GIVEN("a block device that does not contain a fat32 boot sector") + { + auto device = kstd::make_shared<kernel::tests::devices::block_device>("mock", block_size, 2 * block_size); + REQUIRE(device); + + auto dev_inode = kstd::make_shared<kernel::vfs::device_inode>(device); + auto fs = kstd::make_shared<kernel::filesystems::fat32::filesystem>(); + + THEN("probe fails with invalid_boot_signature") + { + REQUIRE(fs->probe(dev_inode).error() == kernel::filesystems::fat32::errc::invalid_boot_signature); + } + } +} diff --git a/kernel/kernel/test_support/vfs/test_assets/fat32.img b/kernel/kernel/test_support/vfs/test_assets/fat32.img new file mode 120000 index 00000000..31031c9f --- /dev/null +++ b/kernel/kernel/test_support/vfs/test_assets/fat32.img @@ -0,0 +1 @@ +../../../../../arch/x86_64/support/modules/fat32.img
\ No newline at end of file |
