Skip to content

Commit b4ca044

Browse files
authored
Merge pull request #3846 from Feoramund/add-more-net-tests
Add more `core:net` tests
2 parents a2b23de + 8e64265 commit b4ca044

File tree

1 file changed

+101
-2
lines changed

1 file changed

+101
-2
lines changed

tests/core/net/test_core_net.odin

+101-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import "core:sync"
1818
import "core:time"
1919
import "core:thread"
2020
import "core:fmt"
21+
import "core:log"
2122

2223
@test
2324
address_parsing_test :: proc(t: ^testing.T) {
@@ -216,6 +217,8 @@ IP_Address_Parsing_Test_Vectors :: []IP_Address_Parsing_Test_Vector{
216217
ENDPOINT_TWO_SERVERS := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9991}
217218
ENDPOINT_CLOSED_PORT := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9992}
218219
ENDPOINT_SERVER_SENDS := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9993}
220+
ENDPOINT_UDP_ECHO := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9994}
221+
ENDPOINT_NONBLOCK := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9995}
219222

220223
@(test)
221224
two_servers_binding_same_endpoint :: proc(t: ^testing.T) {
@@ -256,7 +259,7 @@ client_sends_server_data :: proc(t: ^testing.T) {
256259
}
257260

258261
tcp_client :: proc(thread_data: rawptr) {
259-
r := transmute(^Thread_Data)thread_data
262+
r := cast(^Thread_Data)thread_data
260263

261264
defer sync.wait_group_done(r.wg)
262265

@@ -271,7 +274,7 @@ client_sends_server_data :: proc(t: ^testing.T) {
271274
}
272275

273276
tcp_server :: proc(thread_data: rawptr) {
274-
r := transmute(^Thread_Data)thread_data
277+
r := cast(^Thread_Data)thread_data
275278

276279
defer sync.wait_group_done(r.wg)
277280

@@ -516,6 +519,102 @@ join_url_test :: proc(t: ^testing.T) {
516519
}
517520
}
518521

522+
@test
523+
test_udp_echo :: proc(t: ^testing.T) {
524+
server, make_server_err := net.make_unbound_udp_socket(.IP4)
525+
if !testing.expect_value(t, make_server_err, nil) {
526+
return
527+
}
528+
defer net.close(server)
529+
530+
bind_server_err := net.bind(server, ENDPOINT_UDP_ECHO)
531+
if !testing.expect_value(t, bind_server_err, nil) {
532+
return
533+
}
534+
535+
client, make_client_err := net.make_unbound_udp_socket(.IP4)
536+
if !testing.expect_value(t, make_client_err, nil) {
537+
return
538+
}
539+
defer net.close(client)
540+
541+
msg := "Hellope world!"
542+
buf: [64]u8
543+
544+
bytes_written, send_err := net.send_udp(client, transmute([]u8)msg[:], ENDPOINT_UDP_ECHO)
545+
if !testing.expect_value(t, send_err, nil) {
546+
return
547+
}
548+
if !testing.expect_value(t, bytes_written, len(msg)) {
549+
return
550+
}
551+
552+
bytes_read, _, read_err := net.recv_udp(server, buf[:])
553+
if !testing.expect_value(t, read_err, nil) {
554+
return
555+
}
556+
if !testing.expect_value(t, bytes_read, len(msg)) {
557+
return
558+
}
559+
560+
testing.expect_value(t, msg, transmute(string)buf[:bytes_read])
561+
}
562+
563+
@test
564+
test_dns_resolve :: proc(t: ^testing.T) {
565+
// NOTE: This test depends on external factors, so if it fails, an IP
566+
// address may have changed or become unavailable.
567+
568+
// The net API returns only one address per protocol version, and DNS
569+
// records can store many, so we'll have to check all possibilities.
570+
ep4, ep6, resolve_err := net.resolve("dns.quad9.net")
571+
if !testing.expect_value(t, resolve_err, nil) {
572+
return
573+
}
574+
575+
ip4, ip4_ok := ep4.address.(net.IP4_Address)
576+
if !testing.expect(t, ip4_ok, "Unable to resolve IP4") {
577+
return
578+
}
579+
580+
valid_ip4_a := net.IP4_Address{ 9, 9, 9, 9}
581+
valid_ip4_b := net.IP4_Address{149, 112, 112, 112}
582+
if ip4 != valid_ip4_a && ip4 != valid_ip4_b {
583+
log.errorf("DNS resolved to invalid IP4: %v, expected %v or %v", ip4, valid_ip4_a, valid_ip4_b)
584+
}
585+
586+
ip6, ip6_ok := ep6.address.(net.IP6_Address)
587+
if !testing.expect(t, ip6_ok, "Unable to resolve IP6") {
588+
return
589+
}
590+
591+
valid_ip6_a := net.IP6_Address{0x2620, 0xfe, 0, 0, 0, 0, 0, 9}
592+
valid_ip6_b := net.IP6_Address{0x2620, 0xfe, 0, 0, 0, 0, 0, 0xfe}
593+
if ip6 != valid_ip6_a && ip6 != valid_ip6_b {
594+
log.errorf("DNS resolved to invalid IP6: %v, expected %v or %v", ip6, valid_ip6_a, valid_ip6_b)
595+
}
596+
}
597+
598+
@test
599+
test_nonblocking_option :: proc(t: ^testing.T) {
600+
server, listen_err := net.listen_tcp(ENDPOINT_NONBLOCK)
601+
if !testing.expect_value(t, listen_err, nil) {
602+
return
603+
}
604+
defer net.close(server)
605+
606+
testing.set_fail_timeout(t, 2 * time.Second)
607+
608+
// If the nonblocking option isn't set correctly in the operating system,
609+
// this should block until the timeout hits.
610+
net.set_blocking(server, false)
611+
612+
_, _, accept_err := net.accept_tcp(server)
613+
if !testing.expect_value(t, accept_err, net.Accept_Error.Would_Block) {
614+
return
615+
}
616+
}
617+
519618
@(private)
520619
address_to_binstr :: proc(address: net.Address) -> (binstr: string) {
521620
switch t in address {

0 commit comments

Comments
 (0)