@@ -3496,6 +3496,34 @@ fn test_force_close_fail_back() {
34963496 check_spends ! ( node_txn[ 0 ] , tx) ;
34973497}
34983498
3499+ #[ test]
3500+ fn test_dup_events_on_peer_disconnect ( ) {
3501+ // Test that if we receive a duplicative update_fulfill_htlc message after a reconnect we do
3502+ // not generate a corresponding duplicative PaymentSent event. This did not use to be the case
3503+ // as we used to generate the event immediately upon receipt of the payment preimage in the
3504+ // update_fulfill_htlc message.
3505+
3506+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
3507+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
3508+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
3509+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
3510+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
3511+
3512+ let payment_preimage = route_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 1000000 ) . 0 ;
3513+
3514+ assert ! ( nodes[ 1 ] . node. claim_funds( payment_preimage) ) ;
3515+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
3516+ let claim_msgs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
3517+ nodes[ 0 ] . node . handle_update_fulfill_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & claim_msgs. update_fulfill_htlcs [ 0 ] ) ;
3518+ expect_payment_sent ! ( nodes[ 0 ] , payment_preimage) ;
3519+
3520+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
3521+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
3522+
3523+ reconnect_nodes ( & nodes[ 0 ] , & nodes[ 1 ] , ( false , false ) , ( 0 , 0 ) , ( 1 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( false , false ) ) ;
3524+ assert ! ( nodes[ 0 ] . node. get_and_clear_pending_events( ) . is_empty( ) ) ;
3525+ }
3526+
34993527#[ test]
35003528fn test_simple_peer_disconnect ( ) {
35013529 // Test that we can reconnect when there are no lost messages
@@ -3718,8 +3746,7 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8) {
37183746 nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
37193747 if messages_delivered < 2 {
37203748 reconnect_nodes ( & nodes[ 0 ] , & nodes[ 1 ] , ( false , false ) , ( 0 , 0 ) , ( 1 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( false , false ) ) ;
3721- //TODO: Deduplicate PaymentSent events, then enable this if:
3722- //if messages_delivered < 1 {
3749+ if messages_delivered < 1 {
37233750 let events_4 = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
37243751 assert_eq ! ( events_4. len( ) , 1 ) ;
37253752 match events_4[ 0 ] {
@@ -3728,7 +3755,9 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8) {
37283755 } ,
37293756 _ => panic ! ( "Unexpected event" ) ,
37303757 }
3731- //}
3758+ } else {
3759+ assert ! ( nodes[ 0 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3760+ }
37323761 } else if messages_delivered == 2 {
37333762 // nodes[0] still wants its RAA + commitment_signed
37343763 reconnect_nodes ( & nodes[ 0 ] , & nodes[ 1 ] , ( false , false ) , ( 0 , -1 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( false , true ) ) ;
0 commit comments