Skip to content

Commit c7c5976

Browse files
committed
Capture announcement signatures resend in reconnection tests
1 parent 3f66e62 commit c7c5976

File tree

5 files changed

+90
-13
lines changed

5 files changed

+90
-13
lines changed

lightning/src/ln/async_signer_tests.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ fn do_test_async_raa_peer_disconnect(
600600
}
601601

602602
// Expect the RAA
603-
let (_, revoke_and_ack, commitment_signed, resend_order) =
603+
let (_, revoke_and_ack, commitment_signed, resend_order, _) =
604604
handle_chan_reestablish_msgs!(dst, src);
605605
if test_case == UnblockSignerAcrossDisconnectCase::AtEnd {
606606
assert!(revoke_and_ack.is_none());
@@ -616,14 +616,14 @@ fn do_test_async_raa_peer_disconnect(
616616
dst.node.signer_unblocked(Some((src_node_id, chan_id)));
617617

618618
if test_case == UnblockSignerAcrossDisconnectCase::AtEnd {
619-
let (_, revoke_and_ack, commitment_signed, resend_order) =
619+
let (_, revoke_and_ack, commitment_signed, resend_order, _) =
620620
handle_chan_reestablish_msgs!(dst, src);
621621
assert!(revoke_and_ack.is_some());
622622
assert!(commitment_signed.is_some());
623623
assert!(resend_order == RAACommitmentOrder::RevokeAndACKFirst);
624624
} else {
625625
// Make sure we don't double send the RAA.
626-
let (_, revoke_and_ack, commitment_signed, _) = handle_chan_reestablish_msgs!(dst, src);
626+
let (_, revoke_and_ack, commitment_signed, _, _) = handle_chan_reestablish_msgs!(dst, src);
627627
assert!(revoke_and_ack.is_none());
628628
assert!(commitment_signed.is_none());
629629
}
@@ -749,7 +749,7 @@ fn do_test_async_commitment_signature_peer_disconnect(
749749
}
750750

751751
// Expect the RAA
752-
let (_, revoke_and_ack, commitment_signed, _) = handle_chan_reestablish_msgs!(dst, src);
752+
let (_, revoke_and_ack, commitment_signed, _, _) = handle_chan_reestablish_msgs!(dst, src);
753753
assert!(revoke_and_ack.is_some());
754754
if test_case == UnblockSignerAcrossDisconnectCase::AtEnd {
755755
assert!(commitment_signed.is_none());
@@ -762,11 +762,11 @@ fn do_test_async_commitment_signature_peer_disconnect(
762762
dst.node.signer_unblocked(Some((src_node_id, chan_id)));
763763

764764
if test_case == UnblockSignerAcrossDisconnectCase::AtEnd {
765-
let (_, _, commitment_signed, _) = handle_chan_reestablish_msgs!(dst, src);
765+
let (_, _, commitment_signed, _, _) = handle_chan_reestablish_msgs!(dst, src);
766766
assert!(commitment_signed.is_some());
767767
} else {
768768
// Make sure we don't double send the CS.
769-
let (_, _, commitment_signed, _) = handle_chan_reestablish_msgs!(dst, src);
769+
let (_, _, commitment_signed, _, _) = handle_chan_reestablish_msgs!(dst, src);
770770
assert!(commitment_signed.is_none());
771771
}
772772
}
@@ -881,6 +881,7 @@ fn do_test_async_commitment_signature_ordering(monitor_update_failure: bool) {
881881
assert!(as_resp.0.is_none());
882882
assert!(as_resp.1.is_none());
883883
assert!(as_resp.2.is_none());
884+
assert!(as_resp.4.is_none());
884885

885886
if monitor_update_failure {
886887
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
@@ -900,6 +901,7 @@ fn do_test_async_commitment_signature_ordering(monitor_update_failure: bool) {
900901
assert!(as_resp.0.is_none());
901902
assert!(as_resp.1.is_none());
902903
assert!(as_resp.2.is_none());
904+
assert!(as_resp.4.is_none());
903905

904906
nodes[0].enable_channel_signer_op(&node_b_id, &chan_id, SignerOp::SignCounterpartyCommitment);
905907
nodes[0].node.signer_unblocked(Some((node_b_id, chan_id)));
@@ -916,6 +918,9 @@ fn do_test_async_commitment_signature_ordering(monitor_update_failure: bool) {
916918

917919
assert!(as_resp.3 == RAACommitmentOrder::CommitmentFirst);
918920

921+
assert!(as_resp.4.is_none());
922+
assert!(bs_resp.4.is_none());
923+
919924
// Now that everything is restored, get the CS + RAA and handle them.
920925
nodes[1]
921926
.node

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
193193
nodes[1].node.peer_disconnected(node_a_id);
194194
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
195195
reconnect_args.send_channel_ready = (true, true);
196+
reconnect_args.send_announcement_sigs = (true, true);
196197
reconnect_nodes(reconnect_args);
197198
}
198199

lightning/src/ln/functional_test_utils.rs

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4741,11 +4741,14 @@ macro_rules! handle_chan_reestablish_msgs {
47414741
None
47424742
};
47434743

4744-
if let Some(&MessageSendEvent::SendAnnouncementSignatures { ref node_id, msg: _ }) =
4744+
let mut announcement_sigs = None; // May be now or later
4745+
if let Some(&MessageSendEvent::SendAnnouncementSignatures { ref node_id, ref msg }) =
47454746
msg_events.get(idx)
47464747
{
47474748
idx += 1;
47484749
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
4750+
assert!(announcement_sigs.is_none());
4751+
announcement_sigs = Some(msg.clone());
47494752
}
47504753

47514754
let mut had_channel_update = false; // ChannelUpdate may be now or later, but not both
@@ -4811,16 +4814,26 @@ macro_rules! handle_chan_reestablish_msgs {
48114814
assert!(!had_channel_update);
48124815
}
48134816

4814-
assert_eq!(msg_events.len(), idx);
4817+
if let Some(&MessageSendEvent::SendAnnouncementSignatures { ref node_id, ref msg }) =
4818+
msg_events.get(idx)
4819+
{
4820+
idx += 1;
4821+
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
4822+
assert!(announcement_sigs.is_none());
4823+
announcement_sigs = Some(msg.clone());
4824+
}
4825+
4826+
assert_eq!(msg_events.len(), idx, "{msg_events:?}");
48154827

4816-
(channel_ready, revoke_and_ack, commitment_update, order)
4828+
(channel_ready, revoke_and_ack, commitment_update, order, announcement_sigs)
48174829
}};
48184830
}
48194831

48204832
pub struct ReconnectArgs<'a, 'b, 'c, 'd> {
48214833
pub node_a: &'a Node<'b, 'c, 'd>,
48224834
pub node_b: &'a Node<'b, 'c, 'd>,
48234835
pub send_channel_ready: (bool, bool),
4836+
pub send_announcement_sigs: (bool, bool),
48244837
pub pending_responding_commitment_signed: (bool, bool),
48254838
/// Indicates that the pending responding commitment signed will be a dup for the recipient,
48264839
/// and no monitor update is expected
@@ -4839,6 +4852,7 @@ impl<'a, 'b, 'c, 'd> ReconnectArgs<'a, 'b, 'c, 'd> {
48394852
node_a,
48404853
node_b,
48414854
send_channel_ready: (false, false),
4855+
send_announcement_sigs: (false, false),
48424856
pending_responding_commitment_signed: (false, false),
48434857
pending_responding_commitment_signed_dup_monitor: (false, false),
48444858
pending_htlc_adds: (0, 0),
@@ -4858,6 +4872,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
48584872
node_a,
48594873
node_b,
48604874
send_channel_ready,
4875+
send_announcement_sigs,
48614876
pending_htlc_adds,
48624877
pending_htlc_claims,
48634878
pending_htlc_fails,
@@ -4939,7 +4954,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
49394954
&& pending_cell_htlc_fails.1 == 0)
49404955
);
49414956

4942-
for chan_msgs in resp_1.drain(..) {
4957+
for mut chan_msgs in resp_1.drain(..) {
49434958
if send_channel_ready.0 {
49444959
node_a.node.handle_channel_ready(node_b_id, &chan_msgs.0.unwrap());
49454960
let announcement_event = node_a.node.get_and_clear_pending_msg_events();
@@ -4954,6 +4969,18 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
49544969
} else {
49554970
assert!(chan_msgs.0.is_none());
49564971
}
4972+
if send_announcement_sigs.0 {
4973+
let announcement_sigs = chan_msgs.4.take().unwrap();
4974+
node_a.node.handle_announcement_signatures(node_b_id, &announcement_sigs);
4975+
let msg_events = node_a.node.get_and_clear_pending_msg_events();
4976+
assert_eq!(msg_events.len(), 1, "{msg_events:?}");
4977+
if let MessageSendEvent::BroadcastChannelAnnouncement { .. } = msg_events[0] {
4978+
} else {
4979+
panic!("Unexpected event! {:?}", msg_events[0]);
4980+
}
4981+
} else {
4982+
assert!(chan_msgs.4.is_none());
4983+
}
49574984
if pending_raa.0 {
49584985
assert!(chan_msgs.3 == RAACommitmentOrder::RevokeAndACKFirst);
49594986
node_a.node.handle_revoke_and_ack(node_b_id, &chan_msgs.1.unwrap());
@@ -5018,7 +5045,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
50185045
}
50195046
}
50205047

5021-
for chan_msgs in resp_2.drain(..) {
5048+
for mut chan_msgs in resp_2.drain(..) {
50225049
if send_channel_ready.1 {
50235050
node_b.node.handle_channel_ready(node_a_id, &chan_msgs.0.unwrap());
50245051
let announcement_event = node_b.node.get_and_clear_pending_msg_events();
@@ -5033,6 +5060,18 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
50335060
} else {
50345061
assert!(chan_msgs.0.is_none());
50355062
}
5063+
if send_announcement_sigs.1 {
5064+
let announcement_sigs = chan_msgs.4.take().unwrap();
5065+
node_b.node.handle_announcement_signatures(node_a_id, &announcement_sigs);
5066+
let mut msg_events = node_b.node.get_and_clear_pending_msg_events();
5067+
assert_eq!(msg_events.len(), 1, "{msg_events:?}");
5068+
if let MessageSendEvent::BroadcastChannelAnnouncement { .. } = msg_events.remove(0) {
5069+
} else {
5070+
panic!();
5071+
}
5072+
} else {
5073+
assert!(chan_msgs.4.is_none());
5074+
}
50365075
if pending_raa.1 {
50375076
assert!(chan_msgs.3 == RAACommitmentOrder::RevokeAndACKFirst);
50385077
node_b.node.handle_revoke_and_ack(node_a_id, &chan_msgs.1.unwrap());

lightning/src/ln/functional_tests.rs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2579,6 +2579,7 @@ pub fn test_simple_peer_disconnect() {
25792579
nodes[1].node.peer_disconnected(node_a_id);
25802580
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
25812581
reconnect_args.send_channel_ready = (true, true);
2582+
reconnect_args.send_announcement_sigs = (true, true);
25822583
reconnect_nodes(reconnect_args);
25832584

25842585
let payment_preimage_1 = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1000000).0;
@@ -2736,22 +2737,29 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
27362737
// received on either side, both sides will need to resend them.
27372738
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
27382739
reconnect_args.send_channel_ready = (true, true);
2740+
if simulate_broken_lnd || messages_delivered > 0 {
2741+
reconnect_args.send_announcement_sigs.0 = true;
2742+
}
2743+
reconnect_args.send_announcement_sigs.1 = true;
27392744
reconnect_args.pending_htlc_adds.1 = 1;
27402745
reconnect_nodes(reconnect_args);
27412746
} else if messages_delivered == 3 {
27422747
// nodes[0] still wants its RAA + commitment_signed
27432748
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
2749+
reconnect_args.send_announcement_sigs = (true, true);
27442750
reconnect_args.pending_responding_commitment_signed.0 = true;
27452751
reconnect_args.pending_raa.0 = true;
27462752
reconnect_nodes(reconnect_args);
27472753
} else if messages_delivered == 4 {
27482754
// nodes[0] still wants its commitment_signed
27492755
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
2756+
reconnect_args.send_announcement_sigs.0 = true;
27502757
reconnect_args.pending_responding_commitment_signed.0 = true;
27512758
reconnect_nodes(reconnect_args);
27522759
} else if messages_delivered == 5 {
27532760
// nodes[1] still wants its final RAA
27542761
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
2762+
reconnect_args.send_announcement_sigs.0 = true;
27552763
reconnect_args.pending_raa.1 = true;
27562764
reconnect_nodes(reconnect_args);
27572765
} else if messages_delivered == 6 {
@@ -2772,7 +2780,16 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
27722780

27732781
nodes[0].node.peer_disconnected(node_b_id);
27742782
nodes[1].node.peer_disconnected(node_a_id);
2775-
reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
2783+
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
2784+
if !simulate_broken_lnd
2785+
&& (messages_delivered == 0 || (messages_delivered > 2 && messages_delivered < 6))
2786+
{
2787+
reconnect_args.send_announcement_sigs.0 = true;
2788+
}
2789+
if messages_delivered < 4 {
2790+
reconnect_args.send_announcement_sigs.1 = true;
2791+
}
2792+
reconnect_nodes(reconnect_args);
27762793

27772794
nodes[1].node.process_pending_htlc_forwards();
27782795

@@ -2870,6 +2887,10 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
28702887
nodes[1].node.peer_disconnected(node_a_id);
28712888
if messages_delivered < 2 {
28722889
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
2890+
if !simulate_broken_lnd && messages_delivered == 0 {
2891+
reconnect_args.send_announcement_sigs.0 = true;
2892+
}
2893+
reconnect_args.send_announcement_sigs.1 = true;
28732894
reconnect_args.pending_htlc_claims.0 = 1;
28742895
reconnect_nodes(reconnect_args);
28752896
if messages_delivered < 1 {
@@ -2880,12 +2901,14 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
28802901
} else if messages_delivered == 2 {
28812902
// nodes[0] still wants its RAA + commitment_signed
28822903
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
2904+
reconnect_args.send_announcement_sigs.1 = true;
28832905
reconnect_args.pending_responding_commitment_signed.1 = true;
28842906
reconnect_args.pending_raa.1 = true;
28852907
reconnect_nodes(reconnect_args);
28862908
} else if messages_delivered == 3 {
28872909
// nodes[0] still wants its commitment_signed
28882910
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
2911+
reconnect_args.send_announcement_sigs.1 = true;
28892912
reconnect_args.pending_responding_commitment_signed.1 = true;
28902913
reconnect_nodes(reconnect_args);
28912914
} else if messages_delivered == 4 {
@@ -2905,7 +2928,15 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
29052928
nodes[0].node.peer_disconnected(node_b_id);
29062929
nodes[1].node.peer_disconnected(node_a_id);
29072930
}
2908-
reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
2931+
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
2932+
if !simulate_broken_lnd {
2933+
if messages_delivered == 0 {
2934+
reconnect_args.send_announcement_sigs.0 = true;
2935+
} else if messages_delivered == 2 || messages_delivered == 3 {
2936+
reconnect_args.send_announcement_sigs.1 = true;
2937+
}
2938+
}
2939+
reconnect_nodes(reconnect_args);
29092940

29102941
if messages_delivered > 2 {
29112942
expect_payment_path_successful!(nodes[0]);

lightning/src/ln/payment_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4799,6 +4799,7 @@ fn do_test_payment_metadata_consistency(do_reload: bool, do_modify: bool) {
47994799
}
48004800
let mut reconnect_args = ReconnectArgs::new(&nodes[2], &nodes[3]);
48014801
reconnect_args.send_channel_ready = (true, true);
4802+
reconnect_args.send_announcement_sigs = (true, true);
48024803
reconnect_nodes(reconnect_args);
48034804

48044805
// Create a new channel between C and D as A will refuse to retry on the existing one because

0 commit comments

Comments
 (0)