v / vlib / net / tcp_simple_client_server_test.v
155 lines · 142 sloc · 3.56 KB · d1606b22b7327f1b809288638d3c26204ac45ae5
Raw
1import io
2import net
3import strings
4
5const server_port = ':22443'
6
7fn accept(mut server net.TcpListener, c chan &net.TcpConn) {
8 c <- server.accept() or { panic(err) }
9}
10
11fn setup() (&net.TcpListener, &net.TcpConn, &net.TcpConn) {
12 mut server := net.listen_tcp(.ip6, server_port) or { panic(err) }
13
14 c := chan &net.TcpConn{}
15 spawn accept(mut server, c)
16 mut client := net.dial_tcp('localhost${server_port}') or { panic(err) }
17
18 socket := <-c
19
20 $if debug_peer_ip ? {
21 eprintln('${server.addr()}\n${client.peer_addr()}, ${client.addr()}\n${socket.peer_addr()}, ${socket.addr()}')
22 }
23 assert true
24 return server, client, socket
25}
26
27fn cleanup(mut server net.TcpListener, mut client net.TcpConn, mut socket net.TcpConn) {
28 server.close() or {}
29 client.close() or {}
30 socket.close() or {}
31}
32
33fn test_socket() {
34 mut server, mut client, mut socket := setup()
35 defer {
36 cleanup(mut server, mut client, mut socket)
37 }
38 message := 'Hello World'
39 socket.write_string(message) or {
40 assert false
41 return
42 }
43 assert true
44 $if debug {
45 println('message send: ${message}')
46 }
47 $if debug {
48 println('send socket: ${socket.sock.handle}')
49 }
50 mut buf := []u8{len: 1024}
51 nbytes := client.read(mut buf) or {
52 assert false
53 return
54 }
55 received := buf[0..nbytes].bytestr()
56 $if debug {
57 println('message received: ${received}')
58 }
59 $if debug {
60 println('client: ${client.sock.handle}')
61 }
62 assert message == received
63}
64
65fn test_socket_write_and_read() {
66 mut server, mut client, mut socket := setup()
67 addr := socket.peer_addr()!
68 ip := socket.peer_ip()!
69 assert ip in ['::1', 'localhost', '127.0.0.1', '::ffff:127.0.0.1']
70 println('> ip: ${ip} | addr: ${addr}')
71 defer {
72 cleanup(mut server, mut client, mut socket)
73 }
74 message1 := 'a message 1'
75 socket.write_string(message1) or { assert false }
76 mut rbuf := []u8{len: message1.len}
77 client.read(mut rbuf) or {
78 assert false
79 return
80 }
81 line := rbuf.bytestr()
82 assert line == message1
83}
84
85fn test_socket_read_line() {
86 mut server, mut client, mut socket := setup()
87 mut reader := io.new_buffered_reader(reader: client)
88 defer {
89 cleanup(mut server, mut client, mut socket)
90 }
91 message1, message2 := 'message1', 'message2'
92 message := '${message1}\n${message2}\n'
93 socket.write_string(message) or { assert false }
94 assert true
95
96 line1 := reader.read_line() or {
97 // println(reader.buf)
98 assert false
99 return
100 }
101 line2 := reader.read_line() or {
102 // println(reader.buf)
103 assert false
104 return
105 }
106 assert line1 == message1
107 assert line2 == message2
108}
109
110fn test_socket_write_fail_without_panic() {
111 mut server, mut client, mut socket := setup()
112 defer {
113 cleanup(mut server, mut client, mut socket)
114 }
115 message2 := 'a message 2'
116 // ensure that socket.write (i.e. done on the server side)
117 // continues to work, even when the client side has been disconnected
118 // this test is important for a stable long standing server
119 client.close() or {}
120 $if solaris {
121 return
122 }
123 $if freebsd {
124 return
125 }
126 // TODO: fix segfaulting on Solaris and FreeBSD
127 for i := 0; i < 3; i++ {
128 socket.write_string(message2) or {
129 println('write to a socket without a recipient should produce an option fail: ${err} | ${message2}')
130 assert true
131 }
132 }
133}
134
135fn test_socket_read_line_long_line_without_eol() {
136 mut server, mut client, mut socket := setup()
137 mut reader := io.new_buffered_reader(reader: client)
138 defer {
139 cleanup(mut server, mut client, mut socket)
140 }
141 message := strings.repeat_string('123', 400)
142 socket.write_string(message) or {
143 assert false
144 return
145 }
146 socket.write_string('\n') or {
147 assert false
148 return
149 }
150 line := reader.read_line() or {
151 assert false
152 return
153 }
154 assert line == message
155}
156