v / vlib / net / tcp_non_blocking_test.v
53 lines · 51 sloc · 1.4 KB · e1b3e5b656a56e08dc0f32f13f4e4f992932d5ec
Raw
1// vtest build: tinyc
2import net
3import time
4
5fn server_thread(c_chan chan int) {
6 errors_no_data := [net.err_timed_out.code(), int(net.error_ewouldblock), int(net.error_eagain),
7 int(net.error_eintr)]
8 mut buf := []u8{len: 128}
9 mut times := 0
10 mut read_len := 0
11 mut listener := net.listen_tcp(.ip, ':22444') or { panic(err) }
12 c_chan <- 1
13 mut server := listener.accept() or { panic(err) }
14 server.set_read_timeout(2 * time.second)
15 server.set_blocking(false) or { panic(err) }
16 read_len = server.read(mut buf) or { // nothing can be read yet
17 assert err.code() in errors_no_data
18 -1
19 }
20 assert read_len == -1 // ensure there is an error with no data
21 read_len = server.read(mut buf) or { // nothing can be read yet
22 assert err.code() in errors_no_data
23 -2
24 }
25 assert read_len == -2 // ensure there is an error with no data
26 c_chan <- 2
27 for times < 10 {
28 times++
29 time.sleep(1 * time.millisecond)
30 read_len = server.read(mut buf) or {
31 if err.code() in errors_no_data {
32 continue
33 } else {
34 panic(err)
35 }
36 }
37 if read_len > 0 {
38 break
39 }
40 }
41 assert unsafe { tos_clone(&buf[0]) == 'hello' }
42}
43
44fn test_non_blocking_read() {
45 mut c_chan := chan int{cap: 1}
46 server := spawn server_thread(c_chan)
47 _ := <-c_chan // 1
48 mut conn := net.dial_tcp('127.0.0.1:22444') or { panic(err) }
49 conn.set_blocking(false) or { panic(err) }
50 _ := <-c_chan // 2
51 conn.write('hello'.bytes()) or { panic(err) }
52 server.wait()
53}
54