diff options
author | dzwdz | 2021-10-15 18:40:57 +0200 |
---|---|---|
committer | dzwdz | 2021-10-15 18:40:57 +0200 |
commit | 42bf65918f96d43e9ce8a7287a9508f44fe670d5 (patch) | |
tree | 2bb2dec665848c4f36752852df3e570d482e547e /src/init/tests | |
parent | 6f9626fbd235f5e66ba61affa064e3b44ffc012a (diff) |
init: move the tests to their own directory
Diffstat (limited to 'src/init/tests')
-rw-r--r-- | src/init/tests/main.c | 75 | ||||
-rw-r--r-- | src/init/tests/main.h | 4 |
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); |