X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;ds=sidebyside;f=lightning%2Fsrc%2Fln%2Ffunctional_test_utils.rs;h=674e7d0ff322df1b17f7db5926601789c4ddbe50;hb=662f13a85879d154f536654eb34600f0b77822fd;hp=472e50aae27b1cedfeccccd880b1cd2958099d4a;hpb=4fa6d966dfc1106ca096dc455bb115806ee0f4b1;p=rust-lightning diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs index 472e50aa..674e7d0f 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -5,6 +5,7 @@ use chain::chaininterface; use chain::transaction::OutPoint; use chain::keysinterface::KeysInterface; use ln::channelmanager::{ChannelManager,RAACommitmentOrder, PaymentPreimage, PaymentHash}; +use ln::channelmonitor::{ChannelMonitor, ManyChannelMonitor}; use ln::router::{Route, Router}; use ln::features::InitFeatures; use ln::msgs; @@ -16,6 +17,7 @@ use util::events::{Event, EventsProvider, MessageSendEvent, MessageSendEventsPro use util::errors::APIError; use util::logger::Logger; use util::config::UserConfig; +use util::ser::ReadableArgs; use bitcoin::util::hash::BitcoinHash; use bitcoin::blockdata::block::BlockHeader; @@ -35,6 +37,7 @@ use std::cell::RefCell; use std::rc::Rc; use std::sync::{Arc, Mutex}; use std::mem; +use std::collections::HashSet; pub const CHAN_CONFIRM_DEPTH: u32 = 100; pub fn confirm_transaction<'a, 'b: 'a>(notifier: &'a chaininterface::BlockNotifierRef<'b>, chain: &chaininterface::ChainWatchInterfaceUtil, tx: &Transaction, chan_id: u32) { @@ -88,6 +91,27 @@ impl<'a, 'b> Drop for Node<'a, 'b> { assert!(self.node.get_and_clear_pending_msg_events().is_empty()); assert!(self.node.get_and_clear_pending_events().is_empty()); assert!(self.chan_monitor.added_monitors.lock().unwrap().is_empty()); + + // Check that if we serialize and then deserialize all our channel monitors we get the + // same set of outputs to watch for on chain as we have now. Note that if we write + // tests that fully close channels and remove the monitors at some point this may break. + let chain_watch = Arc::new(chaininterface::ChainWatchInterfaceUtil::new(Network::Testnet, Arc::clone(&self.logger) as Arc)); + let feeest = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }); + let channel_monitor = test_utils::TestChannelMonitor::new(chain_watch.clone(), self.tx_broadcaster.clone(), self.logger.clone(), feeest); + let old_monitors = self.chan_monitor.simple_monitor.monitors.lock().unwrap(); + for (_, old_monitor) in old_monitors.iter() { + let mut w = test_utils::TestVecWriter(Vec::new()); + old_monitor.write_for_disk(&mut w).unwrap(); + let (_, deserialized_monitor) = <(Sha256d, ChannelMonitor)>::read( + &mut ::std::io::Cursor::new(&w.0), Arc::clone(&self.logger) as Arc).unwrap(); + if let Err(_) = channel_monitor.add_update_monitor(deserialized_monitor.get_funding_txo().unwrap(), deserialized_monitor) { + panic!(); + } + } + + if *chain_watch != *self.chain_monitor { + panic!(); + } } } } @@ -857,7 +881,7 @@ pub fn create_node_cfgs(node_count: usize) -> Vec { let logger = Arc::new(test_utils::TestLogger::with_id(format!("node {}", i))); let fee_estimator = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }); let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new(Network::Testnet, logger.clone() as Arc)); - let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())}); + let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), broadcasted_txn: Mutex::new(HashSet::new())}); let mut seed = [0; 32]; rng.fill_bytes(&mut seed); let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&seed, Network::Testnet, logger.clone() as Arc));