diff options
| author | Feoramund <161657516+Feoramund@users.noreply.github.com> | 2024-08-05 00:29:37 -0400 |
|---|---|---|
| committer | Feoramund <161657516+Feoramund@users.noreply.github.com> | 2024-08-05 02:08:48 -0400 |
| commit | 42a2297d31f6d6d617f70a2dd5725cefc4f7253c (patch) | |
| tree | c9d603942d1922e99cb49ca97c1253bcf7dd51d5 | |
| parent | 8de48d81eac3cd69e5df62867a4ef78a6cfaecd1 (diff) | |
Add `core:net` tests specifically for FreeBSD
| -rw-r--r-- | tests/core/net/test_core_net_freebsd.odin | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/tests/core/net/test_core_net_freebsd.odin b/tests/core/net/test_core_net_freebsd.odin new file mode 100644 index 000000000..85a73aa9e --- /dev/null +++ b/tests/core/net/test_core_net_freebsd.odin @@ -0,0 +1,77 @@ +//+build freebsd +package test_core_net + +import "core:net" +import "core:time" +import "core:testing" + +ENDPOINT_DUPLICATE_BINDING := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 11000} +ENDPOINT_EPIPE_TEST := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 11001} + +@test +test_duplicate_binding :: proc(t: ^testing.T) { + // FreeBSD has the capacity to permit multiple processes and sockets to + // bind on the same port with the right option. + + raw_socket1, err_create1 := net.create_socket(.IP4, .TCP) + if !testing.expect_value(t, err_create1, nil) { + return + } + defer net.close(raw_socket1) + tcp_socket1 := raw_socket1.(net.TCP_Socket) + err_set1 := net.set_option(tcp_socket1, .Reuse_Port, true) + if !testing.expect_value(t, err_set1, nil) { + return + } + err_bind1 := net.bind(tcp_socket1, ENDPOINT_DUPLICATE_BINDING) + if !testing.expect_value(t, err_bind1, nil) { + return + } + + raw_socket2, err_create2 := net.create_socket(.IP4, .TCP) + if !testing.expect_value(t, err_create2, nil) { + return + } + defer net.close(raw_socket2) + tcp_socket2 := raw_socket2.(net.TCP_Socket) + err_set2 := net.set_option(tcp_socket2, .Reuse_Port, true) + if !testing.expect_value(t, err_set2, nil) { + return + } + err_bind2 := net.bind(tcp_socket2, ENDPOINT_DUPLICATE_BINDING) + if !testing.expect_value(t, err_bind2, nil) { + return + } +} + +@test +test_sigpipe_bypass :: proc(t: ^testing.T) { + // If the internals aren't working as expected, this test will fail by raising SIGPIPE. + + server_socket, listen_err := net.listen_tcp(ENDPOINT_EPIPE_TEST) + if !testing.expect_value(t, listen_err, nil) { + return + } + defer net.close(server_socket) + + client_socket, dial_err := net.dial_tcp(ENDPOINT_EPIPE_TEST) + if !testing.expect_value(t, dial_err, nil) { + return + } + defer net.close(client_socket) + + time.sleep(10 * time.Millisecond) + + net.close(server_socket) + + time.sleep(10 * time.Millisecond) + + data := "Hellope!" + bytes_written, err_send := net.send(client_socket, transmute([]u8)data) + if !testing.expect_value(t, err_send, net.TCP_Send_Error.Cannot_Send_More_Data) { + return + } + if !testing.expect_value(t, bytes_written, 0) { + return + } +} |