| 1 | // vtest build: tinyc |
| 2 | import net |
| 3 | import time |
| 4 | |
| 5 | fn 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 | |
| 44 | fn 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 | |