summaryrefslogtreecommitdiff
path: root/src/user/app/tests/kernel/fs.c
diff options
context:
space:
mode:
authordzwdz2023-01-11 19:35:44 +0100
committerdzwdz2023-01-11 19:37:46 +0100
commitec81fa16d837f430add92b4d2ee4bd3727ca6c6d (patch)
tree43c91abe8d6a76fcec006fe67c1b585573d3662f /src/user/app/tests/kernel/fs.c
parentc178ab5d5ca328d5b0072d54e3dc66d1b198df7b (diff)
kernel: return EPIPE when fs_waiting on a dead filesystem
Diffstat (limited to 'src/user/app/tests/kernel/fs.c')
-rw-r--r--src/user/app/tests/kernel/fs.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/src/user/app/tests/kernel/fs.c b/src/user/app/tests/kernel/fs.c
index ea8a827..6669c41 100644
--- a/src/user/app/tests/kernel/fs.c
+++ b/src/user/app/tests/kernel/fs.c
@@ -1,8 +1,8 @@
-// TODO test it working too...
-
#include "../tests.h"
#include <camellia/flags.h>
#include <camellia/syscalls.h>
+#include <stdbool.h>
+#include <string.h>
static void test_unfinished_req(void) {
handle_t h = -1;
@@ -37,7 +37,43 @@ static void test_orphaned_fs(void) {
}
}
+static void test_fs_cleanup(void) {
+ const char *msg = "success";
+ int msglen = 8;
+ char buf[16];
+ handle_t ends[2];
+ test(_syscall_pipe(ends, 0) >= 0);
+ if (!_syscall_fork(0, NULL)) {
+ handle_t h = -1;
+ if (_syscall_fork(FORK_NEWFS, &h) == 0) {
+ for (;;) {
+ struct ufs_request req;
+ handle_t reqh = _syscall_fs_wait(buf, sizeof buf, &req);
+ if (reqh < 0) break;
+ _syscall_fs_respond(reqh, NULL, 0, 0); /* success */
+ }
+ /* this is the test: does it break out of the loop
+ * when it should cleanup */
+ _syscall_write(ends[1], msg, msglen, -1, 0);
+ exit(0);
+ } else {
+ test(_syscall_mount(h, "/", 1) == 0);
+ h = _syscall_open("/", 1, 0);
+ test(h >= 0);
+ _syscall_close(h);
+ // TODO another test without the delay
+ _syscall_sleep(0);
+ exit(0);
+ }
+ } else {
+ test(_syscall_read(ends[0], buf, sizeof buf, 0) == msglen);
+ test(memcmp(buf, msg, msglen) == 0);
+ }
+}
+
void r_k_fs(void) {
run_test(test_unfinished_req);
run_test(test_orphaned_fs);
+ run_test(test_fs_cleanup);
+ run_test(test_fs_cleanup);
}