aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel/filesystems/fat32/boot_sector.hpp6
-rw-r--r--kernel/kernel/filesystems/fat32/filesystem.tests.cpp51
l---------kernel/kernel/test_support/vfs/test_assets/fat32.img1
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