Skip to content

Commit 2af1339

Browse files
committed
Add test for two-updates-in-flight disconnect channel resumption
1 parent 8844e64 commit 2af1339

File tree

1 file changed

+135
-0
lines changed

1 file changed

+135
-0
lines changed

src/ln/channelmanager.rs

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5104,6 +5104,141 @@ mod tests {
51045104
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage);
51055105
}
51065106

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+
51075242
#[test]
51085243
fn test_invalid_channel_announcement() {
51095244
//Test BOLT 7 channel_announcement msg requirement for final node, gather data to build customed channel_announcement msgs

0 commit comments

Comments
 (0)