aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2025-12-21 18:01:50 +0100
committerLaytan Laats <laytanlaats@hotmail.com>2025-12-21 19:10:42 +0100
commit9cace192776656d2237c25e402fd321f05ae1aeb (patch)
treeef8fc5f8fcea5c397c23a4d440e0a446f1738aea /tests
parent06076e02c0acd0559eeefb32a1a420e4d7243aa7 (diff)
net(docs): recv of 0 bytes with no error is a graceful close
Diffstat (limited to 'tests')
-rw-r--r--tests/core/net/test_core_net.odin35
1 files changed, 35 insertions, 0 deletions
diff --git a/tests/core/net/test_core_net.odin b/tests/core/net/test_core_net.odin
index ec45744f3..9b3973a60 100644
--- a/tests/core/net/test_core_net.odin
+++ b/tests/core/net/test_core_net.odin
@@ -624,6 +624,41 @@ test_nonblocking_option :: proc(t: ^testing.T) {
}
}
+// Test that when the server closes it's connection, the client's next receive is `0, nil` to indicate a correct close.
+@(test)
+test_connection_close :: proc(t: ^testing.T) {
+ server, listen_err := net.listen_tcp({address=net.IP4_Address{127, 0, 0, 1}, port=0})
+ testing.expect_value(t, listen_err, nil)
+ defer net.close(server)
+
+ server_ep, bound_endpoint_err := net.bound_endpoint(server)
+ testing.expect_value(t, bound_endpoint_err, nil)
+
+ client, dial_err := net.dial_tcp(server_ep)
+ testing.expect_value(t, dial_err, nil)
+ defer net.close(client)
+
+ server_client, _, accept_err := net.accept_tcp(server)
+ testing.expect_value(t, accept_err, nil)
+
+ send_buf: [512]byte = 1
+ sent, send_err := net.send(server_client, send_buf[:])
+ testing.expect_value(t, sent, 512)
+ testing.expect_value(t, send_err, nil)
+ net.close(server_client)
+
+ recv_buf: [512]byte = ---
+ received, recv_err := net.recv(client, recv_buf[:])
+ testing.expect_value(t, received, 512)
+ testing.expect_value(t, recv_err, nil)
+
+ testing.expect_value(t, recv_buf, send_buf)
+
+ received, recv_err = net.recv(client, recv_buf[:])
+ testing.expect_value(t, received, 0)
+ testing.expect_value(t, recv_err, nil)
+}
+
@(private)
address_to_binstr :: proc(address: net.Address) -> (binstr: string) {
switch t in address {