net: improve socket_test (#6822)
							parent
							
								
									01579957b8
								
							
						
					
					
						commit
						5069be04a2
					
				| 
						 | 
					@ -1,12 +1,20 @@
 | 
				
			||||||
import net
 | 
					import net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn setup() (net.Socket, net.Socket, net.Socket) {
 | 
					fn setup() (net.Socket, net.Socket, net.Socket) {
 | 
				
			||||||
	server := net.listen(0) or { panic(err)	}
 | 
						server := net.listen(0) or {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	server_port := server.get_port()
 | 
						server_port := server.get_port()
 | 
				
			||||||
	client := net.dial('127.0.0.1', server_port) or { panic(err) }
 | 
						client := net.dial('127.0.0.1', server_port) or {
 | 
				
			||||||
	socket := server.accept() or { panic(err) }
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						socket := server.accept() or {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	$if debug_peer_ip ? {
 | 
						$if debug_peer_ip ? {
 | 
				
			||||||
		ip := socket.peer_ip() or { '$err' }
 | 
							ip := socket.peer_ip() or {
 | 
				
			||||||
 | 
								'$err'
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		eprintln('socket peer_ip: $ip')
 | 
							eprintln('socket peer_ip: $ip')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return server, client, socket
 | 
						return server, client, socket
 | 
				
			||||||
| 
						 | 
					@ -20,43 +28,79 @@ fn cleanup(server &net.Socket, client &net.Socket, socket &net.Socket) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_socket() {
 | 
					fn test_socket() {
 | 
				
			||||||
	server, client, socket := setup()
 | 
						server, client, socket := setup()
 | 
				
			||||||
 | 
						defer {
 | 
				
			||||||
 | 
							cleanup(server, client, socket)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	message := 'Hello World'
 | 
						message := 'Hello World'
 | 
				
			||||||
	socket.send(message.str, message.len) or { assert false }
 | 
						socket.send(message.str, message.len) or {
 | 
				
			||||||
	$if debug {	println('message send: $message')	}
 | 
							assert false
 | 
				
			||||||
	$if debug {	println('send socket: $socket.sockfd')	}
 | 
						}
 | 
				
			||||||
 | 
						$if debug {
 | 
				
			||||||
 | 
							println('message send: $message')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$if debug {
 | 
				
			||||||
 | 
							println('send socket: $socket.sockfd')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	bytes, blen := client.recv(1024)
 | 
						bytes, blen := client.recv(1024)
 | 
				
			||||||
	received := tos(bytes, blen)
 | 
						received := tos(bytes, blen)
 | 
				
			||||||
	$if debug {	println('message received: $received')	}
 | 
						$if debug {
 | 
				
			||||||
	$if debug {	println('client: $client.sockfd')	}
 | 
							println('message received: $received')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$if debug {
 | 
				
			||||||
 | 
							println('client: $client.sockfd')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	assert message == received
 | 
						assert message == received
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_socket_read_line() {
 | 
				
			||||||
 | 
						server, client, socket := setup()
 | 
				
			||||||
 | 
						defer {
 | 
				
			||||||
		cleanup(server, client, socket)
 | 
							cleanup(server, client, socket)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						message1, message2 := 'message1', 'message2'
 | 
				
			||||||
 | 
						message := '$message1\n$message2'
 | 
				
			||||||
 | 
						socket.write(message) or {
 | 
				
			||||||
 | 
							assert false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						line1, line2 := client.read_line(), client.read_line()
 | 
				
			||||||
 | 
						assert line1 != message1
 | 
				
			||||||
 | 
						assert line1.trim_space() == message1
 | 
				
			||||||
 | 
						assert line2 != message2
 | 
				
			||||||
 | 
						assert line2.trim_space() == message2
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_socket_write() {
 | 
					fn test_socket_write() {
 | 
				
			||||||
	server, client, socket := setup()
 | 
						server, client, socket := setup()
 | 
				
			||||||
 | 
						defer {
 | 
				
			||||||
 | 
							cleanup(server, client, socket)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	message1 := 'a message 1'
 | 
						message1 := 'a message 1'
 | 
				
			||||||
	socket.write(message1) or { assert false }
 | 
						socket.write(message1) or {
 | 
				
			||||||
 | 
							assert false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	line1 := client.read_line()
 | 
						line1 := client.read_line()
 | 
				
			||||||
	assert line1 != message1
 | 
						assert line1 != message1
 | 
				
			||||||
	assert line1.trim_space() == message1
 | 
						assert line1.trim_space() == message1
 | 
				
			||||||
	cleanup(server, client, socket)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_socket_write_fail_without_panic() {
 | 
					fn test_socket_write_fail_without_panic() {
 | 
				
			||||||
	server, client, socket := setup()
 | 
						server, client, socket := setup()
 | 
				
			||||||
 | 
						defer {
 | 
				
			||||||
 | 
							cleanup(server, client, socket)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	message2 := 'a message 2'
 | 
						message2 := 'a message 2'
 | 
				
			||||||
	// ensure that socket.write (i.e. done on the server side)
 | 
						// ensure that socket.write (i.e. done on the server side)
 | 
				
			||||||
	// continues to work, even when the client side has been disconnected
 | 
						// continues to work, even when the client side has been disconnected
 | 
				
			||||||
	// this test is important for a stable long standing server
 | 
						// this test is important for a stable long standing server
 | 
				
			||||||
	client.close() or { }
 | 
						client.close() or { }
 | 
				
			||||||
	$if solaris { return } // TODO: fix segfaulting on Solaris
 | 
						$if solaris {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// TODO: fix segfaulting on Solaris
 | 
				
			||||||
	for i := 0; i < 3; i++ {
 | 
						for i := 0; i < 3; i++ {
 | 
				
			||||||
		socket.write(message2) or {
 | 
							socket.write(message2) or {
 | 
				
			||||||
			println('write to a socket without a recipient should produce an option fail: $err | $message2')
 | 
								println('write to a socket without a recipient should produce an option fail: $err | $message2')
 | 
				
			||||||
			assert true
 | 
								assert true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cleanup(server, client, socket)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue