Cache our node ID in ChannelManager
[rust-lightning] / lightning / src / ln / functional_test_utils.rs
index 3e91f6d9c649223ae24d7f79c5d4b175ec6cae82..9adfeb292fd66e74db9037e88b117298dedb04ef 100644 (file)
@@ -50,7 +50,7 @@ pub const CHAN_CONFIRM_DEPTH: u32 = 10;
 /// top, giving the given transaction CHAN_CONFIRM_DEPTH confirmations.
 pub fn confirm_transaction<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, tx: &Transaction) {
        confirm_transaction_at(node, tx, node.best_block_info().1 + 1);
-       connect_blocks(node, CHAN_CONFIRM_DEPTH - 1, node.best_block_info().1, false, Default::default());
+       connect_blocks(node, CHAN_CONFIRM_DEPTH - 1);
 }
 /// Mine a signle block containing the given transaction
 pub fn mine_transaction<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, tx: &Transaction) {
@@ -67,8 +67,8 @@ pub fn confirm_transaction_at<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, tx: &T
        };
        let height = starting_block.1 + 1;
        assert!(height <= conf_height);
-       for i in height..conf_height {
-               connect_block(node, &block, i);
+       for _ in height..conf_height {
+               connect_block(node, &block);
                block = Block {
                        header: BlockHeader { version: 0x20000000, prev_blockhash: block.header.block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
                        txdata: vec![],
@@ -79,52 +79,40 @@ pub fn confirm_transaction_at<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, tx: &T
                block.txdata.push(Transaction { version: 0, lock_time: 0, input: Vec::new(), output: Vec::new() });
        }
        block.txdata.push(tx.clone());
-       connect_block(node, &block, conf_height);
+       connect_block(node, &block);
 }
 
-pub fn connect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, depth: u32, height: u32, parent: bool, prev_blockhash: BlockHash) -> BlockHash {
-       // The next commit drops the height, parent, and prev_blockhash parameters. In order to
-       // demonstrate that they are currently unused, we assert that they always match the new default
-       // parameters here.
-       if parent { assert_eq!(prev_blockhash, node.best_block_hash()); }
-       assert_eq!(node.best_block_info().1, height);
-
+pub fn connect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, depth: u32) -> BlockHash {
        let mut block = Block {
-               header: BlockHeader { version: 0x2000000, prev_blockhash: if parent { prev_blockhash } else { node.best_block_hash() }, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
+               header: BlockHeader { version: 0x2000000, prev_blockhash: node.best_block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
                txdata: vec![],
        };
-       connect_block(node, &block, height + 1);
-       for i in 2..depth + 1 {
+       connect_block(node, &block);
+       for _ in 2..depth + 1 {
                block = Block {
                        header: BlockHeader { version: 0x20000000, prev_blockhash: block.header.block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 },
                        txdata: vec![],
                };
-               connect_block(node, &block, height + i);
+               connect_block(node, &block);
        }
        block.header.block_hash()
 }
 
-pub fn connect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, block: &Block, height: u32) {
+pub fn connect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, block: &Block) {
        let txdata: Vec<_> = block.txdata.iter().enumerate().collect();
+       let height = node.best_block_info().1 + 1;
        node.chain_monitor.chain_monitor.block_connected(&block.header, &txdata, height);
        node.node.block_connected(&block.header, &txdata, height);
        node.node.test_process_background_events();
        node.blocks.borrow_mut().push((block.header, height));
 }
 
-pub fn disconnect_block<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, header: &BlockHeader, height: u32) {
-       node.chain_monitor.chain_monitor.block_disconnected(header, height);
-       node.node.block_disconnected(header);
-       node.blocks.borrow_mut().pop();
-}
 pub fn disconnect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, count: u32) {
-       assert!(node.blocks.borrow_mut().len() as u32 > count); // Cannot disconnect genesis
        for _ in 0..count {
-               let (block_header, height) = {
-                       let blocks = node.blocks.borrow_mut();
-                       (blocks[blocks.len() - 1].0, blocks[blocks.len() - 1].1)
-               };
-               disconnect_block(&node, &block_header, height);
+               let orig_header = node.blocks.borrow_mut().pop().unwrap();
+               assert!(orig_header.1 > 0); // Cannot disconnect genesis
+               node.chain_monitor.chain_monitor.block_disconnected(&orig_header.0, orig_header.1);
+               node.node.block_disconnected(&orig_header.0);
        }
 }
 
@@ -325,6 +313,24 @@ macro_rules! get_event_msg {
        }
 }
 
+/// Get a specific event from the pending events queue.
+#[macro_export]
+macro_rules! get_event {
+       ($node: expr, $event_type: path) => {
+               {
+                       let mut events = $node.node.get_and_clear_pending_events();
+                       assert_eq!(events.len(), 1);
+                       let ev = events.pop().unwrap();
+                       match ev {
+                               $event_type { .. } => {
+                                       ev
+                               },
+                               _ => panic!("Unexpected event"),
+                       }
+               }
+       }
+}
+
 #[cfg(test)]
 macro_rules! get_htlc_update_msgs {
        ($node: expr, $node_id: expr) => {
@@ -353,7 +359,8 @@ macro_rules! get_feerate {
        }
 }
 
-#[cfg(test)]
+/// Returns any local commitment transactions for the channel.
+#[macro_export]
 macro_rules! get_local_commitment_txn {
        ($node: expr, $channel_id: expr) => {
                {
@@ -467,7 +474,7 @@ pub fn create_chan_between_nodes_with_value_init<'a, 'b, 'c>(node_a: &Node<'a, '
 
 pub fn create_chan_between_nodes_with_value_confirm_first<'a, 'b, 'c, 'd>(node_recv: &'a Node<'b, 'c, 'c>, node_conf: &'a Node<'b, 'c, 'd>, tx: &Transaction, conf_height: u32) {
        confirm_transaction_at(node_conf, tx, conf_height);
-       connect_blocks(node_conf, CHAN_CONFIRM_DEPTH - 1, node_conf.best_block_info().1, false, Default::default());
+       connect_blocks(node_conf, CHAN_CONFIRM_DEPTH - 1);
        node_recv.node.handle_funding_locked(&node_conf.node.get_our_node_id(), &get_event_msg!(node_conf, MessageSendEvent::SendFundingLocked, node_recv.node.get_our_node_id()));
 }
 
@@ -495,7 +502,7 @@ pub fn create_chan_between_nodes_with_value_confirm<'a, 'b, 'c, 'd>(node_a: &'a
        let conf_height = std::cmp::max(node_a.best_block_info().1 + 1, node_b.best_block_info().1 + 1);
        create_chan_between_nodes_with_value_confirm_first(node_a, node_b, tx, conf_height);
        confirm_transaction_at(node_a, tx, conf_height);
-       connect_blocks(node_a, CHAN_CONFIRM_DEPTH - 1, node_a.best_block_info().1, false, Default::default());
+       connect_blocks(node_a, CHAN_CONFIRM_DEPTH - 1);
        create_chan_between_nodes_with_value_confirm_second(node_b, node_a)
 }