Fix what `bolt2_open_channel_sending_node_checks_part1` tests
[rust-lightning] / lightning / src / ln / functional_test_utils.rs
index 8410cac9132dc66d844d71583873bb72cc517f64..a908cd416587d8b872e821d315dcd00093a5a4e8 100644 (file)
@@ -16,7 +16,7 @@ use chain::transaction::OutPoint;
 use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
 use ln::channelmanager::{ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, PaymentId};
 use routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
-use routing::router::{Payee, Route, get_route};
+use routing::router::{PaymentParameters, Route, get_route};
 use ln::features::{InitFeatures, InvoiceFeatures};
 use ln::msgs;
 use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler};
@@ -123,19 +123,29 @@ pub fn connect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, block: &Block)
        do_connect_block(node, block, false);
 }
 
+fn call_claimable_balances<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>) {
+       // Ensure `get_claimable_balances`' self-tests never panic
+       for funding_outpoint in node.chain_monitor.chain_monitor.list_monitors() {
+               node.chain_monitor.chain_monitor.get_monitor(funding_outpoint).unwrap().get_claimable_balances();
+       }
+}
+
 fn do_connect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, block: &Block, skip_intermediaries: bool) {
+       call_claimable_balances(node);
        let height = node.best_block_info().1 + 1;
        if !skip_intermediaries {
                let txdata: Vec<_> = block.txdata.iter().enumerate().collect();
                match *node.connect_style.borrow() {
                        ConnectStyle::BestBlockFirst|ConnectStyle::BestBlockFirstSkippingBlocks => {
                                node.chain_monitor.chain_monitor.best_block_updated(&block.header, height);
+                               call_claimable_balances(node);
                                node.chain_monitor.chain_monitor.transactions_confirmed(&block.header, &txdata, height);
                                node.node.best_block_updated(&block.header, height);
                                node.node.transactions_confirmed(&block.header, &txdata, height);
                        },
                        ConnectStyle::TransactionsFirst|ConnectStyle::TransactionsFirstSkippingBlocks => {
                                node.chain_monitor.chain_monitor.transactions_confirmed(&block.header, &txdata, height);
+                               call_claimable_balances(node);
                                node.chain_monitor.chain_monitor.best_block_updated(&block.header, height);
                                node.node.transactions_confirmed(&block.header, &txdata, height);
                                node.node.best_block_updated(&block.header, height);
@@ -146,11 +156,13 @@ fn do_connect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, block: &Block, s
                        }
                }
        }
+       call_claimable_balances(node);
        node.node.test_process_background_events();
        node.blocks.lock().unwrap().push((block.header, height));
 }
 
 pub fn disconnect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, count: u32) {
+       call_claimable_balances(node);
        for i in 0..count {
                let orig_header = node.blocks.lock().unwrap().pop().unwrap();
                assert!(orig_header.1 > 0); // Cannot disconnect genesis
@@ -172,6 +184,7 @@ pub fn disconnect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, count: u32)
                                node.node.best_block_updated(&prev_header.0, prev_header.1);
                        },
                }
+               call_claimable_balances(node);
        }
 }
 
@@ -440,6 +453,17 @@ macro_rules! get_feerate {
        }
 }
 
+#[cfg(test)]
+macro_rules! get_opt_anchors {
+       ($node: expr, $channel_id: expr) => {
+               {
+                       let mut lock;
+                       let chan = get_channel_ref!($node, lock, $channel_id);
+                       chan.opt_anchors()
+               }
+       }
+}
+
 /// Returns a channel monitor given a channel id, making some naive assumptions
 #[macro_export]
 macro_rules! get_monitor {
@@ -589,7 +613,14 @@ pub fn create_chan_between_nodes_with_value_confirm_first<'a, 'b, 'c, 'd>(node_r
 pub fn create_chan_between_nodes_with_value_confirm_second<'a, 'b, 'c>(node_recv: &Node<'a, 'b, 'c>, node_conf: &Node<'a, 'b, 'c>) -> ((msgs::FundingLocked, msgs::AnnouncementSignatures), [u8; 32]) {
        let channel_id;
        let events_6 = node_conf.node.get_and_clear_pending_msg_events();
-       assert_eq!(events_6.len(), 2);
+       assert_eq!(events_6.len(), 3);
+       let announcement_sigs_idx = if let MessageSendEvent::SendChannelUpdate { ref node_id, msg: _ } = events_6[1] {
+               assert_eq!(*node_id, node_recv.node.get_our_node_id());
+               2
+       } else if let MessageSendEvent::SendChannelUpdate { ref node_id, msg: _ } = events_6[2] {
+               assert_eq!(*node_id, node_recv.node.get_our_node_id());
+               1
+       } else { panic!("Unexpected event: {:?}", events_6[1]); };
        ((match events_6[0] {
                MessageSendEvent::SendFundingLocked { ref node_id, ref msg } => {
                        channel_id = msg.channel_id.clone();
@@ -597,7 +628,7 @@ pub fn create_chan_between_nodes_with_value_confirm_second<'a, 'b, 'c>(node_recv
                        msg.clone()
                },
                _ => panic!("Unexpected event"),
-       }, match events_6[1] {
+       }, match events_6[announcement_sigs_idx] {
                MessageSendEvent::SendAnnouncementSignatures { ref node_id, ref msg } => {
                        assert_eq!(*node_id, node_recv.node.get_our_node_id());
                        msg.clone()
@@ -780,6 +811,22 @@ macro_rules! get_closing_signed_broadcast {
        }
 }
 
+#[cfg(test)]
+macro_rules! check_warn_msg {
+       ($node: expr, $recipient_node_id: expr, $chan_id: expr) => {{
+               let msg_events = $node.node.get_and_clear_pending_msg_events();
+               assert_eq!(msg_events.len(), 1);
+               match msg_events[0] {
+                       MessageSendEvent::HandleError { action: ErrorAction::SendWarningMessage { ref msg, log_level: _ }, node_id } => {
+                               assert_eq!(node_id, $recipient_node_id);
+                               assert_eq!(msg.channel_id, $chan_id);
+                               msg.data.clone()
+                       },
+                       _ => panic!("Unexpected event"),
+               }
+       }}
+}
+
 /// Check that a channel's closing channel update has been broadcasted, and optionally
 /// check whether an error message event has occurred.
 #[macro_export]
@@ -1048,12 +1095,12 @@ macro_rules! get_route_and_payment_hash {
        }};
        ($send_node: expr, $recv_node: expr, $last_hops: expr, $recv_value: expr, $cltv: expr) => {{
                let (payment_preimage, payment_hash, payment_secret) = $crate::get_payment_preimage_hash!($recv_node, Some($recv_value));
-               let payee = $crate::routing::router::Payee::from_node_id($recv_node.node.get_our_node_id())
+               let payment_params = $crate::routing::router::PaymentParameters::from_node_id($recv_node.node.get_our_node_id())
                        .with_features($crate::ln::features::InvoiceFeatures::known())
                        .with_route_hints($last_hops);
-               let scorer = $crate::util::test_utils::TestScorer::with_fixed_penalty(0);
+               let scorer = $crate::util::test_utils::TestScorer::with_penalty(0);
                let route = $crate::routing::router::get_route(
-                       &$send_node.node.get_our_node_id(), &payee, $send_node.network_graph,
+                       &$send_node.node.get_our_node_id(), &payment_params, $send_node.network_graph,
                        Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
                        $recv_value, $cltv, $send_node.logger, &scorer
                ).unwrap();
@@ -1068,7 +1115,7 @@ macro_rules! expect_pending_htlcs_forwardable_ignore {
                let events = $node.node.get_and_clear_pending_events();
                assert_eq!(events.len(), 1);
                match events[0] {
-                       Event::PendingHTLCsForwardable { .. } => { },
+                       $crate::util::events::Event::PendingHTLCsForwardable { .. } => { },
                        _ => panic!("Unexpected event"),
                };
        }}
@@ -1103,18 +1150,22 @@ macro_rules! expect_pending_htlcs_forwardable_from_events {
        }}
 }
 
-#[cfg(any(test, feature = "unstable"))]
+#[macro_export]
+#[cfg(any(test, feature = "_bench_unstable", feature = "_test_utils"))]
 macro_rules! expect_payment_received {
        ($node: expr, $expected_payment_hash: expr, $expected_payment_secret: expr, $expected_recv_value: expr) => {
+               expect_payment_received!($node, $expected_payment_hash, $expected_payment_secret, $expected_recv_value, None)
+       };
+       ($node: expr, $expected_payment_hash: expr, $expected_payment_secret: expr, $expected_recv_value: expr, $expected_payment_preimage: expr) => {
                let events = $node.node.get_and_clear_pending_events();
                assert_eq!(events.len(), 1);
                match events[0] {
-                       Event::PaymentReceived { ref payment_hash, ref purpose, amt } => {
+                       $crate::util::events::Event::PaymentReceived { ref payment_hash, ref purpose, amt } => {
                                assert_eq!($expected_payment_hash, *payment_hash);
                                assert_eq!($expected_recv_value, amt);
                                match purpose {
-                                       PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
-                                               assert!(payment_preimage.is_none());
+                                       $crate::util::events::PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
+                                               assert_eq!(&$expected_payment_preimage, payment_preimage);
                                                assert_eq!($expected_payment_secret, *payment_secret);
                                        },
                                        _ => {},
@@ -1272,7 +1323,7 @@ macro_rules! expect_payment_failed_conditions {
                                assert_eq!(rejected_by_dest, $rejected_by_dest, "unexpected rejected_by_dest value");
                                assert!(retry.is_some(), "expected retry.is_some()");
                                assert_eq!(retry.as_ref().unwrap().final_value_msat, path.last().unwrap().fee_msat, "Retry amount should match last hop in path");
-                               assert_eq!(retry.as_ref().unwrap().payee.pubkey, path.last().unwrap().pubkey, "Retry payee node_id should match last hop in path");
+                               assert_eq!(retry.as_ref().unwrap().payment_params.payee_pubkey, path.last().unwrap().pubkey, "Retry payee node_id should match last hop in path");
 
                                assert!(error_code.is_some(), "expected error_code.is_some() = true");
                                assert!(error_data.is_some(), "expected error_data.is_some() = true");
@@ -1504,11 +1555,11 @@ pub fn claim_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
 pub const TEST_FINAL_CLTV: u32 = 70;
 
 pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash, PaymentSecret) {
-       let payee = Payee::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
+       let payment_params = PaymentParameters::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
                .with_features(InvoiceFeatures::known());
-       let scorer = test_utils::TestScorer::with_fixed_penalty(0);
+       let scorer = test_utils::TestScorer::with_penalty(0);
        let route = get_route(
-               &origin_node.node.get_our_node_id(), &payee, &origin_node.network_graph,
+               &origin_node.node.get_our_node_id(), &payment_params, &origin_node.network_graph,
                Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
                recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
        assert_eq!(route.paths.len(), 1);
@@ -1522,10 +1573,12 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
 }
 
 pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64)  {
-       let payee = Payee::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
+       let payment_params = PaymentParameters::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
                .with_features(InvoiceFeatures::known());
-       let scorer = test_utils::TestScorer::with_fixed_penalty(0);
-       let route = get_route(&origin_node.node.get_our_node_id(), &payee, origin_node.network_graph, None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
+       let scorer = test_utils::TestScorer::with_penalty(0);
+       let route = get_route(
+               &origin_node.node.get_our_node_id(), &payment_params, origin_node.network_graph,
+               None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
        assert_eq!(route.paths.len(), 1);
        assert_eq!(route.paths[0].len(), expected_route.len());
        for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {
@@ -1973,8 +2026,7 @@ macro_rules! handle_chan_reestablish_msgs {
                                                idx += 1;
                                                RAACommitmentOrder::CommitmentFirst
                                        },
-                                       &MessageSendEvent::SendChannelUpdate { .. } => RAACommitmentOrder::CommitmentFirst,
-                                       _ => panic!("Unexpected event"),
+                                       _ => RAACommitmentOrder::CommitmentFirst,
                                }
                        } else {
                                RAACommitmentOrder::CommitmentFirst
@@ -1994,16 +2046,18 @@ macro_rules! handle_chan_reestablish_msgs {
                                                commitment_update = Some(updates.clone());
                                                idx += 1;
                                        },
-                                       &MessageSendEvent::SendChannelUpdate { .. } => {},
-                                       _ => panic!("Unexpected event"),
+                                       _ => {},
                                }
                        }
 
                        if let Some(&MessageSendEvent::SendChannelUpdate { ref node_id, ref msg }) = msg_events.get(idx) {
                                assert_eq!(*node_id, $dst_node.node.get_our_node_id());
+                               idx += 1;
                                assert_eq!(msg.contents.flags & 2, 0); // "disabled" flag must not be set as we just reconnected.
                        }
 
+                       assert_eq!(msg_events.len(), idx);
+
                        (funding_locked, revoke_and_ack, commitment_update, order)
                }
        }
@@ -2076,9 +2130,9 @@ pub fn reconnect_nodes<'a, 'b, 'c>(node_a: &Node<'a, 'b, 'c>, node_b: &Node<'a,
                        let announcement_event = node_a.node.get_and_clear_pending_msg_events();
                        if !announcement_event.is_empty() {
                                assert_eq!(announcement_event.len(), 1);
-                               if let MessageSendEvent::SendAnnouncementSignatures { .. } = announcement_event[0] {
+                               if let MessageSendEvent::SendChannelUpdate { .. } = announcement_event[0] {
                                        //TODO: Test announcement_sigs re-sending
-                               } else { panic!("Unexpected event!"); }
+                               } else { panic!("Unexpected event! {:?}", announcement_event[0]); }
                        }
                } else {
                        assert!(chan_msgs.0.is_none());
@@ -2133,9 +2187,11 @@ pub fn reconnect_nodes<'a, 'b, 'c>(node_a: &Node<'a, 'b, 'c>, node_b: &Node<'a,
                        let announcement_event = node_b.node.get_and_clear_pending_msg_events();
                        if !announcement_event.is_empty() {
                                assert_eq!(announcement_event.len(), 1);
-                               if let MessageSendEvent::SendAnnouncementSignatures { .. } = announcement_event[0] {
-                                       //TODO: Test announcement_sigs re-sending
-                               } else { panic!("Unexpected event!"); }
+                               match announcement_event[0] {
+                                       MessageSendEvent::SendChannelUpdate { .. } => {},
+                                       MessageSendEvent::SendAnnouncementSignatures { .. } => {},
+                                       _ => panic!("Unexpected event {:?}!", announcement_event[0]),
+                               }
                        }
                } else {
                        assert!(chan_msgs.0.is_none());