summaryrefslogtreecommitdiff
path: root/src/user/app/tests
diff options
context:
space:
mode:
authordzwdz2022-10-08 16:05:37 +0200
committerdzwdz2022-10-08 16:07:04 +0200
commitf25b6a7d38f1a4b656e3a7ad431afcf535f1fdce (patch)
tree83199e9a70cc903ce46d0f30cc1a74ccfc6e729b /src/user/app/tests
parente83dca9817614d0dc77ce1e5dc13eed44b61eb2f (diff)
tests: some tests for when a process has no free handles
Diffstat (limited to 'src/user/app/tests')
-rw-r--r--src/user/app/tests/kernel/fdlimit.c49
-rw-r--r--src/user/app/tests/tests.c1
-rw-r--r--src/user/app/tests/tests.h1
3 files changed, 51 insertions, 0 deletions
diff --git a/src/user/app/tests/kernel/fdlimit.c b/src/user/app/tests/kernel/fdlimit.c
new file mode 100644
index 0000000..d22af13
--- /dev/null
+++ b/src/user/app/tests/kernel/fdlimit.c
@@ -0,0 +1,49 @@
+#include "../tests.h"
+#include <camellia/flags.h>
+#include <errno.h>
+#include <unistd.h>
+
+static void test_fdlimit_pipe(void) {
+ handle_t ends[2];
+ handle_t h[2] = {-1, -1};
+ for (;;) {
+ handle_t cur = _syscall_open("/", 1, OPEN_READ);
+ if (cur == -EMFILE) break;
+ test(cur >= 0);
+ h[0] = h[1];
+ h[1] = cur;
+ }
+ test(h[0] >= 0); /* we need at least two handles */
+
+ test(_syscall_pipe(ends, 0) == -EMFILE);
+ test(_syscall_open("/", 1, OPEN_READ) == -EMFILE);
+
+ close(h[1]);
+ test(_syscall_pipe(ends, 0) == -EMFILE);
+ test(_syscall_open("/", 1, OPEN_READ) == h[1]);
+ test(_syscall_open("/", 1, OPEN_READ) == -EMFILE);
+
+ close(h[0]);
+ close(h[1]);
+ test(_syscall_pipe(ends, 0) == 0);
+}
+
+static void test_fdlimit_fork(void) {
+ for (;;) {
+ handle_t cur = _syscall_open("/", 1, OPEN_READ);
+ if (cur == -EMFILE) break;
+ test(cur >= 0);
+ }
+
+ if (!_syscall_fork(0, NULL)) _syscall_exit(123);
+
+ test(_syscall_fork(FORK_NEWFS, NULL) == -EMFILE);
+ test(_syscall_await() == 123);
+ test(_syscall_await() == ~0);
+}
+
+void r_k_fdlimit(void) {
+ /* all these tests implicitly test if the vfs returns -EMFILE */
+ run_test(test_fdlimit_pipe);
+ run_test(test_fdlimit_fork);
+}
diff --git a/src/user/app/tests/tests.c b/src/user/app/tests/tests.c
index 29733aa..14225ac 100644
--- a/src/user/app/tests/tests.c
+++ b/src/user/app/tests/tests.c
@@ -36,6 +36,7 @@ int forkpipe(FILE **f, handle_t *h) {
int main(void) {
handle_t reader;
if (!forkpipe(&fail_trig, &reader)) {
+ r_k_fdlimit();
r_k_fs();
r_k_misc();
r_k_miscsyscall();
diff --git a/src/user/app/tests/tests.h b/src/user/app/tests/tests.h
index 248303d..e9b06e5 100644
--- a/src/user/app/tests/tests.h
+++ b/src/user/app/tests/tests.h
@@ -7,6 +7,7 @@
void run_test(void (*fn)());
+void r_k_fdlimit(void);
void r_k_fs(void);
void r_k_misc(void);
void r_k_miscsyscall(void);