aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/open_file_table.tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/filesystem/open_file_table.tests.cpp')
-rw-r--r--kernel/src/filesystem/open_file_table.tests.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/kernel/src/filesystem/open_file_table.tests.cpp b/kernel/src/filesystem/open_file_table.tests.cpp
new file mode 100644
index 0000000..a5c791d
--- /dev/null
+++ b/kernel/src/filesystem/open_file_table.tests.cpp
@@ -0,0 +1,113 @@
+#include <kernel/filesystem/open_file_table.hpp>
+
+#include <kernel/filesystem/open_file_descriptor.hpp>
+#include <kernel/test_support/filesystem/inode.hpp>
+
+#include <kstd/memory>
+#include <kstd/print>
+#include <kstd/vector>
+
+#include <catch2/catch_test_macros.hpp>
+
+SCENARIO("Open file table add/get file", "[filesystem][open_file_table]")
+{
+ GIVEN("a open file table and an open file descriptor")
+ {
+ auto & table = kernel::filesystem::open_file_table::get();
+ auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
+ auto file_descriptor_1 = kstd::make_shared<kernel::filesystem::open_file_descriptor>(inode);
+ auto file_descriptor_2 = kstd::make_shared<kernel::filesystem::open_file_descriptor>(inode);
+
+ WHEN("adding the open file descriptor to the open file table")
+ {
+ auto fd_1 = table.add_file(file_descriptor_1);
+ auto fd_2 = table.add_file(file_descriptor_2);
+ auto fd_3 = table.add_file(file_descriptor_2);
+
+ THEN("a valid file descriptor is returned")
+ {
+ REQUIRE(fd_1 == 0);
+ REQUIRE(fd_2 == 1);
+ REQUIRE(fd_3 == 2);
+ }
+
+ THEN("the file descriptor can be retrieved using the returned file descriptor")
+ {
+ auto retrieved_descriptor = table.get_file(fd_1);
+ REQUIRE(retrieved_descriptor == file_descriptor_1);
+ }
+ }
+ }
+
+ GIVEN("a invalid open file descriptor")
+ {
+ auto & table = kernel::filesystem::open_file_table::get();
+
+ THEN("adding a null file descriptor returns an error code")
+ {
+ auto fd = table.add_file(nullptr);
+ REQUIRE(fd == -1);
+ }
+
+ THEN("retrieving a file descriptor with a negative file descriptor returns a null pointer")
+ {
+ auto retrieved_descriptor = table.get_file(-1);
+ REQUIRE(retrieved_descriptor == nullptr);
+ }
+
+ THEN("retrieving a file descriptor with an out-of-bounds file descriptor returns a null pointer")
+ {
+ auto retrieved_descriptor = table.get_file(1000);
+ REQUIRE(retrieved_descriptor == nullptr);
+ }
+ }
+}
+
+SCENARIO("Open file table remove file", "[filesystem][open_file_table]")
+{
+ GIVEN("a open file table with an open file descriptor")
+ {
+ auto & table = kernel::filesystem::open_file_table::get();
+ auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
+ auto file_descriptor = kstd::make_shared<kernel::filesystem::open_file_descriptor>(inode);
+ auto fd = table.add_file(file_descriptor);
+
+ WHEN("removing the file descriptor using the file descriptor")
+ {
+ table.remove_file(fd);
+
+ THEN("the file descriptor can no longer be retrieved using the file descriptor")
+ {
+ auto retrieved_descriptor = table.get_file(fd);
+ REQUIRE(retrieved_descriptor == nullptr);
+ }
+ }
+
+ WHEN("removing a file descriptor the other file descriptor keep the same index")
+ {
+ auto fd2 = table.add_file(file_descriptor);
+ table.remove_file(fd);
+
+ THEN("the second file descriptor can still be retrieved using its file descriptor")
+ {
+ auto retrieved_descriptor = table.get_file(fd2);
+ REQUIRE(retrieved_descriptor == file_descriptor);
+ }
+ }
+ }
+
+ GIVEN("an invalid file descriptor")
+ {
+ auto & table = kernel::filesystem::open_file_table::get();
+
+ THEN("removing a file with a negative file descriptor does nothing")
+ {
+ REQUIRE_NOTHROW(table.remove_file(-1));
+ }
+
+ THEN("removing a file with an out-of-bounds file descriptor does nothing")
+ {
+ REQUIRE_NOTHROW(table.remove_file(1000));
+ }
+ }
+} \ No newline at end of file