1
1
use super :: * ;
2
2
3
- use crate :: { error:: Result , proto:: lifetime:: DEFAULT_LIFETIME , relay:: relay_none:: * } ;
4
-
5
- use std:: { net:: Ipv4Addr , str:: FromStr } ;
3
+ use crate :: {
4
+ auth:: { generate_auth_key, AuthHandler } ,
5
+ client:: { Client , ClientConfig } ,
6
+ error:: Result ,
7
+ proto:: lifetime:: DEFAULT_LIFETIME ,
8
+ relay:: { relay_none:: * , relay_static:: RelayAddressGeneratorStatic } ,
9
+ server:: {
10
+ config:: { ConnConfig , ServerConfig } ,
11
+ Server ,
12
+ } ,
13
+ } ;
14
+
15
+ use std:: {
16
+ net:: { IpAddr , Ipv4Addr } ,
17
+ str:: FromStr ,
18
+ } ;
6
19
use stun:: { attributes:: ATTR_USERNAME , textattrs:: TextAttribute } ;
7
20
use tokio:: net:: UdpSocket ;
8
21
use util:: vnet:: net:: * ;
@@ -357,7 +370,7 @@ async fn test_delete_allocation_by_username() -> Result<()> {
357
370
Arc :: clone ( & turn_socket) ,
358
371
0 ,
359
372
DEFAULT_LIFETIME ,
360
- TextAttribute :: new ( ATTR_USERNAME , String :: from ( "user2" ) ) ,
373
+ TextAttribute :: new ( ATTR_USERNAME , "user2" . into ( ) ) ,
361
374
)
362
375
. await ?;
363
376
@@ -375,3 +388,174 @@ async fn test_delete_allocation_by_username() -> Result<()> {
375
388
376
389
Ok ( ( ) )
377
390
}
391
+
392
+ struct TestAuthHandler ;
393
+ impl AuthHandler for TestAuthHandler {
394
+ fn auth_handle ( & self , username : & str , realm : & str , _src_addr : SocketAddr ) -> Result < Vec < u8 > > {
395
+ Ok ( generate_auth_key ( username, realm, "pass" ) )
396
+ }
397
+ }
398
+
399
+ async fn create_server ( ) -> Result < ( Server , u16 ) > {
400
+ let conn = Arc :: new ( UdpSocket :: bind ( "0.0.0.0:0" ) . await ?) ;
401
+ let server_port = conn. local_addr ( ) ?. port ( ) ;
402
+
403
+ let server = Server :: new ( ServerConfig {
404
+ conn_configs : vec ! [ ConnConfig {
405
+ conn,
406
+ relay_addr_generator: Box :: new( RelayAddressGeneratorStatic {
407
+ relay_address: IpAddr :: from_str( "127.0.0.1" ) ?,
408
+ address: "0.0.0.0" . to_owned( ) ,
409
+ net: Arc :: new( Net :: new( None ) ) ,
410
+ } ) ,
411
+ } ] ,
412
+ realm : "webrtc.rs" . to_owned ( ) ,
413
+ auth_handler : Arc :: new ( TestAuthHandler { } ) ,
414
+ channel_bind_timeout : Duration :: from_secs ( 0 ) ,
415
+ } )
416
+ . await ?;
417
+
418
+ Ok ( ( server, server_port) )
419
+ }
420
+
421
+ async fn create_client ( username : String , server_port : u16 ) -> Result < Client > {
422
+ let conn = Arc :: new ( UdpSocket :: bind ( "0.0.0.0:0" ) . await ?) ;
423
+
424
+ Ok ( Client :: new ( ClientConfig {
425
+ stun_serv_addr : format ! ( "127.0.0.1:{}" , server_port) ,
426
+ turn_serv_addr : format ! ( "127.0.0.1:{}" , server_port) ,
427
+ username,
428
+ password : "pass" . to_owned ( ) ,
429
+ realm : String :: new ( ) ,
430
+ software : String :: new ( ) ,
431
+ rto_in_ms : 0 ,
432
+ conn,
433
+ vnet : None ,
434
+ } )
435
+ . await ?)
436
+ }
437
+
438
+ #[ cfg( feature = "metrics" ) ]
439
+ #[ tokio:: test]
440
+ async fn test_get_allocations_info ( ) -> Result < ( ) > {
441
+ let ( server, server_port) = create_server ( ) . await ?;
442
+
443
+ let client1 = create_client ( "user1" . to_owned ( ) , server_port) . await ?;
444
+ client1. listen ( ) . await ?;
445
+
446
+ let client2 = create_client ( "user2" . to_owned ( ) , server_port) . await ?;
447
+ client2. listen ( ) . await ?;
448
+
449
+ let client3 = create_client ( "user3" . to_owned ( ) , server_port) . await ?;
450
+ client3. listen ( ) . await ?;
451
+
452
+ assert ! ( server. get_allocations_info( None ) . await ?. is_empty( ) ) ;
453
+
454
+ let user1 = client1. allocate ( ) . await ?;
455
+ let user2 = client2. allocate ( ) . await ?;
456
+ let user3 = client3. allocate ( ) . await ?;
457
+
458
+ assert_eq ! ( server. get_allocations_info( None ) . await ?. len( ) , 3 ) ;
459
+
460
+ let addr1 = client1
461
+ . send_binding_request_to ( format ! ( "127.0.0.1:{}" , server_port) . as_str ( ) )
462
+ . await ?;
463
+ let addr2 = client2
464
+ . send_binding_request_to ( format ! ( "127.0.0.1:{}" , server_port) . as_str ( ) )
465
+ . await ?;
466
+ let addr3 = client3
467
+ . send_binding_request_to ( format ! ( "127.0.0.1:{}" , server_port) . as_str ( ) )
468
+ . await ?;
469
+
470
+ user1. send_to ( b"1" , addr1) . await ?;
471
+ user2. send_to ( b"12" , addr2) . await ?;
472
+ user3. send_to ( b"123" , addr3) . await ?;
473
+
474
+ tokio:: time:: sleep ( Duration :: from_millis ( 100 ) ) . await ;
475
+
476
+ server
477
+ . get_allocations_info ( None )
478
+ . await ?
479
+ . iter ( )
480
+ . for_each ( |( _, ai) | match ai. username . as_str ( ) {
481
+ "user1" => assert_eq ! ( ai. relayed_bytes, 1 ) ,
482
+ "user2" => assert_eq ! ( ai. relayed_bytes, 2 ) ,
483
+ "user3" => assert_eq ! ( ai. relayed_bytes, 3 ) ,
484
+ _ => unreachable ! ( ) ,
485
+ } ) ;
486
+
487
+ Ok ( ( ) )
488
+ }
489
+
490
+ #[ cfg( feature = "metrics" ) ]
491
+ #[ tokio:: test]
492
+ async fn test_get_allocations_info_bytes_count ( ) -> Result < ( ) > {
493
+ let ( server, server_port) = create_server ( ) . await ?;
494
+
495
+ let client = create_client ( "foo" . to_owned ( ) , server_port) . await ?;
496
+
497
+ client. listen ( ) . await ?;
498
+
499
+ assert ! ( server. get_allocations_info( None ) . await ?. is_empty( ) ) ;
500
+
501
+ let conn = client. allocate ( ) . await ?;
502
+ let addr = client
503
+ . send_binding_request_to ( format ! ( "127.0.0.1:{}" , server_port) . as_str ( ) )
504
+ . await ?;
505
+
506
+ assert ! ( !server. get_allocations_info( None ) . await ?. is_empty( ) ) ;
507
+
508
+ assert_eq ! (
509
+ server
510
+ . get_allocations_info( None )
511
+ . await ?
512
+ . values( )
513
+ . last( )
514
+ . unwrap( )
515
+ . relayed_bytes,
516
+ 0
517
+ ) ;
518
+
519
+ for _ in 0 ..10 {
520
+ conn. send_to ( b"Hello" , addr) . await ?;
521
+
522
+ tokio:: time:: sleep ( Duration :: from_millis ( 100 ) ) . await ;
523
+ }
524
+
525
+ tokio:: time:: sleep ( Duration :: from_millis ( 1000 ) ) . await ;
526
+
527
+ assert_eq ! (
528
+ server
529
+ . get_allocations_info( None )
530
+ . await ?
531
+ . values( )
532
+ . last( )
533
+ . unwrap( )
534
+ . relayed_bytes,
535
+ 50
536
+ ) ;
537
+
538
+ for _ in 0 ..10 {
539
+ conn. send_to ( b"Hello" , addr) . await ?;
540
+
541
+ tokio:: time:: sleep ( Duration :: from_millis ( 100 ) ) . await ;
542
+ }
543
+
544
+ tokio:: time:: sleep ( Duration :: from_millis ( 1000 ) ) . await ;
545
+
546
+ assert_eq ! (
547
+ server
548
+ . get_allocations_info( None )
549
+ . await ?
550
+ . values( )
551
+ . last( )
552
+ . unwrap( )
553
+ . relayed_bytes,
554
+ 100
555
+ ) ;
556
+
557
+ client. close ( ) . await ?;
558
+ server. close ( ) . await ?;
559
+
560
+ Ok ( ( ) )
561
+ }
0 commit comments