@@ -18,6 +18,7 @@ import "core:sync"
18
18
import " core:time"
19
19
import " core:thread"
20
20
import " core:fmt"
21
+ import " core:log"
21
22
22
23
@test
23
24
address_parsing_test :: proc (t: ^testing.T) {
@@ -216,6 +217,8 @@ IP_Address_Parsing_Test_Vectors :: []IP_Address_Parsing_Test_Vector{
216
217
ENDPOINT_TWO_SERVERS := net.Endpoint{net.IP4_Address{127 , 0 , 0 , 1 }, 9991 }
217
218
ENDPOINT_CLOSED_PORT := net.Endpoint{net.IP4_Address{127 , 0 , 0 , 1 }, 9992 }
218
219
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 }
219
222
220
223
@(test)
221
224
two_servers_binding_same_endpoint :: proc (t: ^testing.T) {
@@ -256,7 +259,7 @@ client_sends_server_data :: proc(t: ^testing.T) {
256
259
}
257
260
258
261
tcp_client :: proc (thread_data: rawptr ) {
259
- r := transmute (^Thread_Data)thread_data
262
+ r := cast (^Thread_Data)thread_data
260
263
261
264
defer sync.wait_group_done (r.wg)
262
265
@@ -271,7 +274,7 @@ client_sends_server_data :: proc(t: ^testing.T) {
271
274
}
272
275
273
276
tcp_server :: proc (thread_data: rawptr ) {
274
- r := transmute (^Thread_Data)thread_data
277
+ r := cast (^Thread_Data)thread_data
275
278
276
279
defer sync.wait_group_done (r.wg)
277
280
@@ -516,6 +519,102 @@ join_url_test :: proc(t: ^testing.T) {
516
519
}
517
520
}
518
521
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
+
519
618
@(private)
520
619
address_to_binstr :: proc (address: net.Address) -> (binstr: string ) {
521
620
switch t in address {
0 commit comments