diff options
Diffstat (limited to 'kernel/kernel/test_support/filesystems/ext2.cpp')
| -rw-r--r-- | kernel/kernel/test_support/filesystems/ext2.cpp | 80 |
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 |
