#include #include #include #include #include #include #include #include #include SCENARIO("Mount construction", "[filesystem][mount]") { GIVEN("a filesystem and a root dentry") { auto fs = kstd::make_shared(); auto root_inode = kstd::make_shared(); auto root_dentry = kstd::make_shared(nullptr, root_inode, "/"); WHEN("constructing a mount with the filesystem and root dentry") { auto mount = kernel::filesystem::mount{root_dentry, root_dentry, fs, nullptr}; THEN("the mount has the correct filesystem, root dentry, mount dentry, and mount path") { REQUIRE(mount.get_filesystem() == fs); REQUIRE(mount.get_root_dentry() == root_dentry); REQUIRE(mount.get_mount_dentry() == root_dentry); REQUIRE(mount.get_mount_path() == "/"); REQUIRE(mount.is_ready_to_unmount()); } THEN("the mount has no parent mount") { REQUIRE(mount.get_parent_mount() == nullptr); } } WHEN("constructing a mount with a null filesystem") { THEN("the constructor panics") { REQUIRE_THROWS_AS((kernel::filesystem::mount{root_dentry, root_dentry, nullptr, nullptr}), kernel::tests::cpu::halt); } } } } SCENARIO("Mount reference counting", "[filesystem][mount]") { GIVEN("a filesystem and a root dentry") { auto fs = kstd::make_shared(); auto root_inode = kstd::make_shared(); auto root_dentry = kstd::make_shared(nullptr, root_inode, "/"); THEN("reference count can be incremented and decremented, the mount is ready to unmount when the reference " "count == 0") { auto mount = kernel::filesystem::mount{root_dentry, root_dentry, fs, nullptr}; mount.increment_ref_count(); REQUIRE(mount.get_ref_count() == 1); REQUIRE_FALSE(mount.is_ready_to_unmount()); mount.increment_ref_count(); REQUIRE(mount.get_ref_count() == 2); REQUIRE_FALSE(mount.is_ready_to_unmount()); REQUIRE(mount.decrement_ref_count()); REQUIRE(mount.get_ref_count() == 1); REQUIRE_FALSE(mount.is_ready_to_unmount()); REQUIRE(mount.decrement_ref_count()); REQUIRE(mount.get_ref_count() == 0); REQUIRE(mount.is_ready_to_unmount()); } THEN("decrementing reference count when it is already zero does not decrement it below zero") { auto mount = kernel::filesystem::mount{root_dentry, root_dentry, fs, nullptr}; REQUIRE_FALSE(mount.decrement_ref_count()); REQUIRE(mount.get_ref_count() == 0); REQUIRE(mount.is_ready_to_unmount()); } } }