summaryrefslogtreecommitdiff
path: root/src/init/tests
diff options
context:
space:
mode:
authordzwdz2021-10-15 18:40:57 +0200
committerdzwdz2021-10-15 18:40:57 +0200
commit42bf65918f96d43e9ce8a7287a9508f44fe670d5 (patch)
tree2bb2dec665848c4f36752852df3e570d482e547e /src/init/tests
parent6f9626fbd235f5e66ba61affa064e3b44ffc012a (diff)
init: move the tests to their own directory
Diffstat (limited to 'src/init/tests')
-rw-r--r--src/init/tests/main.c75
-rw-r--r--src/init/tests/main.h4
2 files changed, 79 insertions, 0 deletions
diff --git a/src/init/tests/main.c b/src/init/tests/main.c
new file mode 100644
index 0000000..ed02e5f
--- /dev/null
+++ b/src/init/tests/main.c
@@ -0,0 +1,75 @@
+#include <init/stdlib.h>
+#include <init/tests/main.h>
+#include <shared/syscalls.h>
+
+#define argify(str) str, sizeof(str) - 1
+
+static void read_file(const char *path, size_t len) {
+ int fd = _syscall_open(path, len);
+ static char buf[64];
+ int buf_len = 64;
+
+ _syscall_write(__tty_fd, path, len, 0);
+ printf(": ");
+ if (fd < 0) {
+ printf("couldn't open.\n");
+ return;
+ }
+
+ buf_len = _syscall_read(fd, buf, buf_len, 0);
+ _syscall_write(__tty_fd, buf, buf_len, 0);
+
+ _syscall_close(fd);
+}
+
+void test_fs(void) {
+ if (!_syscall_fork()) {
+ /* run the "test" in a child process to not affect the fs view of the
+ * main process */
+ read_file(argify("/init/fake.txt"));
+ read_file(argify("/init/1.txt"));
+ read_file(argify("/init/2.txt"));
+ read_file(argify("/init/dir/3.txt"));
+
+ printf("\nshadowing /init/dir...\n");
+ _syscall_mount(-1, argify("/init/dir"));
+ read_file(argify("/init/fake.txt"));
+ read_file(argify("/init/1.txt"));
+ read_file(argify("/init/2.txt"));
+ read_file(argify("/init/dir/3.txt"));
+
+ printf("\n");
+ _syscall_exit(0);
+ } else _syscall_await();
+}
+
+void test_await(void) {
+ int ret;
+
+ if (!_syscall_fork()) {
+ /* this "test" runs in a child process, because otherwise it would be
+ * stuck waiting for e.g. the tar_driver process to exit */
+
+ // regular exit()s
+ if (!_syscall_fork()) _syscall_exit(69);
+ if (!_syscall_fork()) _syscall_exit(420);
+
+ // faults
+ if (!_syscall_fork()) { // invalid memory access
+ asm volatile("movb $69, 0" ::: "memory");
+ printf("this shouldn't happen");
+ _syscall_exit(-1);
+ }
+ if (!_syscall_fork()) { // #GP
+ asm volatile("hlt" ::: "memory");
+ printf("this shouldn't happen");
+ _syscall_exit(-1);
+ }
+
+ while ((ret = _syscall_await()) != ~0)
+ printf("await returned: %x\n", ret);
+ printf("await: no more children\n");
+
+ _syscall_exit(0);
+ } else _syscall_await();
+}
diff --git a/src/init/tests/main.h b/src/init/tests/main.h
new file mode 100644
index 0000000..0c24e03
--- /dev/null
+++ b/src/init/tests/main.h
@@ -0,0 +1,4 @@
+#pragma once
+
+void test_fs(void);
+void test_await(void);