diff --git a/vlib/net/tcp_simple_client_server_test.v b/vlib/net/tcp_simple_client_server_test.v new file mode 100644 index 0000000000..e8fdb2762e --- /dev/null +++ b/vlib/net/tcp_simple_client_server_test.v @@ -0,0 +1,136 @@ +import io +import net +import time +import strings + +const ( + server_port = 22334 +) + +fn setup() (net.TcpListener, net.TcpConn, net.TcpConn) { + server := net.listen_tcp(server_port) or { + panic(err) + } + mut client := net.dial_tcp('127.0.0.1:$server_port') or { + panic(err) + } + client.set_read_timeout(3 * time.second) + client.set_write_timeout(3 * time.second) + mut socket := server.accept() or { + panic(err) + } + socket.set_read_timeout(3 * time.second) + socket.set_write_timeout(3 * time.second) + $if debug_peer_ip ? { + ip := con.peer_ip() or { + '$err' + } + eprintln('connection peer_ip: $ip') + } + assert true + return server, client, socket +} + +fn cleanup(server &net.TcpListener, client &net.TcpConn, socket &net.TcpConn) { + server.close() or { } + client.close() or { } + socket.close() or { } +} + +fn test_socket() { + server, client, socket := setup() + defer { + cleanup(server, client, socket) + } + message := 'Hello World' + socket.write_str(message) or { + assert false + return + } + assert true + $if debug { + println('message send: $message') + } + $if debug { + println('send socket: $socket.sock.handle') + } + mut buf := []byte{len: 1024} + nbytes := client.read(mut buf) or { + assert false + return + } + received := buf[0..nbytes].bytestr() + $if debug { + println('message received: $received') + } + $if debug { + println('client: $client.sock.handle') + } + assert message == received +} + +fn test_socket_write_and_read() { + server, client, socket := setup() + defer { + cleanup(server, client, socket) + } + message1 := 'a message 1' + socket.write_str(message1) or { + assert false + } + mut rbuf := []byte{len: message1.len} + client.read(mut rbuf) + line := rbuf.bytestr() + assert line == message1 +} + +fn test_socket_read_line() { + server, client, socket := setup() + mut reader := io.new_buffered_reader({ + reader: io.make_reader(client) + }) + defer { + cleanup(server, client, socket) + } + message1, message2 := 'message1', 'message2' + message := '$message1\n$message2\n' + socket.write_str(message) or { + assert false + } + assert true + // + line1 := reader.read_line() or { + // println(reader.buf) + assert false + return + } + line2 := reader.read_line() or { + // println(reader.buf) + assert false + return + } + assert line1 == message1 + assert line2 == message2 +} + +fn test_socket_write_fail_without_panic() { + server, client, socket := setup() + defer { + cleanup(server, client, socket) + } + message2 := 'a message 2' + // ensure that socket.write (i.e. done on the server side) + // continues to work, even when the client side has been disconnected + // this test is important for a stable long standing server + client.close() or { } + $if solaris { + return + } + // TODO: fix segfaulting on Solaris + for i := 0; i < 3; i++ { + socket.write_str(message2) or { + println('write to a socket without a recipient should produce an option fail: $err | $message2') + assert true + } + } +}