@@ -5104,6 +5104,141 @@ mod tests {
5104
5104
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage) ;
5105
5105
}
5106
5106
5107
+ #[ test]
5108
+ fn test_drop_messages_peer_disconnect_dual_htlc ( ) {
5109
+ // Test that we can handle reconnecting when both sides of a channel have pending
5110
+ // commitment_updates when we disconnect.
5111
+ let mut nodes = create_network ( 2 ) ;
5112
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
5113
+
5114
+ let ( payment_preimage_1, _) = route_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 1000000 ) ;
5115
+
5116
+ // Now try to send a second payment which will fail to send
5117
+ let route = nodes[ 0 ] . router . get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
5118
+ let ( payment_preimage_2, payment_hash_2) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
5119
+
5120
+ nodes[ 0 ] . node . send_payment ( route. clone ( ) , payment_hash_2) . unwrap ( ) ;
5121
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5122
+
5123
+ let events_1 = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
5124
+ assert_eq ! ( events_1. len( ) , 1 ) ;
5125
+ match events_1[ 0 ] {
5126
+ Event :: UpdateHTLCs { .. } => { } ,
5127
+ _ => panic ! ( "Unexpected event" ) ,
5128
+ }
5129
+
5130
+ assert ! ( nodes[ 1 ] . node. claim_funds( payment_preimage_1) ) ;
5131
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5132
+
5133
+ let events_2 = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
5134
+ assert_eq ! ( events_2. len( ) , 1 ) ;
5135
+ match events_2[ 0 ] {
5136
+ 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 } } => {
5137
+ assert_eq ! ( * node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
5138
+ assert ! ( update_add_htlcs. is_empty( ) ) ;
5139
+ assert_eq ! ( update_fulfill_htlcs. len( ) , 1 ) ;
5140
+ assert ! ( update_fail_htlcs. is_empty( ) ) ;
5141
+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
5142
+ assert ! ( update_fee. is_none( ) ) ;
5143
+
5144
+ nodes[ 0 ] . node . handle_update_fulfill_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & update_fulfill_htlcs[ 0 ] ) . unwrap ( ) ;
5145
+ let events_3 = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
5146
+ assert_eq ! ( events_3. len( ) , 1 ) ;
5147
+ match events_3[ 0 ] {
5148
+ Event :: PaymentSent { ref payment_preimage } => {
5149
+ assert_eq ! ( * payment_preimage, payment_preimage_1) ;
5150
+ } ,
5151
+ _ => panic ! ( "Unexpected event" ) ,
5152
+ }
5153
+
5154
+ let ( _, commitment_update) = nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , commitment_signed) . unwrap ( ) ;
5155
+ assert ! ( commitment_update. is_none( ) ) ;
5156
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5157
+ } ,
5158
+ _ => panic ! ( "Unexpected event" ) ,
5159
+ }
5160
+
5161
+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
5162
+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
5163
+
5164
+ let reestablish_1 = nodes[ 0 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) ) ;
5165
+ assert_eq ! ( reestablish_1. len( ) , 1 ) ;
5166
+ let reestablish_2 = nodes[ 1 ] . node . peer_connected ( & nodes[ 0 ] . node . get_our_node_id ( ) ) ;
5167
+ assert_eq ! ( reestablish_2. len( ) , 1 ) ;
5168
+
5169
+ let as_resp = nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & reestablish_2[ 0 ] ) . unwrap ( ) ;
5170
+ let bs_resp = nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & reestablish_1[ 0 ] ) . unwrap ( ) ;
5171
+
5172
+ assert ! ( as_resp. 0 . is_none( ) ) ;
5173
+ assert ! ( bs_resp. 0 . is_none( ) ) ;
5174
+
5175
+ assert ! ( bs_resp. 1 . is_none( ) ) ;
5176
+ assert ! ( bs_resp. 2 . is_none( ) ) ;
5177
+
5178
+ assert ! ( as_resp. 3 == msgs:: RAACommitmentOrder :: CommitmentFirst ) ;
5179
+
5180
+ assert_eq ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_add_htlcs. len( ) , 1 ) ;
5181
+ assert ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_fulfill_htlcs. is_empty( ) ) ;
5182
+ assert ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_fail_htlcs. is_empty( ) ) ;
5183
+ assert ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_fail_malformed_htlcs. is_empty( ) ) ;
5184
+ assert ! ( as_resp. 2 . as_ref( ) . unwrap( ) . update_fee. is_none( ) ) ;
5185
+ 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 ( ) ;
5186
+ 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 ( ) ;
5187
+ assert ! ( bs_commitment_signed. is_none( ) ) ;
5188
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5189
+
5190
+ 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 ( ) ;
5191
+ assert ! ( bs_second_commitment_signed. update_add_htlcs. is_empty( ) ) ;
5192
+ assert ! ( bs_second_commitment_signed. update_fulfill_htlcs. is_empty( ) ) ;
5193
+ assert ! ( bs_second_commitment_signed. update_fail_htlcs. is_empty( ) ) ;
5194
+ assert ! ( bs_second_commitment_signed. update_fail_malformed_htlcs. is_empty( ) ) ;
5195
+ assert ! ( bs_second_commitment_signed. update_fee. is_none( ) ) ;
5196
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5197
+
5198
+ let as_commitment_signed = nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_revoke_and_ack) . unwrap ( ) . unwrap ( ) ;
5199
+ assert ! ( as_commitment_signed. update_add_htlcs. is_empty( ) ) ;
5200
+ assert ! ( as_commitment_signed. update_fulfill_htlcs. is_empty( ) ) ;
5201
+ assert ! ( as_commitment_signed. update_fail_htlcs. is_empty( ) ) ;
5202
+ assert ! ( as_commitment_signed. update_fail_malformed_htlcs. is_empty( ) ) ;
5203
+ assert ! ( as_commitment_signed. update_fee. is_none( ) ) ;
5204
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5205
+
5206
+ 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 ( ) ;
5207
+ assert ! ( as_second_commitment_signed. is_none( ) ) ;
5208
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5209
+
5210
+ 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 ( ) ;
5211
+ assert ! ( bs_third_commitment_signed. is_none( ) ) ;
5212
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5213
+
5214
+ assert ! ( nodes[ 1 ] . node. handle_revoke_and_ack( & nodes[ 0 ] . node. get_our_node_id( ) , & as_revoke_and_ack) . unwrap( ) . is_none( ) ) ;
5215
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5216
+
5217
+ let events_4 = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
5218
+ assert_eq ! ( events_4. len( ) , 1 ) ;
5219
+ match events_4[ 0 ] {
5220
+ Event :: PendingHTLCsForwardable { .. } => { } ,
5221
+ _ => panic ! ( "Unexpected event" ) ,
5222
+ } ;
5223
+
5224
+ nodes[ 1 ] . node . channel_state . lock ( ) . unwrap ( ) . next_forward = Instant :: now ( ) ;
5225
+ nodes[ 1 ] . node . process_pending_htlc_forwards ( ) ;
5226
+
5227
+ let events_5 = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
5228
+ assert_eq ! ( events_5. len( ) , 1 ) ;
5229
+ match events_5[ 0 ] {
5230
+ Event :: PaymentReceived { ref payment_hash, amt : _ } => {
5231
+ assert_eq ! ( payment_hash_2, * payment_hash) ;
5232
+ } ,
5233
+ _ => panic ! ( "Unexpected event" ) ,
5234
+ }
5235
+
5236
+ assert ! ( nodes[ 0 ] . node. handle_revoke_and_ack( & nodes[ 1 ] . node. get_our_node_id( ) , & bs_second_revoke_and_ack) . unwrap( ) . is_none( ) ) ;
5237
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5238
+
5239
+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_2) ;
5240
+ }
5241
+
5107
5242
#[ test]
5108
5243
fn test_invalid_channel_announcement ( ) {
5109
5244
//Test BOLT 7 channel_announcement msg requirement for final node, gather data to build customed channel_announcement msgs
0 commit comments