aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/rootfs
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/filesystem/rootfs')
-rw-r--r--kernel/src/filesystem/rootfs/filesystem.cpp5
-rw-r--r--kernel/src/filesystem/rootfs/filesystem.tests.cpp45
-rw-r--r--kernel/src/filesystem/rootfs/inode.tests.cpp83
3 files changed, 131 insertions, 2 deletions
diff --git a/kernel/src/filesystem/rootfs/filesystem.cpp b/kernel/src/filesystem/rootfs/filesystem.cpp
index 37bf588..dffef99 100644
--- a/kernel/src/filesystem/rootfs/filesystem.cpp
+++ b/kernel/src/filesystem/rootfs/filesystem.cpp
@@ -1,6 +1,7 @@
#include "kernel/filesystem/rootfs/filesystem.hpp"
#include "kapi/devices/device.hpp"
+
#include "kernel/filesystem/inode.hpp"
#include "kernel/filesystem/rootfs/inode.hpp"
@@ -10,13 +11,13 @@
namespace kernel::filesystem::rootfs
{
- auto filesystem::mount(kstd::shared_ptr<kapi::devices::device> const &) -> int
+ auto filesystem::mount(kstd::shared_ptr<kapi::devices::device> const &) -> operation_result
{
auto rfs_inode = kstd::make_shared<inode>();
rfs_inode->add_child("dev");
m_root_inode = rfs_inode;
- return 0;
+ return operation_result::success;
}
auto filesystem::lookup(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name)
diff --git a/kernel/src/filesystem/rootfs/filesystem.tests.cpp b/kernel/src/filesystem/rootfs/filesystem.tests.cpp
new file mode 100644
index 0000000..b013f78
--- /dev/null
+++ b/kernel/src/filesystem/rootfs/filesystem.tests.cpp
@@ -0,0 +1,45 @@
+#include "kernel/filesystem/rootfs/filesystem.hpp"
+
+#include "kernel/filesystem/filesystem.hpp"
+
+#include <kstd/memory>
+#include <kstd/print>
+#include <kstd/vector>
+
+#include <catch2/catch_test_macros.hpp>
+
+SCENARIO("Rootfs filesystem mount and lookup", "[filesystem][rootfs][filesystem]")
+{
+ GIVEN("a mounted rootfs filesystem")
+ {
+ auto fs = kernel::filesystem::rootfs::filesystem{};
+ auto result = fs.mount(nullptr);
+
+ THEN("the filesystem can be mounted successfully")
+ {
+ REQUIRE(result == kernel::filesystem::filesystem::operation_result::success);
+ REQUIRE(fs.root_inode() != nullptr);
+ }
+
+ THEN("looking up the 'dev' directory returns a valid inode")
+ {
+ auto dev_inode = fs.lookup(fs.root_inode(), "dev");
+ REQUIRE(dev_inode != nullptr);
+ REQUIRE(dev_inode->is_directory());
+ }
+
+ THEN("looking up a non-existent directory returns null")
+ {
+ auto non_existent_inode_1 = fs.lookup(fs.root_inode(), "");
+ REQUIRE(non_existent_inode_1 == nullptr);
+ auto non_existent_inode_2 = fs.lookup(fs.root_inode(), "nonexistent");
+ REQUIRE(non_existent_inode_2 == nullptr);
+ }
+
+ THEN("looking up with a null parent inode returns null")
+ {
+ auto result = fs.lookup(nullptr, "dev");
+ REQUIRE(result == nullptr);
+ }
+ }
+}
diff --git a/kernel/src/filesystem/rootfs/inode.tests.cpp b/kernel/src/filesystem/rootfs/inode.tests.cpp
new file mode 100644
index 0000000..a0c5938
--- /dev/null
+++ b/kernel/src/filesystem/rootfs/inode.tests.cpp
@@ -0,0 +1,83 @@
+#include "kernel/filesystem/rootfs/inode.hpp"
+
+#include <kstd/memory>
+#include <kstd/print>
+#include <kstd/vector>
+
+#include <catch2/catch_test_macros.hpp>
+
+SCENARIO("Rootfs inode creation", "[filesystem][rootfs][inode]")
+{
+ GIVEN("a rootfs inode")
+ {
+ auto inode = kernel::filesystem::rootfs::inode{};
+
+ THEN("the inode has the correct kind")
+ {
+ REQUIRE(inode.is_directory());
+ REQUIRE_FALSE(inode.is_device());
+ REQUIRE_FALSE(inode.is_regular());
+ }
+
+ THEN("the inode has no children")
+ {
+ REQUIRE(inode.lookup_child("child") == nullptr);
+ }
+ }
+}
+
+SCENARIO("Rootfs inode child management", "[filesystem][rootfs][inode]")
+{
+ GIVEN("a rootfs inode")
+ {
+ auto inode = kernel::filesystem::rootfs::inode{};
+
+ WHEN("adding a child inode")
+ {
+ inode.add_child("child");
+ inode.add_child("another child");
+
+ THEN("the child can be looked up by name")
+ {
+ auto child_inode = inode.lookup_child("child");
+ REQUIRE(child_inode != nullptr);
+ REQUIRE(child_inode->is_directory());
+ }
+
+ THEN("looking up a non-existent child returns null")
+ {
+ REQUIRE(inode.lookup_child("nonexistent") == nullptr);
+ }
+ }
+ }
+}
+
+SCENARIO("Rootfs inode read/write", "[filesystem][rootfs][inode]")
+{
+ GIVEN("a rootfs inode")
+ {
+ auto inode = kernel::filesystem::rootfs::inode{};
+
+ WHEN("reading from the inode")
+ {
+ kstd::vector<char> buffer(10);
+ auto bytes_read = inode.read(buffer.data(), 0, buffer.size());
+
+ THEN("no bytes are read")
+ {
+ REQUIRE(bytes_read == 0);
+ }
+ }
+
+ WHEN("writing to the inode")
+ {
+ kstd::vector<char> buffer(10, 'x');
+ auto bytes_written = inode.write(buffer.data(), 0, buffer.size());
+
+ THEN("no bytes are written")
+ {
+ REQUIRE(bytes_written == 0);
+ }
+ }
+ }
+}