v/vlib/net/socket_test.v

59 lines
1.7 KiB
V

import net
fn setup() (net.Socket, net.Socket, net.Socket) {
server := net.listen(0) or { panic(err) }
server_port := server.get_port()
client := net.dial('127.0.0.1', server_port) or { panic(err) }
socket := server.accept() or { panic(err) }
return server, client, socket
}
fn cleanup(server &net.Socket, client &net.Socket, socket &net.Socket) {
server.close() or {}
client.close() or {}
socket.close() or {}
}
fn test_socket() {
server, client, socket := setup()
message := 'Hello World'
socket.send(message.str, message.len) or { assert false }
$if debug { println('message send: $message') }
$if debug { println('send socket: $socket.sockfd') }
bytes, blen := client.recv(1024)
received := tos(bytes, blen)
$if debug { println('message received: $received') }
$if debug { println('client: $client.sockfd') }
assert message == received
cleanup(server, client, socket)
}
fn test_socket_write() {
server, client, socket := setup()
message1 := 'a message 1'
socket.write(message1) or { assert false }
line1 := client.read_line()
assert line1 != message1
assert line1.trim_space() == message1
cleanup(server, client, socket)
}
fn test_socket_write_fail_without_panic() {
server, client, socket := setup()
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(message2) or {
println('write to a socket without a recipient should produce an option fail: $err | $message2')
assert true
}
}
cleanup(server, client, socket)
}