v2 / vlib / builtin / linux_bare / old / .checks / linuxsys / linuxsys.v
358 lines · 307 sloc · 6.48 KB · 0874376db0ac39440e5201986576ebe53a7f1e7a
Raw
1module main
2
3import builtin.linux_bare.old.checks.forkedtest
4
5const (
6 sample_text_file1 = ''
7)
8
9fn check_fork_minimal() {
10 child := sys_fork()
11 ec := 100
12 if child == 0 {
13 println('child')
14 sys_exit(ec)
15 }
16 siginfo := [
17 0,
18 0,
19 0,
20 0,
21 0,
22 0,
23 0,
24 0,
25 0,
26 0,
27 0,
28 0,
29 0,
30 0,
31 0,
32 0,
33 0,
34 0,
35 0,
36 0,
37 0,
38 0,
39 0,
40 0,
41 0,
42 0,
43 0,
44 0,
45 0,
46 0,
47 0,
48 0,
49 0,
50 0,
51 0,
52 0,
53 0,
54 0,
55 0,
56 0,
57 0,
58 0,
59 0,
60 0,
61 0,
62 0,
63 0,
64 0,
65 0,
66 0,
67 0,
68 0,
69 0,
70 0,
71 0,
72 0,
73 0,
74 0,
75 0,
76 0,
77 0,
78 0,
79 0,
80 0,
81 ]
82
83 e := sys_waitid(.p_pid, child, intptr(siginfo.data), .wexited, 0)
84
85 assert e == .enoerror
86 // println(i64_tos(buffer0,80,siginfo[Sig_index.si_code],16))
87 assert siginfo[Sig_index.si_code] == int(Wi_si_code.cld_exited)
88 assert siginfo[Sig_index.si_pid] == child
89 assert siginfo[Sig_index.si_status] == ec
90 assert siginfo[Sig_index.si_signo] == int(Signo.sigchld)
91 assert siginfo[Sig_index.si_uid] == sys_getuid()
92}
93
94fn check_read_write_pipe() {
95 // Checks the following system calls:
96 // sys_pipe
97 // sys_write
98 // sys_read
99 // sys_close
100 //
101 buffer0 := []u8{len: (128)}
102 buffer := byteptr(buffer0.data)
103
104 fd := [-1, -1]
105
106 assert fd[0] == -1
107 assert fd[1] == -1
108
109 a := sys_pipe(intptr(&fd[0]))
110
111 assert a == .enoerror
112
113 assert fd[0] != -1
114 assert fd[1] != -1
115
116 test_data := 'test_data'
117 b := test_data.len + 1
118 c1, e1 := sys_write(fd[1], test_data.str, u64(b))
119
120 assert e1 == .enoerror
121 assert c1 == b
122
123 c2, e2 := sys_read(fd[0], buffer, u64(b))
124
125 assert e2 == .enoerror
126 assert c2 == b
127
128 assert buffer[b - 1] == 0
129
130 for i in 0 .. b {
131 assert test_data[i] == buffer[i]
132 }
133
134 assert sys_close(fd[0]) == .enoerror
135 assert sys_close(fd[1]) == .enoerror
136
137 assert sys_close(-1) == .ebadf
138}
139
140fn check_read_file() {
141 /*
142 Checks the following system calls:
143 sys_read
144 sys_write
145 sys_close
146 sys_open
147 */
148 buffer0 := []u8{len: (128)}
149 buffer := byteptr(buffer0.data)
150
151 test_file := 'sample_text1.txt'
152 sample_text := 'Do not change this text.\n'
153 fd, ec := sys_open(test_file.str, .o_rdonly, 0)
154 assert fd > 0
155 assert ec == .enoerror
156 n := sample_text.len
157 c, e := sys_read(fd, buffer, u64(n * 2))
158 assert e == .enoerror
159 assert c == n
160 for i in 0 .. n {
161 assert sample_text[i] == buffer[i]
162 }
163 assert sys_close(fd) == .enoerror
164}
165
166fn check_open_file_fail() {
167 fd1, ec1 := sys_open('./nofilehere'.str, .o_rdonly, 0)
168 assert fd1 == -1
169 assert ec1 == .enoent
170}
171
172/*
173fn check_print() {
174 println ("checking print and println")
175
176 a := sys_pipe(intptr(fd))
177 assert a != -1
178 assert fd[0] != -1
179 assert fd[1] != -1
180
181 //sys_dup2
182 println ("print and println passed")
183}
184*/
185
186fn check_munmap_fail() {
187 ec := sys_munmap(-16384, 8192)
188 assert ec == .einval
189}
190
191fn check_mmap_one_page() {
192 mp := int(Mm_prot.prot_read) | int(Mm_prot.prot_write)
193 mf := int(Map_flags.map_private) | int(Map_flags.map_anonymous)
194 mut a, e := sys_mmap(0, u64(Linux_mem.page_size), Mm_prot(mp), Map_flags(mf), -1,
195 0)
196
197 assert e == .enoerror
198 assert a != byteptr(-1)
199
200 for i in 0 .. int(Linux_mem.page_size) {
201 b := i & 0xFF
202 a[i] = b
203 assert a[i] == b
204 }
205
206 ec := sys_munmap(a, u64(Linux_mem.page_size))
207 assert ec == .enoerror
208}
209
210fn check_mm_pages() {
211 for i in 0 .. int(Linux_mem.page_size) - 4 {
212 assert u32(1) == mm_pages(u64(i))
213 }
214 for i in int(Linux_mem.page_size) - 3 .. (int(Linux_mem.page_size) * 2) - 4 {
215 assert u32(2) == mm_pages(u64(i))
216 }
217 for i in (int(Linux_mem.page_size) * 2) - 3 .. (int(Linux_mem.page_size) * 3) - 4 {
218 assert u32(3) == mm_pages(u64(i))
219 }
220}
221
222// pub fn mm_alloc(size u64) (voidptr, Errno)
223
224fn check_mm_alloc() {
225 for i in 1 .. 2000 {
226 size := u64(i * 1000)
227 pages := mm_pages(size)
228 mut a, e := mm_alloc(size)
229
230 assert e == .enoerror
231 ap := intptr(a - 4)
232 assert *ap == int(pages)
233 assert e == .enoerror
234 assert !isnil(a)
235
236 if (i % 111) == 0 {
237 for j in 0 .. int(size) {
238 b := j & 0xFF
239 a[j] = b
240 assert b == int(a[j])
241 }
242 }
243
244 mfa := mm_free(a)
245
246 assert mfa == .enoerror
247 }
248}
249
250fn check_int_array_ro() {
251 a := [100, 110, 120, 130]
252 assert a.len == 4
253 assert a[0] == 100
254 assert a[1] == 110
255 assert a[2] == 120
256 assert a[3] == 130
257}
258
259fn check_int_array_rw() {
260 mut a := [-10, -11, -12, -13]
261 assert a.len == 4
262 assert a[0] == -10
263 assert a[1] == -11
264 assert a[2] == -12
265 assert a[3] == -13
266 for i in 0 .. a.len {
267 b := -a[i] * 10
268 a[i] = b
269 assert a[i] == b
270 }
271 assert a[3] == 130
272}
273
274fn check_int64_array_ro() {
275 a := [i64(1000), 1100, 1200, 1300, 1400]
276 assert a.len == 5
277 assert a[0] == 1000
278 assert a[1] == 1100
279 assert a[2] == 1200
280 assert a[3] == 1300
281 assert a[4] == 1400
282}
283
284fn check_voidptr_array_ro() {
285 a := [
286 voidptr(10000),
287 voidptr(11000),
288 voidptr(12000),
289 voidptr(13000),
290 voidptr(14000),
291 voidptr(15000),
292 ]
293 assert a.len == 6
294 assert a[0] == voidptr(10000)
295 assert a[1] == voidptr(11000)
296 assert a[2] == voidptr(12000)
297 assert a[3] == voidptr(13000)
298 assert a[4] == voidptr(14000)
299 assert a[5] == voidptr(15000)
300}
301
302fn check_voidptr_array_rw() {
303 mut a := [
304 voidptr(-1),
305 voidptr(-1),
306 voidptr(-1),
307 voidptr(-1),
308 voidptr(-1),
309 voidptr(-1),
310 ]
311 assert a.len == 6
312
313 assert a[0] == voidptr(-1)
314 assert a[1] == voidptr(-1)
315 assert a[2] == voidptr(-1)
316 assert a[3] == voidptr(-1)
317 assert a[4] == voidptr(-1)
318 assert a[5] == voidptr(-1)
319
320 a[0] = voidptr(100000)
321 assert a[0] == voidptr(100000)
322
323 a[1] = voidptr(110000)
324 assert a[1] == voidptr(110000)
325
326 a[2] = voidptr(120000)
327 assert a[2] == voidptr(120000)
328
329 a[3] = voidptr(130000)
330 assert a[3] == voidptr(130000)
331
332 a[4] = voidptr(140000)
333 assert a[4] == voidptr(140000)
334
335 a[5] = voidptr(150000)
336 assert a[5] == voidptr(150000)
337}
338
339fn main() {
340 mut fails := 0
341 fails += forkedtest.normal_run(check_fork_minimal, 'check_fork_minimal')
342 fails += forkedtest.normal_run(check_munmap_fail, 'check_munmap_fail')
343 fails += forkedtest.normal_run(check_mmap_one_page, 'check_mmap_one_page')
344 fails += forkedtest.normal_run(check_mm_pages, 'check_mm_pages')
345 fails += forkedtest.normal_run(check_mm_alloc, 'check_mm_alloc')
346 fails += forkedtest.normal_run(check_read_write_pipe, 'check_read_write_pipe')
347 fails += forkedtest.normal_run(check_read_file, 'check_read_file')
348 // check_print()
349 fails += forkedtest.normal_run(check_open_file_fail, 'check_open_file_fail')
350 fails += forkedtest.normal_run(check_int_array_ro, 'check_int_array_ro')
351 fails += forkedtest.normal_run(check_int_array_rw, 'check_int_array_rw')
352 fails += forkedtest.normal_run(check_int64_array_ro, 'check_int64_array_ro')
353 fails += forkedtest.normal_run(check_voidptr_array_ro, 'check_voidptr_array_ro')
354 fails += forkedtest.normal_run(check_voidptr_array_rw, 'check_voidptr_array_rw')
355
356 assert fails == 0
357 sys_exit(0)
358}
359