v2 / vlib / builtin / linux_bare / old / .checks / forkedtest / forkedtest.v
49 lines · 39 sloc · 1.05 KB · 14434cc86aa1ca2a98c023313db3f0ca2a136537
Raw
1module forkedtest
2
3pub fn run (op fn(), label string, code Wi_si_code, status int) int {
4 child := sys_fork()
5 if child == 0 {
6 op()
7 sys_exit(0)
8 }
9
10 siginfo := []int{len:int(Sig_index.si_size)}
11
12 e := sys_waitid(.p_pid, child, intptr(&siginfo[0]), .wexited, 0)
13
14 assert e == .enoerror
15 assert siginfo[int(Sig_index.si_pid)] == child
16 assert siginfo[int(Sig_index.si_signo)] == int(Signo.sigchld)
17 assert siginfo[int(Sig_index.si_uid)] == sys_getuid()
18
19 r_code := siginfo[Sig_index.si_code]
20 r_status := siginfo[Sig_index.si_status]
21
22 print("+++ ")
23 print(label)
24 if (int(code) == r_code) && (status == r_status) {
25 println(" PASSED")
26 return 0
27 }
28 println(" FAILED")
29
30 if int(code) != r_code {
31 print(">> Expecting si_code 0x")
32 println(i64_str(int(code),16))
33 print(">> Got 0x")
34 println(i64_str(r_code,16))
35 }
36
37 if status != r_status {
38 print(">> Expecting status 0x")
39 println(i64_str(status,16))
40 print(">> Got 0x")
41 println(i64_str(r_status,16))
42 }
43
44 return 1
45}
46
47pub fn normal_run (op fn(), label string) int {
48 return run (op, label, .cld_exited, 0)
49}
50