#include #include #include #include #include #include #include SCENARIO("File descriptor table add/get file", "[filesystem][file_descriptor_table]") { GIVEN("a file descriptor table and an open file descriptor") { auto & table = kernel::filesystem::file_descriptor_table::get(); auto inode = kstd::make_shared(); auto file_descriptor_1 = kstd::make_shared(inode); auto file_descriptor_2 = kstd::make_shared(inode); WHEN("adding the open file descriptor to the file descriptor 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::file_descriptor_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("File descriptor table remove file", "[filesystem][file_descriptor_table]") { GIVEN("a file descriptor table with an open file descriptor") { auto & table = kernel::filesystem::file_descriptor_table::get(); auto inode = kstd::make_shared(); auto file_descriptor = kstd::make_shared(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::file_descriptor_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)); } } }