@@ -3496,6 +3496,34 @@ fn test_force_close_fail_back() {
3496
3496
check_spends ! ( node_txn[ 0 ] , tx) ;
3497
3497
}
3498
3498
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
+
3499
3527
#[ test]
3500
3528
fn test_simple_peer_disconnect ( ) {
3501
3529
// 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) {
3718
3746
nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
3719
3747
if messages_delivered < 2 {
3720
3748
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 {
3723
3750
let events_4 = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
3724
3751
assert_eq ! ( events_4. len( ) , 1 ) ;
3725
3752
match events_4[ 0 ] {
@@ -3728,7 +3755,9 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8) {
3728
3755
} ,
3729
3756
_ => panic ! ( "Unexpected event" ) ,
3730
3757
}
3731
- //}
3758
+ } else {
3759
+ assert ! ( nodes[ 0 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3760
+ }
3732
3761
} else if messages_delivered == 2 {
3733
3762
// nodes[0] still wants its RAA + commitment_signed
3734
3763
reconnect_nodes ( & nodes[ 0 ] , & nodes[ 1 ] , ( false , false ) , ( 0 , -1 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( false , true ) ) ;
0 commit comments