@@ -665,6 +665,7 @@ mod test {
665
665
Endpoint :: builder ( )
666
666
. alpns ( vec ! [ GOSSIP_ALPN . to_vec( ) ] )
667
667
. relay_mode ( RelayMode :: Custom ( relay_map) )
668
+ . insecure_skip_relay_cert_verify ( true )
668
669
. bind ( 0 )
669
670
. await
670
671
}
@@ -688,12 +689,10 @@ mod test {
688
689
}
689
690
690
691
#[ tokio:: test]
691
- #[ ignore = "flaky" ]
692
692
async fn gossip_net_smoke ( ) {
693
693
let _guard = iroh_test:: logging:: setup ( ) ;
694
- let ( relay_map, relay_url, cleanup) = util:: run_relay_and_stun ( [ 127 , 0 , 0 , 1 ] . into ( ) )
695
- . await
696
- . unwrap ( ) ;
694
+ let ( relay_map, relay_url, _guard) =
695
+ iroh_net:: test_utils:: run_relay_server ( ) . await . unwrap ( ) ;
697
696
698
697
let ep1 = create_endpoint ( relay_map. clone ( ) ) . await . unwrap ( ) ;
699
698
let ep2 = create_endpoint ( relay_map. clone ( ) ) . await . unwrap ( ) ;
@@ -814,124 +813,5 @@ mod test {
814
813
. unwrap ( )
815
814
. unwrap ( ) ;
816
815
}
817
- drop ( cleanup) ;
818
- }
819
-
820
- // This is copied from iroh-net/src/hp/magicsock/conn.rs
821
- // TODO: Move into a public test_utils module in iroh-net?
822
- mod util {
823
- use std:: net:: { IpAddr , SocketAddr } ;
824
-
825
- use anyhow:: Result ;
826
- use iroh_net:: {
827
- key:: SecretKey ,
828
- relay:: { RelayMap , RelayUrl } ,
829
- stun:: { is, parse_binding_request, response} ,
830
- } ;
831
- use tokio:: sync:: oneshot;
832
- use tracing:: { debug, info, trace} ;
833
-
834
- /// A drop guard to clean up test infrastructure.
835
- ///
836
- /// After dropping the test infrastructure will asynchronously shutdown and release its
837
- /// resources.
838
- // Nightly sees the sender as dead code currently, but we only rely on Drop of the
839
- // sender.
840
- #[ derive( Debug ) ]
841
- #[ allow( dead_code) ]
842
- pub ( crate ) struct CleanupDropGuard ( pub ( crate ) oneshot:: Sender < ( ) > ) ;
843
-
844
- /// Runs a relay server with STUN enabled suitable for tests.
845
- ///
846
- /// The returned `Url` is the url of the relay server in the returned [`RelayMap`], it
847
- /// is always `Some` as that is how the [`Endpoint::connect`] API expects it.
848
- ///
849
- /// [`Endpoint::connect`]: crate::endpoint::Endpoint
850
- pub ( crate ) async fn run_relay_and_stun (
851
- stun_ip : IpAddr ,
852
- ) -> Result < ( RelayMap , RelayUrl , CleanupDropGuard ) > {
853
- let server_key = SecretKey :: generate ( ) ;
854
- let server = iroh_net:: relay:: http:: ServerBuilder :: new ( "127.0.0.1:0" . parse ( ) . unwrap ( ) )
855
- . secret_key ( Some ( server_key) )
856
- . tls_config ( None )
857
- . spawn ( )
858
- . await ?;
859
-
860
- let http_addr = server. addr ( ) ;
861
- info ! ( "relay listening on {:?}" , http_addr) ;
862
-
863
- let ( stun_addr, stun_drop_guard) = serve ( stun_ip) . await ?;
864
- let relay_url: RelayUrl = format ! ( "http://localhost:{}" , http_addr. port( ) )
865
- . parse ( )
866
- . unwrap ( ) ;
867
- let m = RelayMap :: default_from_node ( relay_url. clone ( ) , stun_addr. port ( ) ) ;
868
-
869
- let ( tx, rx) = oneshot:: channel ( ) ;
870
- tokio:: spawn ( async move {
871
- let _stun_cleanup = stun_drop_guard; // move into this closure
872
-
873
- // Wait until we're dropped or receive a message.
874
- rx. await . ok ( ) ;
875
- server. shutdown ( ) . await ;
876
- } ) ;
877
-
878
- Ok ( ( m, relay_url, CleanupDropGuard ( tx) ) )
879
- }
880
-
881
- /// Sets up a simple STUN server.
882
- async fn serve ( ip : IpAddr ) -> Result < ( SocketAddr , CleanupDropGuard ) > {
883
- let pc = tokio:: net:: UdpSocket :: bind ( ( ip, 0 ) ) . await ?;
884
- let mut addr = pc. local_addr ( ) ?;
885
- match addr. ip ( ) {
886
- IpAddr :: V4 ( ip) => {
887
- if ip. octets ( ) == [ 0 , 0 , 0 , 0 ] {
888
- addr. set_ip ( "127.0.0.1" . parse ( ) . unwrap ( ) ) ;
889
- }
890
- }
891
- _ => unreachable ! ( "using ipv4" ) ,
892
- }
893
-
894
- info ! ( "STUN listening on {}" , addr) ;
895
- let ( s, r) = oneshot:: channel ( ) ;
896
- tokio:: task:: spawn ( async move {
897
- run_stun ( pc, r) . await ;
898
- } ) ;
899
-
900
- Ok ( ( addr, CleanupDropGuard ( s) ) )
901
- }
902
-
903
- async fn run_stun ( pc : tokio:: net:: UdpSocket , mut done : oneshot:: Receiver < ( ) > ) {
904
- let mut buf = vec ! [ 0u8 ; 64 << 10 ] ;
905
- loop {
906
- trace ! ( "read loop" ) ;
907
- tokio:: select! {
908
- _ = & mut done => {
909
- debug!( "shutting down" ) ;
910
- break ;
911
- }
912
- res = pc. recv_from( & mut buf) => match res {
913
- Ok ( ( n, addr) ) => {
914
- trace!( "read packet {}bytes from {}" , n, addr) ;
915
- let pkt = & buf[ ..n] ;
916
- if !is( pkt) {
917
- debug!( "received non STUN pkt" ) ;
918
- continue ;
919
- }
920
- if let Ok ( txid) = parse_binding_request( pkt) {
921
- debug!( "received binding request" ) ;
922
-
923
- let res = response( txid, addr) ;
924
- if let Err ( err) = pc. send_to( & res, addr) . await {
925
- eprintln!( "STUN server write failed: {:?}" , err) ;
926
- }
927
- }
928
- }
929
- Err ( err) => {
930
- eprintln!( "failed to read: {:?}" , err) ;
931
- }
932
- }
933
- }
934
- }
935
- }
936
816
}
937
817
}
0 commit comments