@@ -428,6 +428,124 @@ test_tcp_listen_activation_bad_arg(void)
428
428
nng_stream_listener_free (l1 );
429
429
}
430
430
431
+ void
432
+ test_tcp_dialer_local_bind (void )
433
+ {
434
+ nng_stream_dialer * d ;
435
+ nng_sockaddr sa = { 0 };
436
+
437
+ NUTS_PASS (nng_stream_dialer_alloc (& d , "tcp://127.0.0.1:80" ));
438
+
439
+ sa .s_in .sa_family = NNG_AF_INET ;
440
+ sa .s_in .sa_addr = nuts_be32 (0x7F000001 ); // loopback
441
+ sa .s_in .sa_port = 0 ;
442
+ NUTS_PASS (nng_stream_dialer_set_addr (d , NNG_OPT_LOCADDR , & sa ));
443
+ memset (& sa , 0 , sizeof (sa ));
444
+ NUTS_PASS (nng_stream_dialer_get_addr (d , NNG_OPT_LOCADDR , & sa ));
445
+ NUTS_TRUE (sa .s_in .sa_family == NNG_AF_INET );
446
+ NUTS_TRUE (sa .s_in .sa_addr == nuts_be32 (0x7F000001 ));
447
+ NUTS_TRUE (sa .s_in .sa_port == 0 );
448
+ nng_stream_dialer_free (d );
449
+ }
450
+
451
+ void
452
+ test_tcp_dialer_local_bind_v6 (void )
453
+ {
454
+ #ifdef NNG_ENABLE_IPV6
455
+ nng_stream_dialer * d ;
456
+ nng_sockaddr sa = { 0 };
457
+ uint8_t loopback [16 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
458
+ 1 };
459
+
460
+ NUTS_PASS (nng_stream_dialer_alloc (& d , "tcp://[::1]:80" ));
461
+
462
+ sa .s_in6 .sa_family = NNG_AF_INET6 ;
463
+ memcpy (sa .s_in6 .sa_addr , loopback , 16 );
464
+ sa .s_in6 .sa_addr [15 ] = 1 ;
465
+ sa .s_in6 .sa_port = 0 ;
466
+ NUTS_PASS (nng_stream_dialer_set_addr (d , NNG_OPT_LOCADDR , & sa ));
467
+ memset (& sa , 0 , sizeof (sa ));
468
+ NUTS_PASS (nng_stream_dialer_get_addr (d , NNG_OPT_LOCADDR , & sa ));
469
+ NUTS_TRUE (sa .s_in6 .sa_family == NNG_AF_INET6 );
470
+ NUTS_TRUE (memcmp (sa .s_in6 .sa_addr , loopback , 16 ) == 0 );
471
+ NUTS_TRUE (sa .s_in6 .sa_port == 0 );
472
+ nng_stream_dialer_free (d );
473
+ #else
474
+ NUTS_SKIP ("No IPv6 support" );
475
+ #endif
476
+ }
477
+
478
+ void
479
+ test_tcp_dialer_local_bind_no_port (void )
480
+ {
481
+ nng_stream_dialer * d ;
482
+ nng_sockaddr sa = { 0 };
483
+
484
+ NUTS_PASS (nng_stream_dialer_alloc (& d , "tcp://127.0.0.1:80" ));
485
+
486
+ memset (& sa , 0 , sizeof (sa ));
487
+ sa .s_family = NNG_AF_INPROC ;
488
+ NUTS_PASS (nng_stream_dialer_get_addr (d , NNG_OPT_LOCADDR , & sa ));
489
+
490
+ NUTS_TRUE (sa .s_in .sa_family == NNG_AF_UNSPEC );
491
+ nng_stream_dialer_free (d );
492
+ }
493
+
494
+ void
495
+ test_tcp_dialer_local_bind_bad_family (void )
496
+ {
497
+ nng_stream_dialer * d ;
498
+ nng_sockaddr sa = { 0 };
499
+
500
+ NUTS_PASS (nng_stream_dialer_alloc (& d , "tcp://127.0.0.1:80" ));
501
+
502
+ memset (& sa , 0 , sizeof (sa ));
503
+ sa .s_family = NNG_AF_INPROC ;
504
+ NUTS_FAIL (nng_stream_dialer_set_addr (d , NNG_OPT_LOCADDR , & sa ),
505
+ NNG_EADDRINVAL );
506
+ nng_stream_dialer_free (d );
507
+ }
508
+
509
+ void
510
+ test_tcp_dialer_local_unbound (void )
511
+ {
512
+ nng_stream_dialer * d ;
513
+ nng_sockaddr sa = { 0 };
514
+
515
+ NUTS_PASS (nng_stream_dialer_alloc (& d , "tcp://127.0.0.1:80" ));
516
+
517
+ sa .s_in .sa_family = NNG_AF_INET ;
518
+ sa .s_in .sa_addr = nuts_be32 (0x7F000001 ); // loopback
519
+ sa .s_in .sa_port = nuts_be16 (1212 );
520
+ NUTS_FAIL (nng_stream_dialer_set_addr (d , NNG_OPT_LOCADDR , & sa ),
521
+ NNG_EADDRINVAL );
522
+
523
+ #ifdef NNG_ENABLE_IPV6
524
+ memset (& sa , 0 , sizeof (sa ));
525
+ sa .s_in6 .sa_family = NNG_AF_INET6 ;
526
+ sa .s_in6 .sa_port = nuts_be16 (1212 );
527
+ NUTS_FAIL (nng_stream_dialer_set_addr (d , NNG_OPT_LOCADDR , & sa ),
528
+ NNG_EADDRINVAL );
529
+ #endif
530
+
531
+ nng_stream_dialer_free (d );
532
+ }
533
+
534
+ void
535
+ test_tcp_dialer_local_bind_bad_type (void )
536
+ {
537
+ nng_stream_dialer * d ;
538
+ nng_sockaddr sa = { 0 };
539
+
540
+ NUTS_PASS (nng_stream_dialer_alloc (& d , "tcp://127.0.0.1:80" ));
541
+
542
+ memset (& sa , 0 , sizeof (sa ));
543
+ sa .s_family = NNG_AF_INPROC ;
544
+ NUTS_FAIL (nng_stream_dialer_set_bool (d , NNG_OPT_LOCADDR , false),
545
+ NNG_EBADTYPE );
546
+ nng_stream_dialer_free (d );
547
+ }
548
+
431
549
NUTS_TESTS = {
432
550
{ "tcp stream" , test_tcp_stream },
433
551
{ "tcp listen accept cancel" , test_tcp_listen_accept_cancel },
@@ -443,5 +561,13 @@ NUTS_TESTS = {
443
561
test_tcp_listen_activation_bogus_fd },
444
562
{ "tcp socket activation bad arg" ,
445
563
test_tcp_listen_activation_bad_arg },
564
+ { "tcp dialer local bind" , test_tcp_dialer_local_bind },
565
+ { "tcp dialer local bind v6" , test_tcp_dialer_local_bind_v6 },
566
+ { "tcp dialer local bind no port" ,
567
+ test_tcp_dialer_local_bind_no_port },
568
+ { "tcp dialer local unbound" , test_tcp_dialer_local_unbound },
569
+ { "tcp dialer local bad family" ,
570
+ test_tcp_dialer_local_bind_bad_family },
571
+ { "tcp dialer local bad type" , test_tcp_dialer_local_bind_bad_type },
446
572
{ NULL , NULL },
447
573
};
0 commit comments