v2 / vlib / v / gen / wasm / tests / wasi_api.vv
126 lines · 108 sloc · 2.29 KB · 0e098a9a25ba25de17683c8c84517f814c60b802
Raw
1struct Args {
2 argc u32
3 argc_buf_size u32
4}
5
6fn wasi_args_sizes_get() {
7 args := Args{}
8 if WASM.args_sizes_get(&args.argc, &args.argc_buf_size) == 0 {
9 println('args_sizes_get: ok')
10 }
11 if args.argc >= 1 {
12 println('args_sizes_get: argc >= 1')
13 }
14 if args.argc_buf_size > 0 {
15 println('args_sizes_get: argc_buf_size > 0')
16 }
17}
18
19fn wasi_args_get() {
20 unsafe {
21 args := Args{}
22 WASM.args_sizes_get(&args.argc, &args.argc_buf_size)
23
24 mut argv_buf := malloc(args.argc_buf_size + 1)
25 mut argv_ptrs := malloc(args.argc)
26
27 if WASM.args_get(&argv_ptrs[0], &argv_buf[0]) == 0 {
28 println('args_get: ok')
29 }
30
31 // @TODO: Check if the end ends with .wasm with a proper builtin
32 if cstring_to_vstring(argv_buf).len == (args.argc_buf_size) - 1 {
33 println('wasi_args_get: ok')
34 }
35 }
36}
37
38fn wasi_random_get() {
39 mut random_table := [128]u8{}
40
41 errno := WASM.random_get(&random_table[0], 128)
42 if errno == 0 {
43 println('random_get: ok')
44 }
45
46 mut min := u8(255)
47 mut max := u8(0)
48 mut all_same := true
49 first_val := random_table[0]
50
51 for i in 0 .. 128 {
52 val := random_table[i]
53 if val < min {
54 min = val
55 }
56 if val > max {
57 max = val
58 }
59 if val != first_val {
60 all_same = false
61 }
62 }
63
64 println('random_get: has low values = ${min < 200}')
65 println('random_get: has high values = ${max > 55}')
66 println('random_get: values vary = ${!all_same}')
67}
68
69fn wasi_fd_write() {
70 message := 'fd_write: Hello from WASI WOORLD!\n'
71 message_struct := CIOVec{
72 buf: message.str
73 len: usize(message.len)
74 }
75
76 if WASM.fd_write(1, &message_struct, 1, 0) == 0 {
77 println('fd_write: ok')
78 }
79}
80
81fn wasi_fd_write_multiple_iovecs() {
82 msg1 := 'Multiple '
83 msg2 := 'IO '
84 msg3 := 'vectors yay!\n'
85
86 iovs := [
87 CIOVec{
88 buf: msg1.str
89 len: usize(msg1.len)
90 },
91 CIOVec{
92 buf: msg2.str
93 len: usize(msg2.len)
94 },
95 CIOVec{
96 buf: msg3.str
97 len: usize(msg3.len)
98 },
99 ]!
100
101 if WASM.fd_write(1, &iovs[0], 3, 0) == 0 {
102 println('fd_write_multi: ok')
103 }
104}
105
106fn wasi_fd_sync() {
107 // Flush stdout (fd 1)
108 if WASM.fd_sync(1) == 0 {
109 println('fd_sync: ok on stdout')
110 }
111
112 // Flush stderr (fd 2)
113 if WASM.fd_sync(2) == 0 {
114 println('fd_sync: ok on stderr')
115 }
116}
117
118fn main() {
119 wasi_args_sizes_get()
120 wasi_args_get()
121 wasi_random_get()
122 wasi_fd_write()
123 wasi_fd_write_multiple_iovecs()
124 wasi_fd_sync()
125 // @TODO: Find a way to test fd_read ?
126}
127