blob: a5c791ded5379a486bd4d0cf067ead8183741dee (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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));
}
}
}
|