aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/ext2/inode.tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/filesystem/ext2/inode.tests.cpp')
-rw-r--r--kernel/src/filesystem/ext2/inode.tests.cpp90
1 files changed, 88 insertions, 2 deletions
diff --git a/kernel/src/filesystem/ext2/inode.tests.cpp b/kernel/src/filesystem/ext2/inode.tests.cpp
index 49ba21b..783d930 100644
--- a/kernel/src/filesystem/ext2/inode.tests.cpp
+++ b/kernel/src/filesystem/ext2/inode.tests.cpp
@@ -1,5 +1,6 @@
#include <kernel/filesystem/ext2/inode.hpp>
+#include "kernel/filesystem/ext2/superblock.hpp"
#include <kernel/devices/storage/management.hpp>
#include <kernel/filesystem/device_inode.hpp>
#include <kernel/filesystem/ext2/filesystem.hpp>
@@ -127,7 +128,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, "Ext2 in
SCENARIO("Ext2 inode read stops when block mapping resolves to zero", "[filesystem][ext2][inode]")
{
- auto const block_size = 1024;
+ auto const block_size = 1024uz;
GIVEN("an ext2 inode without mapped data blocks")
{
auto device = kstd::make_shared<kernel::tests::devices::block_device>(0, 0, "mock", block_size, 64 * block_size);
@@ -156,7 +157,7 @@ SCENARIO("Ext2 inode read stops when block mapping resolves to zero", "[filesyst
SCENARIO("Ext2 inode read across block boundaries", "[filesystem][ext2][inode]")
{
- auto const block_size = 1024;
+ auto const block_size = 1024uz;
GIVEN("an ext2 inode with two direct blocks and a block size of 1024 bytes")
{
auto device = kstd::make_shared<kernel::tests::devices::block_device>(0, 0, "mock", block_size, 64 * block_size);
@@ -203,3 +204,88 @@ SCENARIO("Ext2 inode write is not implemented", "[filesystem][ext2][inode]")
}
}
}
+
+SCENARIO("Ext2 inode get_size() correctly returns size depending on revision level", "[filesystem][ext2][inode]")
+{
+ auto const block_size = 1024uz;
+
+ auto superblock = kernel::filesystem::ext2::superblock{};
+ superblock.magic = kernel::filesystem::ext2::constants::magic_number;
+ superblock.log_block_size = 0;
+ superblock.blocks_count = 64;
+ superblock.blocks_per_group = 64;
+ superblock.inodes_per_group = 32;
+ superblock.inode_size = 128;
+
+ GIVEN("an ext2 inode with good old revision and inode_data.size = 256, inode_data.dir_acl = 32")
+ {
+ superblock.rev_level = 0;
+
+ auto device = kstd::make_shared<kernel::tests::devices::block_device>(0, 0, "mock", block_size, 64 * block_size);
+ REQUIRE(device != nullptr);
+ kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device, superblock);
+
+ auto dev_inode = kstd::make_shared<kernel::filesystem::device_inode>(device);
+
+ auto fs = kernel::filesystem::ext2::filesystem{};
+ REQUIRE(fs.mount(dev_inode) == kernel::filesystem::filesystem::operation_result::success);
+
+ auto data = kernel::filesystem::ext2::inode_data{};
+ data.size = 256;
+ data.dir_acl = 32;
+
+ THEN("the inode size is 256 if mode = regular")
+ {
+ data.mode = kernel::filesystem::ext2::constants::mode_regular;
+
+ auto inode = kernel::filesystem::ext2::inode{&fs, data};
+
+ REQUIRE(inode.get_size() == 256);
+ }
+
+ THEN("the inode size is 256 if mode = directory")
+ {
+ data.mode = kernel::filesystem::ext2::constants::mode_directory;
+
+ auto inode = kernel::filesystem::ext2::inode{&fs, data};
+
+ REQUIRE(inode.get_size() == 256);
+ }
+ }
+
+ GIVEN("an ext2 inode with good dynamic revision and inode_data.size = 256, inode_data.dir_acl = 32")
+ {
+ superblock.rev_level = 1;
+
+ auto device = kstd::make_shared<kernel::tests::devices::block_device>(0, 0, "mock", block_size, 64 * block_size);
+ REQUIRE(device != nullptr);
+ kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device, superblock);
+
+ auto dev_inode = kstd::make_shared<kernel::filesystem::device_inode>(device);
+
+ auto fs = kernel::filesystem::ext2::filesystem{};
+ REQUIRE(fs.mount(dev_inode) == kernel::filesystem::filesystem::operation_result::success);
+
+ auto data = kernel::filesystem::ext2::inode_data{};
+ data.size = 256;
+ data.dir_acl = 32;
+
+ THEN("the inode size is 256 if mode = regular")
+ {
+ data.mode = kernel::filesystem::ext2::constants::mode_regular;
+
+ auto inode = kernel::filesystem::ext2::inode{&fs, data};
+
+ REQUIRE(inode.get_size() == 0x0000'0020'0000'0100);
+ }
+
+ THEN("the inode size is 256 if mode = directory")
+ {
+ data.mode = kernel::filesystem::ext2::constants::mode_directory;
+
+ auto inode = kernel::filesystem::ext2::inode{&fs, data};
+
+ REQUIRE(inode.get_size() == 256);
+ }
+ }
+} \ No newline at end of file