aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kapi/filesystem.tests.cpp58
-rw-r--r--kernel/kernel/filesystem/devfs/filesystem.tests.cpp7
-rw-r--r--kernel/kernel/filesystem/path.tests.cpp59
-rw-r--r--kernel/kernel/filesystem/rootfs/filesystem.tests.cpp8
-rw-r--r--kernel/kernel/filesystem/vfs_types.hpp1
5 files changed, 133 insertions, 0 deletions
diff --git a/kernel/kapi/filesystem.tests.cpp b/kernel/kapi/filesystem.tests.cpp
index b339f19f..595d73e8 100644
--- a/kernel/kapi/filesystem.tests.cpp
+++ b/kernel/kapi/filesystem.tests.cpp
@@ -211,5 +211,63 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
auto bytes_written = kapi::filesystem::write(invalid_fd, buffer.data(), buffer.size());
REQUIRE(!bytes_written);
}
+
+ THEN("a new file can be created, written to, read from, and closed again")
+ {
+ auto new_file_path = "/information/new_information.txt";
+
+ REQUIRE(kapi::filesystem::open(new_file_path) < 0);
+
+ REQUIRE(kapi::filesystem::create(new_file_path) == 0);
+
+ auto fd = kapi::filesystem::open(new_file_path);
+ REQUIRE(fd >= 0);
+
+ auto write_buffer = std::vector<std::byte>{std::byte{'T'}, std::byte{'e'}, std::byte{'s'}, std::byte{'t'}};
+ kapi::filesystem::write(fd, write_buffer.data(), write_buffer.size());
+
+ REQUIRE(kapi::filesystem::close(fd) == 0);
+
+ fd = kapi::filesystem::open(new_file_path);
+ REQUIRE(fd >= 0);
+
+ auto read_buffer = std::vector<std::byte>(4);
+ auto bytes_read = kapi::filesystem::read(fd, read_buffer.data(), read_buffer.size());
+
+ std::string_view buffer_as_str{reinterpret_cast<char *>(read_buffer.data()), static_cast<size_t>(bytes_read)};
+ REQUIRE(buffer_as_str == "Test");
+
+ REQUIRE(kapi::filesystem::close(fd) == 0);
+ }
+
+ THEN("a new directory can be created and a file within can be created, opened, and closed again")
+ {
+ auto new_directory_path = "/information/new_directory";
+ auto new_file_path = "/information/new_directory/new_information.txt";
+
+ REQUIRE(kapi::filesystem::open(new_file_path) < 0);
+
+ REQUIRE(kapi::filesystem::mkdir(new_directory_path) == 0);
+ REQUIRE(kapi::filesystem::create(new_file_path) == 0);
+
+ auto fd = kapi::filesystem::open(new_file_path);
+ REQUIRE(fd >= 0);
+ REQUIRE(kapi::filesystem::close(fd) == 0);
+ }
+
+ THEN("a file can be created in a mounted filesystem, opened, and closed again")
+ {
+ kapi::filesystem::mount("/dev/ram16", "/information");
+
+ auto new_file_path = "/information/monkey_house/monkey_4.txt";
+ REQUIRE(kapi::filesystem::open(new_file_path) < 0);
+ REQUIRE(kapi::filesystem::create(new_file_path) == 0);
+
+ auto fd = kapi::filesystem::open(new_file_path);
+ REQUIRE(fd >= 0);
+ REQUIRE(kapi::filesystem::close(fd) == 0);
+
+ REQUIRE(kapi::filesystem::umount("/information") == 0);
+ }
}
}
diff --git a/kernel/kernel/filesystem/devfs/filesystem.tests.cpp b/kernel/kernel/filesystem/devfs/filesystem.tests.cpp
index d5028231..bbfddee3 100644
--- a/kernel/kernel/filesystem/devfs/filesystem.tests.cpp
+++ b/kernel/kernel/filesystem/devfs/filesystem.tests.cpp
@@ -1,6 +1,7 @@
#include <kernel/filesystem/devfs/filesystem.hpp>
#include <kernel/filesystem/filesystem.hpp>
+#include <kernel/filesystem/vfs_types.hpp>
#include <kernel/test_support/filesystem/storage_boot_module_fixture.hpp>
#include <catch2/catch_test_macros.hpp>
@@ -52,6 +53,12 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture,
auto result = fs.lookup(*non_directory_inode, "anything");
REQUIRE(!result);
}
+
+ THEN("create_inode always returns null")
+ {
+ auto result = fs.create_inode(fs.root_inode(), "new_device", kernel::filesystem::vfs_types::inode_type::device);
+ REQUIRE(result == nullptr);
+ }
}
GIVEN("a boot module registry with three modules")
diff --git a/kernel/kernel/filesystem/path.tests.cpp b/kernel/kernel/filesystem/path.tests.cpp
index 3c18b5c2..7bba371b 100644
--- a/kernel/kernel/filesystem/path.tests.cpp
+++ b/kernel/kernel/filesystem/path.tests.cpp
@@ -66,4 +66,63 @@ SCENARIO("path utilities", "[filesystem][path]")
REQUIRE(std::ranges::equal(components, expected));
}
}
+
+ GIVEN("file paths")
+ {
+ THEN("path is split into parent path and filename")
+ {
+ auto [parent, filename] = kernel::filesystem::path::split_into_path_and_filename("/a/b/c/d.txt");
+ REQUIRE(parent == "/a/b/c");
+ REQUIRE(filename == "d.txt");
+ }
+
+ THEN("root path is split into root and empty filename")
+ {
+ auto [parent, filename] = kernel::filesystem::path::split_into_path_and_filename("/");
+ REQUIRE(parent == "/");
+ REQUIRE(filename == "");
+ }
+
+ THEN("file directly under root is split correctly")
+ {
+ auto [parent, filename] = kernel::filesystem::path::split_into_path_and_filename("/file.txt");
+ REQUIRE(parent == "/");
+ REQUIRE(filename == "file.txt");
+ }
+
+ THEN("filename without parent path is split into empty parent and filename")
+ {
+ auto [parent, filename] = kernel::filesystem::path::split_into_path_and_filename("file.txt");
+ REQUIRE(parent == "");
+ REQUIRE(filename == "file.txt");
+ }
+
+ THEN("path with trailing slash is split correctly")
+ {
+ auto [parent, filename] = kernel::filesystem::path::split_into_path_and_filename("/a/b/c/");
+ REQUIRE(parent == "/a/b");
+ REQUIRE(filename == "c");
+ }
+
+ THEN("single component with trailing slash has root as parent")
+ {
+ auto [parent, filename] = kernel::filesystem::path::split_into_path_and_filename("/a/");
+ REQUIRE(parent == "/");
+ REQUIRE(filename == "a");
+ }
+
+ THEN("relative path is split into relative parent and filename")
+ {
+ auto [parent, filename] = kernel::filesystem::path::split_into_path_and_filename("a/b/c.txt");
+ REQUIRE(parent == "a/b");
+ REQUIRE(filename == "c.txt");
+ }
+
+ THEN("an empty path is split into empty parent and filename")
+ {
+ auto [parent, filename] = kernel::filesystem::path::split_into_path_and_filename("");
+ REQUIRE(parent == "");
+ REQUIRE(filename == "");
+ }
+ }
} \ No newline at end of file
diff --git a/kernel/kernel/filesystem/rootfs/filesystem.tests.cpp b/kernel/kernel/filesystem/rootfs/filesystem.tests.cpp
index 347502ca..ecd20707 100644
--- a/kernel/kernel/filesystem/rootfs/filesystem.tests.cpp
+++ b/kernel/kernel/filesystem/rootfs/filesystem.tests.cpp
@@ -1,6 +1,7 @@
#include <kernel/filesystem/rootfs/filesystem.hpp>
#include <kernel/filesystem/filesystem.hpp>
+#include <kernel/filesystem/vfs_types.hpp>
#include <kstd/memory.hpp>
#include <kstd/print.hpp>
@@ -34,5 +35,12 @@ SCENARIO("Rootfs filesystem mount and lookup", "[filesystem][rootfs][filesystem]
auto result = fs.lookup(nullptr, "dev");
REQUIRE(!result);
}
+
+ THEN("create_inode always returns null")
+ {
+ auto result =
+ fs.create_inode(fs.root_inode(), "new_device", kernel::filesystem::vfs_types::inode_type::directory);
+ REQUIRE(result == nullptr);
+ }
}
}
diff --git a/kernel/kernel/filesystem/vfs_types.hpp b/kernel/kernel/filesystem/vfs_types.hpp
index 4bedaddc..4c2ed72e 100644
--- a/kernel/kernel/filesystem/vfs_types.hpp
+++ b/kernel/kernel/filesystem/vfs_types.hpp
@@ -10,6 +10,7 @@ namespace kernel::filesystem::vfs_types
directory = 0,
regular = 1,
symbolic_link = 2,
+ device = 3
};
} // namespace kernel::filesystem::vfs_types
#endif \ No newline at end of file