summaryrefslogtreecommitdiff
path: root/src/cmd/tests/kernel/time.c
blob: 476a90a4e390352a84a6d145e73b2fe7cd171be6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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);
}