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