11use super :: * ;
22
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+ } ;
619use stun:: { attributes:: ATTR_USERNAME , textattrs:: TextAttribute } ;
720use tokio:: net:: UdpSocket ;
821use util:: vnet:: net:: * ;
@@ -357,7 +370,7 @@ async fn test_delete_allocation_by_username() -> Result<()> {
357370 Arc :: clone ( & turn_socket) ,
358371 0 ,
359372 DEFAULT_LIFETIME ,
360- TextAttribute :: new ( ATTR_USERNAME , String :: from ( "user2" ) ) ,
373+ TextAttribute :: new ( ATTR_USERNAME , "user2" . into ( ) ) ,
361374 )
362375 . await ?;
363376
@@ -375,3 +388,174 @@ async fn test_delete_allocation_by_username() -> Result<()> {
375388
376389 Ok ( ( ) )
377390}
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