@@ -1743,4 +1743,37 @@ mod tests {
17431743 assert_eq ! ( cfgs[ 1 ] . routing_handler. chan_upds_recvd. load( Ordering :: Acquire ) , 100 ) ;
17441744 assert_eq ! ( cfgs[ 1 ] . routing_handler. chan_anns_recvd. load( Ordering :: Acquire ) , 50 ) ;
17451745 }
1746+
1747+ #[ test]
1748+ fn test_handshake_timeout ( ) {
1749+ // Tests that we time out a peer still waiting on handshake completion after a full timer
1750+ // tick.
1751+ let cfgs = create_peermgr_cfgs ( 2 ) ;
1752+ cfgs[ 0 ] . routing_handler . request_full_sync . store ( true , Ordering :: Release ) ;
1753+ cfgs[ 1 ] . routing_handler . request_full_sync . store ( true , Ordering :: Release ) ;
1754+ let peers = create_network ( 2 , & cfgs) ;
1755+
1756+ let secp_ctx = Secp256k1 :: new ( ) ;
1757+ let a_id = PublicKey :: from_secret_key ( & secp_ctx, & peers[ 0 ] . our_node_secret ) ;
1758+ let mut fd_a = FileDescriptor { fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) } ;
1759+ let mut fd_b = FileDescriptor { fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) } ;
1760+ let initial_data = peers[ 1 ] . new_outbound_connection ( a_id, fd_b. clone ( ) ) . unwrap ( ) ;
1761+ peers[ 0 ] . new_inbound_connection ( fd_a. clone ( ) ) . unwrap ( ) ;
1762+
1763+ // If we get a single timer tick before completion, that's fine
1764+ assert_eq ! ( peers[ 0 ] . peers. lock( ) . unwrap( ) . peers. len( ) , 1 ) ;
1765+ peers[ 0 ] . timer_tick_occurred ( ) ;
1766+ assert_eq ! ( peers[ 0 ] . peers. lock( ) . unwrap( ) . peers. len( ) , 1 ) ;
1767+
1768+ assert_eq ! ( peers[ 0 ] . read_event( & mut fd_a, & initial_data) . unwrap( ) , false ) ;
1769+ peers[ 0 ] . process_events ( ) ;
1770+ assert_eq ! ( peers[ 1 ] . read_event( & mut fd_b, & fd_a. outbound_data. lock( ) . unwrap( ) . split_off( 0 ) ) . unwrap( ) , false ) ;
1771+ peers[ 1 ] . process_events ( ) ;
1772+
1773+ // ...but if we get a second timer tick, we should disconnect the peer
1774+ peers[ 0 ] . timer_tick_occurred ( ) ;
1775+ assert_eq ! ( peers[ 0 ] . peers. lock( ) . unwrap( ) . peers. len( ) , 0 ) ;
1776+
1777+ assert ! ( peers[ 0 ] . read_event( & mut fd_a, & fd_b. outbound_data. lock( ) . unwrap( ) . split_off( 0 ) ) . is_err( ) ) ;
1778+ }
17461779}
0 commit comments