diff options
author | dzwdz | 2024-05-19 20:59:38 +0200 |
---|---|---|
committer | dzwdz | 2024-05-19 20:59:38 +0200 |
commit | 317da94139c592d20e90a4f74cdb67c620d72d4a (patch) | |
tree | 14c9a306914e4f38baddd227ed55d346929f0d96 /src/cmd/tests/kernel | |
parent | 8fdf6a24736fd676cbd28de11b21a31b2fd6664e (diff) |
kernel: implement /dev/bintime
Diffstat (limited to 'src/cmd/tests/kernel')
-rw-r--r-- | src/cmd/tests/kernel/time.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/cmd/tests/kernel/time.c b/src/cmd/tests/kernel/time.c new file mode 100644 index 0000000..476a90a --- /dev/null +++ b/src/cmd/tests/kernel/time.c @@ -0,0 +1,49 @@ +#include "../tests.h" +#include <camellia.h> + +static void +test_settime(void) { + uint64_t ns = 1000000000; + uint64_t base = 1337 * ns; + union { + uint64_t t; + char buf[8]; + } u; + + hid_t h = camellia_open("/dev/bintime", OPEN_RW); + + /* check if time is reasonable */ + test(h >= 0); + test(_sys_read(h, u.buf, 8, 0) == 8); + test(0 < u.t); + test(u.t < ns); /* this should've taken less than a second */ + + /* try changing the time */ + u.t = base; + test(_sys_write(h, u.buf, 8, 0, 0) == 8); + + /* did we succeed? */ + u.t = 0; + test(_sys_read(h, u.buf, 8, 0) == 8); + test(base < u.t); + test(u.t < base + ns); + + /* clone the handle */ + hid_t h2 = _sys_dup(h, 0, DUP_SEARCH | DUP_RDONLY); + test(h2 >= 0); + + /* i shouldn't be able to write to it */ + u.t = 0; + test(_sys_write(h2, u.buf, 8, 0, 0) == -EACCES); + + /* but reads should be fine */ + test(_sys_read(h2, u.buf, 8, 0) == 8); + test(base < u.t); + test(u.t < base + ns); +} + +void +r_k_time(void) +{ + run_test(test_settime); +} |