@@ -5318,6 +5318,141 @@ mod tests {
53185318 claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage) ;
53195319 }
53205320
5321+ #[ test]
5322+ fn test_drop_messages_peer_disconnect_dual_htlc ( ) {
5323+ // Test that we can handle reconnecting when both sides of a channel have pending
5324+ // commitment_updates when we disconnect.
5325+ let mut nodes = create_network ( 2 ) ;
5326+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
5327+
5328+ let ( payment_preimage_1, _) = route_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 1000000 ) ;
5329+
5330+ // Now try to send a second payment which will fail to send
5331+ let route = nodes[ 0 ] . router . get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
5332+ let ( payment_preimage_2, payment_hash_2) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
5333+
5334+ nodes[ 0 ] . node . send_payment ( route. clone ( ) , payment_hash_2) . unwrap ( ) ;
5335+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5336+
5337+ let events_1 = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
5338+ assert_eq ! ( events_1. len( ) , 1 ) ;
5339+ match events_1[ 0 ] {
5340+ Event :: UpdateHTLCs { .. } => { } ,
5341+ _ => panic ! ( "Unexpected event" ) ,
5342+ }
5343+
5344+ assert ! ( nodes[ 1 ] . node. claim_funds( payment_preimage_1) ) ;
5345+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5346+
5347+ let events_2 = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
5348+ assert_eq ! ( events_2. len( ) , 1 ) ;
5349+ match events_2[ 0 ] {
5350+ Event :: UpdateHTLCs { ref node_id, updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
5351+ assert_eq ! ( * node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
5352+ assert ! ( update_add_htlcs. is_empty( ) ) ;
5353+ assert_eq ! ( update_fulfill_htlcs. len( ) , 1 ) ;
5354+ assert ! ( update_fail_htlcs. is_empty( ) ) ;
5355+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
5356+ assert ! ( update_fee. is_none( ) ) ;
5357+
5358+ nodes[ 0 ] . node . handle_update_fulfill_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & update_fulfill_htlcs[ 0 ] ) . unwrap ( ) ;
5359+ let events_3 = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
5360+ assert_eq ! ( events_3. len( ) , 1 ) ;
5361+ match events_3[ 0 ] {
5362+ Event :: PaymentSent { ref payment_preimage } => {
5363+ assert_eq ! ( * payment_preimage, payment_preimage_1) ;
5364+ } ,
5365+ _ => panic ! ( "Unexpected event" ) ,
5366+ }
5367+
5368+ let ( _, commitment_update) = nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , commitment_signed) . unwrap ( ) ;
5369+ assert ! ( commitment_update. is_none( ) ) ;
5370+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5371+ } ,
5372+ _ => panic ! ( "Unexpected event" ) ,
5373+ }
5374+
5375+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
5376+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
5377+
5378+ let reestablish_1 = nodes[ 0 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) ) ;
5379+ assert_eq ! ( reestablish_1. len( ) , 1 ) ;
5380+ let reestablish_2 = nodes[ 1 ] . node . peer_connected ( & nodes[ 0 ] . node . get_our_node_id ( ) ) ;
5381+ assert_eq ! ( reestablish_2. len( ) , 1 ) ;
5382+
5383+ let as_resp = nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & reestablish_2[ 0 ] ) . unwrap ( ) ;
5384+ let bs_resp = nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & reestablish_1[ 0 ] ) . unwrap ( ) ;
5385+
5386+ assert ! ( as_resp. 0 . is_none( ) ) ;
5387+ assert ! ( bs_resp. 0 . is_none( ) ) ;
5388+
5389+ assert ! ( bs_resp. 1 . is_none( ) ) ;
5390+ assert ! ( bs_resp. 2 . is_none( ) ) ;
5391+
5392+ assert ! ( as_resp. 3 == msgs:: RAACommitmentOrder :: CommitmentFirst ) ;
5393+
5394+ assert_eq ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_add_htlcs. len( ) , 1 ) ;
5395+ assert ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_fulfill_htlcs. is_empty( ) ) ;
5396+ assert ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_fail_htlcs. is_empty( ) ) ;
5397+ assert ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_fail_malformed_htlcs. is_empty( ) ) ;
5398+ assert ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_fee. is_none( ) ) ;
5399+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_resp. 2 . as_ref ( ) . unwrap ( ) . update_add_htlcs [ 0 ] ) . unwrap ( ) ;
5400+ let ( bs_revoke_and_ack, bs_commitment_signed) = nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_resp. 2 . as_ref ( ) . unwrap ( ) . commitment_signed ) . unwrap ( ) ;
5401+ assert ! ( bs_commitment_signed. is_none( ) ) ;
5402+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5403+
5404+ let bs_second_commitment_signed = nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , as_resp. 1 . as_ref ( ) . unwrap ( ) ) . unwrap ( ) . unwrap ( ) ;
5405+ assert ! ( bs_second_commitment_signed. update_add_htlcs. is_empty( ) ) ;
5406+ assert ! ( bs_second_commitment_signed. update_fulfill_htlcs. is_empty( ) ) ;
5407+ assert ! ( bs_second_commitment_signed. update_fail_htlcs. is_empty( ) ) ;
5408+ assert ! ( bs_second_commitment_signed. update_fail_malformed_htlcs. is_empty( ) ) ;
5409+ assert ! ( bs_second_commitment_signed. update_fee. is_none( ) ) ;
5410+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5411+
5412+ let as_commitment_signed = nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_revoke_and_ack) . unwrap ( ) . unwrap ( ) ;
5413+ assert ! ( as_commitment_signed. update_add_htlcs. is_empty( ) ) ;
5414+ assert ! ( as_commitment_signed. update_fulfill_htlcs. is_empty( ) ) ;
5415+ assert ! ( as_commitment_signed. update_fail_htlcs. is_empty( ) ) ;
5416+ assert ! ( as_commitment_signed. update_fail_malformed_htlcs. is_empty( ) ) ;
5417+ assert ! ( as_commitment_signed. update_fee. is_none( ) ) ;
5418+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5419+
5420+ let ( as_revoke_and_ack, as_second_commitment_signed) = nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_commitment_signed. commitment_signed ) . unwrap ( ) ;
5421+ assert ! ( as_second_commitment_signed. is_none( ) ) ;
5422+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5423+
5424+ let ( bs_second_revoke_and_ack, bs_third_commitment_signed) = nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_commitment_signed. commitment_signed ) . unwrap ( ) ;
5425+ assert ! ( bs_third_commitment_signed. is_none( ) ) ;
5426+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5427+
5428+ assert ! ( nodes[ 1 ] . node. handle_revoke_and_ack( & nodes[ 0 ] . node. get_our_node_id( ) , & as_revoke_and_ack) . unwrap( ) . is_none( ) ) ;
5429+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5430+
5431+ let events_4 = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
5432+ assert_eq ! ( events_4. len( ) , 1 ) ;
5433+ match events_4[ 0 ] {
5434+ Event :: PendingHTLCsForwardable { .. } => { } ,
5435+ _ => panic ! ( "Unexpected event" ) ,
5436+ } ;
5437+
5438+ nodes[ 1 ] . node . channel_state . lock ( ) . unwrap ( ) . next_forward = Instant :: now ( ) ;
5439+ nodes[ 1 ] . node . process_pending_htlc_forwards ( ) ;
5440+
5441+ let events_5 = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
5442+ assert_eq ! ( events_5. len( ) , 1 ) ;
5443+ match events_5[ 0 ] {
5444+ Event :: PaymentReceived { ref payment_hash, amt : _ } => {
5445+ assert_eq ! ( payment_hash_2, * payment_hash) ;
5446+ } ,
5447+ _ => panic ! ( "Unexpected event" ) ,
5448+ }
5449+
5450+ assert ! ( nodes[ 0 ] . node. handle_revoke_and_ack( & nodes[ 1 ] . node. get_our_node_id( ) , & bs_second_revoke_and_ack) . unwrap( ) . is_none( ) ) ;
5451+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5452+
5453+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_2) ;
5454+ }
5455+
53215456 #[ test]
53225457 fn test_invalid_channel_announcement ( ) {
53235458 //Test BOLT 7 channel_announcement msg requirement for final node, gather data to build customed channel_announcement msgs
0 commit comments