v / vlib / net / unix / unix_socket_test.v
99 lines · 86 sloc · 2.65 KB · 4db6408e0b94d7adb55a5aaf0e362e1e1b408e0b
Raw
1// vtest flaky: true
2// vtest retry: 3
3import os
4import log
5import time
6import net.unix
7
8const tfolder = os.join_path(os.temp_dir(), 'unix_socket_${os.getpid()}')
9const socket_path = os.join_path(tfolder, 'v_unix.sock')
10
11fn testsuite_begin() {
12 os.mkdir_all(tfolder) or {}
13}
14
15fn testsuite_end() {
16 os.rmdir_all(tfolder) or {}
17}
18
19fn handle_conn(mut c unix.StreamConn) {
20 log.warn(' handle_conn ${voidptr(c)} start')
21 for {
22 mut buf := []u8{len: 100, init: 0}
23 log.warn(' handle_conn ${voidptr(c)}, reading data...')
24 read := c.read(mut buf) or {
25 log.warn(' handle_conn ${voidptr(c)}, reading failed, connection was dropped.')
26 return
27 }
28 log.warn(' handle_conn ${voidptr(c)}, read: ${read} bytes')
29 written := c.write(buf[..read]) or {
30 log.warn(' handle_conn ${voidptr(c)}, writing failed, connection was dropped.')
31 return
32 }
33 log.warn(' handle_conn ${voidptr(c)}, written: ${written} bytes')
34 }
35}
36
37fn echo_server(mut l unix.StreamListener) ! {
38 log.warn('echo_server l: ${voidptr(l)}, start')
39 for {
40 log.warn('echo_server l: ${voidptr(l)}, waiting for connections...')
41 mut new_conn := l.accept() or { continue }
42 log.warn('echo_server l: ${voidptr(l)}, accepted new connection: ${voidptr(new_conn)}, spawning a new thread to handle it...')
43 spawn handle_conn(mut new_conn)
44 time.sleep(10 * time.millisecond)
45 }
46}
47
48fn echo() ! {
49 log.info('echo: connecting to ${socket_path}...')
50 mut c := unix.connect_stream(socket_path)!
51 defer {
52 log.info('echo: closing ${voidptr(c)} ...')
53 c.close() or {}
54 }
55 data := 'Hello from vlib/net!'
56 log.info('echo: writing `${data}` to ${voidptr(c)} ...')
57 c.write_string(data)!
58 mut buf := []u8{len: 4096}
59 read := c.read(mut buf)!
60 log.info('echo: read ${read} bytes from ${voidptr(c)} ...')
61 assert read == data.len
62 for i := 0; i < read; i++ {
63 assert buf[i] == data[i]
64 }
65 log.info('echo: got `${buf.bytestr()}` back from ${voidptr(c)}.')
66 return
67}
68
69fn test_tcp() {
70 log.use_stdout()
71 unbuffer_stdout()
72 os.rm(socket_path) or {}
73 assert os.exists(socket_path) == false
74 log.info('${@LOCATION}, setup complete')
75
76 log.info('>>> create listening socket at ${socket_path}...')
77 mut l := unix.listen_stream(socket_path) or { panic(err) }
78 log.info('>>> listening socket at ${socket_path} is ${voidptr(l)}.')
79 println('')
80
81 log.info('>>> spawning server with connection ${voidptr(l)}...')
82 spawn echo_server(mut l)
83 println('')
84
85 for i in 0 .. 3 {
86 log.info('>>> start echo to server, i: ${i}...')
87 echo()!
88 println('')
89 }
90
91 log.info('>>> closing listening socket ${voidptr(l)}...')
92 l.close() or {}
93 println('')
94
95 // test if socket file is removed/unlinked
96 assert os.exists(socket_path) == false
97
98 log.info('${@LOCATION}, done')
99}
100