aboutsummaryrefslogtreecommitdiff
path: root/kernel/kernel/test_support/filesystems/ext2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kernel/test_support/filesystems/ext2.cpp')
-rw-r--r--kernel/kernel/test_support/filesystems/ext2.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/kernel/kernel/test_support/filesystems/ext2.cpp b/kernel/kernel/test_support/filesystems/ext2.cpp
new file mode 100644
index 00000000..d9008ade
--- /dev/null
+++ b/kernel/kernel/test_support/filesystems/ext2.cpp
@@ -0,0 +1,80 @@
+#include <kernel/test_support/filesystems/ext2.hpp>
+
+#include <kernel/filesystems/ext2/block_group_descriptor.hpp>
+#include <kernel/filesystems/ext2/filesystem.hpp>
+#include <kernel/filesystems/ext2/inode.hpp>
+#include <kernel/filesystems/ext2/superblock.hpp>
+#include <kernel/test_support/devices/block_device.hpp>
+
+#include <kstd/units.hpp>
+
+#include <cstdint>
+#include <cstring>
+
+using namespace kstd::units_literals;
+
+namespace kernel::tests::filesystems::ext2
+{
+ namespace
+ {
+ constexpr uint32_t root_directory_data_block = 20;
+ } // namespace
+
+ auto write_bytes(kernel::tests::devices::block_device & device, kstd::bytes offset, void const * source,
+ kstd::bytes size) -> void
+ {
+ auto const required_size = offset + size;
+ if (kstd::bytes{device.data.size()} < required_size)
+ {
+ device.data.resize(required_size.value, 0);
+ }
+
+ std::memcpy(device.data.data() + offset, source, size.value);
+ }
+
+ auto write_u32(kernel::tests::devices::block_device & device, kstd::bytes offset, uint32_t value) -> void
+ {
+ write_bytes(device, offset, &value, kstd::size_of(value));
+ }
+
+ auto setup_mock_ext2_layout(kernel::tests::devices::block_device & device) -> void
+ {
+ auto superblock = kernel::filesystems::ext2::superblock{};
+ superblock.magic = kernel::filesystems::ext2::constants::magic_number;
+ superblock.log_block_size = 0;
+ superblock.blocks_count = 64;
+ superblock.blocks_per_group = 64;
+ superblock.inodes_per_group = 32;
+ superblock.rev_level = 1;
+ superblock.inode_size = 128;
+ setup_mock_ext2_layout(device, superblock);
+ }
+
+ auto setup_mock_ext2_layout(kernel::tests::devices::block_device & device,
+ kernel::filesystems::ext2::superblock const & superblock) -> void
+ {
+ auto group_descriptor = kernel::filesystems::ext2::block_group_descriptor{};
+ group_descriptor.inode_table = 5;
+
+ setup_mock_ext2_layout(device, superblock, group_descriptor);
+ }
+
+ auto setup_mock_ext2_layout(kernel::tests::devices::block_device & device,
+ kernel::filesystems::ext2::superblock const & superblock,
+ kernel::filesystems::ext2::block_group_descriptor const & group_descriptor) -> void
+ {
+ write_bytes(device, kernel::filesystems::ext2::constants::superblock_offset, &superblock,
+ kstd::size_of(superblock));
+ write_bytes(device, 2048_B, &group_descriptor, kstd::size_of(group_descriptor));
+
+ auto root_inode_data = kernel::filesystems::ext2::inode_data{};
+ root_inode_data.mode = kernel::filesystems::ext2::constants::mode_directory;
+ root_inode_data.blocks = 2;
+ root_inode_data.block[0] = root_directory_data_block;
+
+ auto const root_inode_offset =
+ static_cast<size_t>(group_descriptor.inode_table) * kernel::filesystems::ext2::constants::base_block_size +
+ (kernel::filesystems::ext2::constants::root_inode_number - 1) * kstd::bytes{superblock.inode_size};
+ write_bytes(device, root_inode_offset, &root_inode_data, kstd::size_of(root_inode_data));
+ }
+} // namespace kernel::tests::filesystems::ext2 \ No newline at end of file