aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/CMakeLists.txt1
-rw-r--r--kernel/include/kernel/filesystem/open_file_description.hpp6
-rw-r--r--kernel/src/filesystem/open_file_description.cpp6
-rw-r--r--kernel/src/filesystem/open_file_description.tests.cpp60
-rw-r--r--kernel/src/test_support/filesystem/inode.cpp8
5 files changed, 77 insertions, 4 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index d7f2cc4..f578632 100644
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -135,6 +135,7 @@ else()
"src/filesystem/device_inode.tests.cpp"
"src/filesystem/mount_table.tests.cpp"
"src/filesystem/mount.tests.cpp"
+ "src/filesystem/open_file_description.tests.cpp"
# Storage Subsystem Tests
"src/devices/block_device_utils.tests.cpp"
diff --git a/kernel/include/kernel/filesystem/open_file_description.hpp b/kernel/include/kernel/filesystem/open_file_description.hpp
index ed878a7..738afd4 100644
--- a/kernel/include/kernel/filesystem/open_file_description.hpp
+++ b/kernel/include/kernel/filesystem/open_file_description.hpp
@@ -46,6 +46,12 @@ namespace kernel::filesystem
*/
auto write(void const * buffer, size_t size) -> size_t;
+ /**
+ @brief Returns the current file offset for this open file description.
+ @return The current file offset in bytes.
+ */
+ [[nodiscard]] auto offset() const -> size_t;
+
private:
kstd::shared_ptr<inode> m_inode;
size_t m_offset;
diff --git a/kernel/src/filesystem/open_file_description.cpp b/kernel/src/filesystem/open_file_description.cpp
index 8c04225..f049a34 100644
--- a/kernel/src/filesystem/open_file_description.cpp
+++ b/kernel/src/filesystem/open_file_description.cpp
@@ -32,4 +32,10 @@ namespace kernel::filesystem
m_offset += written_bytes;
return written_bytes;
}
+
+ auto open_file_description::offset() const -> size_t
+ {
+ return m_offset;
+ }
+
} // namespace kernel::filesystem \ No newline at end of file
diff --git a/kernel/src/filesystem/open_file_description.tests.cpp b/kernel/src/filesystem/open_file_description.tests.cpp
new file mode 100644
index 0000000..f045094
--- /dev/null
+++ b/kernel/src/filesystem/open_file_description.tests.cpp
@@ -0,0 +1,60 @@
+#include "kernel/filesystem/open_file_description.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 description construction", "[filesystem][open_file_description]")
+{
+ GIVEN("an inode and an open file description for that inode")
+ {
+ auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
+ auto file_description = kernel::filesystem::open_file_description{inode};
+
+ THEN("the initial offset is zero")
+ {
+ REQUIRE(file_description.offset() == 0);
+ }
+ }
+}
+
+SCENARIO("Open file description read/write offset management", "[filesystem][open_file_description]")
+{
+ GIVEN("an inode that tracks read/write calls and an open file description for that inode")
+ {
+ auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
+ auto file_description = kernel::filesystem::open_file_description{inode};
+
+ THEN("the offset is updated correctly after reads")
+ {
+ REQUIRE(file_description.read(nullptr, 100) == 100);
+ REQUIRE(file_description.offset() == 100);
+ REQUIRE(file_description.read(nullptr, 50) == 50);
+ REQUIRE(file_description.offset() == 150);
+ }
+
+ THEN("the offset is updated correctly after writes")
+ {
+ REQUIRE(file_description.write(nullptr, 200) == 200);
+ REQUIRE(file_description.offset() == 200);
+ REQUIRE(file_description.write(nullptr, 25) == 25);
+ REQUIRE(file_description.offset() == 225);
+ }
+
+ THEN("reads and writes both update the same offset")
+ {
+ REQUIRE(file_description.read(nullptr, 10) == 10);
+ REQUIRE(file_description.offset() == 10);
+ REQUIRE(file_description.write(nullptr, 20) == 20);
+ REQUIRE(file_description.offset() == 30);
+ REQUIRE(file_description.read(nullptr, 5) == 5);
+ REQUIRE(file_description.offset() == 35);
+ REQUIRE(file_description.write(nullptr, 15) == 15);
+ REQUIRE(file_description.offset() == 50);
+ }
+ }
+}
diff --git a/kernel/src/test_support/filesystem/inode.cpp b/kernel/src/test_support/filesystem/inode.cpp
index 6352d5a..5df7bcd 100644
--- a/kernel/src/test_support/filesystem/inode.cpp
+++ b/kernel/src/test_support/filesystem/inode.cpp
@@ -10,13 +10,13 @@ namespace kernel::tests::filesystem
: kernel::filesystem::inode(inode_kind::regular)
{}
- auto inode::read(void *, size_t, size_t) const -> size_t
+ auto inode::read(void *, size_t, size_t size) const -> size_t
{
- return 0;
+ return size;
}
- auto inode::write(void const *, size_t, size_t) -> size_t
+ auto inode::write(void const *, size_t, size_t size) -> size_t
{
- return 0;
+ return size;
}
} // namespace kernel::tests::filesystem \ No newline at end of file