nx_dyad_test.nx source
↩ module page · 86 lines · 2733 B
1// nx_dyad_test.nx -- smoke for nx_dyad.
2
3import "nx_syscalls.nx"
4import "nx_attention_class.nx"
5import "nx_dyad.nx"
6
7func main() -> i64 {
8 let a_in: *u8 = (sys_mmap(32)) as *u8
9 let a_out: *u8 = (sys_mmap(32)) as *u8
10 let b_in: *u8 = (sys_mmap(32)) as *u8
11 let b_out: *u8 = (sys_mmap(32)) as *u8
12
13 // 1: construct dyad with isolated buffers
14 let d: *NxDyad = nx_dyad_new(
15 100, NX_AC_INTERACTIVE_FOREGROUND_GAME, a_in, 32, a_out, 32,
16 200, NX_AC_INTERACTIVE_FOREGROUND_GAME, b_in, 32, b_out, 32)
17 if (d as i64) == 0 { return 1 }
18 if d.cell_a_id != 100 { return 2 }
19 if d.cell_b_id != 200 { return 3 }
20
21 // 2: shared buffer rejected (cross-leak)
22 let d_bad: *NxDyad = nx_dyad_new(
23 100, NX_AC_DEV, a_in, 32, a_out, 32,
24 200, NX_AC_DEV, a_in, 32, b_out, 32)
25 if (d_bad as i64) != 0 { return 4 }
26
27 // 3: a_out aliasing b_out refused
28 let d_bad2: *NxDyad = nx_dyad_new(
29 100, NX_AC_DEV, a_in, 32, a_out, 32,
30 200, NX_AC_DEV, b_in, 32, a_out, 32)
31 if (d_bad2 as i64) != 0 { return 5 }
32
33 // 4: bad class rejected
34 let d_bad3: *NxDyad = nx_dyad_new(
35 100, 99, a_in, 32, a_out, 32,
36 200, NX_AC_DEV, b_in, 32, b_out, 32)
37 if (d_bad3 as i64) != 0 { return 6 }
38
39 // 5: null buffer rejected
40 let null_buf: *u8 = (0 as i64) as *u8
41 let d_bad4: *NxDyad = nx_dyad_new(
42 100, NX_AC_DEV, null_buf, 32, a_out, 32,
43 200, NX_AC_DEV, b_in, 32, b_out, 32)
44 if (d_bad4 as i64) != 0 { return 7 }
45
46 // 6: feed same input -- both buffers receive it
47 let src: *u8 = (sys_mmap(16)) as *u8
48 var i: nx_size = 0
49 while i < 16 {
50 src[i] = (65 + i) as u8
51 i = i + 1
52 }
53 if nx_dyad_feed_same_input(d, src, 16) != NX_DY_OK { return 8 }
54
55 // 7: inputs match
56 if nx_dyad_inputs_match(d, 16) != 1 { return 9 }
57
58 // 8: outputs all zero -- they differ from each other zero times
59 if nx_dyad_outputs_differ(d, 16) != 0 { return 10 }
60
61 // 9: write divergent outputs and count
62 var j: nx_size = 0
63 while j < 16 {
64 a_out[j] = (50 + j) as u8
65 b_out[j] = (60 + j) as u8 // every position differs
66 j = j + 1
67 }
68 if nx_dyad_outputs_differ(d, 16) != 16 { return 11 }
69
70 // 10: identical outputs are not divergent
71 var k: nx_size = 0
72 while k < 16 {
73 b_out[k] = a_out[k]
74 k = k + 1
75 }
76 if nx_dyad_outputs_differ(d, 16) != 0 { return 12 }
77
78 // 11: buffers_isolated predicate
79 if nx_dyad_buffers_isolated(d) != 1 { return 13 }
80
81 // 12: feed-same-input refused when too large
82 let big_src: *u8 = (sys_mmap(128)) as *u8
83 if nx_dyad_feed_same_input(d, big_src, 100) != NX_DY_ERR_INPUT_DIVERGED { return 14 }
84
85 return 0
86}