X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Ftest_utils.rs;h=b55c19e39363660007e77a98a9a169c12aa7b854;hb=2cbb8358f114f52976c9f51ee17f71f36f23f20a;hp=0370c0e1a402150bbdd749d892e10f895573a1a6;hpb=6cd6816cd7efce593ef487d07adfff66cee0daa2;p=rust-lightning diff --git a/lightning/src/util/test_utils.rs b/lightning/src/util/test_utils.rs index 0370c0e1..b55c19e3 100644 --- a/lightning/src/util/test_utils.rs +++ b/lightning/src/util/test_utils.rs @@ -21,7 +21,7 @@ use ln::msgs::OptionalField; use util::enforcing_trait_impls::EnforcingChannelKeys; use util::events; use util::logger::{Logger, Level, Record}; -use util::ser::{Readable, Writer, Writeable}; +use util::ser::{Readable, ReadableArgs, Writer, Writeable}; use bitcoin::blockdata::constants::genesis_block; use bitcoin::blockdata::transaction::{Transaction, TxOut}; @@ -39,6 +39,7 @@ use std::sync::Mutex; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::{cmp, mem}; use std::collections::{HashMap, HashSet}; +use chain::keysinterface::InMemoryChannelKeys; pub struct TestVecWriter(pub Vec); impl Writer for TestVecWriter { @@ -60,22 +61,39 @@ impl chaininterface::FeeEstimator for TestFeeEstimator { } } +pub struct OnlyReadsKeysInterface {} +impl keysinterface::KeysInterface for OnlyReadsKeysInterface { + type ChanKeySigner = EnforcingChannelKeys; + + fn get_node_secret(&self) -> SecretKey { unreachable!(); } + fn get_destination_script(&self) -> Script { unreachable!(); } + fn get_shutdown_pubkey(&self) -> PublicKey { unreachable!(); } + fn get_channel_keys(&self, _inbound: bool, _channel_value_satoshis: u64) -> EnforcingChannelKeys { unreachable!(); } + fn get_secure_random_bytes(&self) -> [u8; 32] { unreachable!(); } + + fn read_chan_signer(&self, reader: &[u8]) -> Result { + EnforcingChannelKeys::read(&mut std::io::Cursor::new(reader)) + } +} + pub struct TestChainMonitor<'a> { pub added_monitors: Mutex)>>, pub latest_monitor_update_id: Mutex>, - pub chain_monitor: chainmonitor::ChainMonitor, - pub update_ret: Mutex>, + pub chain_monitor: chainmonitor::ChainMonitor>, + pub keys_manager: &'a TestKeysInterface, + pub update_ret: Mutex>>, // If this is set to Some(), after the next return, we'll always return this until update_ret // is changed: pub next_update_ret: Mutex>>, } impl<'a> TestChainMonitor<'a> { - pub fn new(chain_source: Option<&'a TestChainSource>, broadcaster: &'a chaininterface::BroadcasterInterface, logger: &'a TestLogger, fee_estimator: &'a TestFeeEstimator) -> Self { + pub fn new(chain_source: Option<&'a TestChainSource>, broadcaster: &'a chaininterface::BroadcasterInterface, logger: &'a TestLogger, fee_estimator: &'a TestFeeEstimator, persister: &'a channelmonitor::Persist, keys_manager: &'a TestKeysInterface) -> Self { Self { added_monitors: Mutex::new(Vec::new()), latest_monitor_update_id: Mutex::new(HashMap::new()), - chain_monitor: chainmonitor::ChainMonitor::new(chain_source, broadcaster, logger, fee_estimator), - update_ret: Mutex::new(Ok(())), + chain_monitor: chainmonitor::ChainMonitor::new(chain_source, broadcaster, logger, fee_estimator, persister), + keys_manager, + update_ret: Mutex::new(None), next_update_ret: Mutex::new(None), } } @@ -87,19 +105,23 @@ impl<'a> chain::Watch for TestChainMonitor<'a> { // At every point where we get a monitor update, we should be able to send a useful monitor // to a watchtower and disk... let mut w = TestVecWriter(Vec::new()); - monitor.write_for_disk(&mut w).unwrap(); + monitor.write(&mut w).unwrap(); let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor)>::read( - &mut ::std::io::Cursor::new(&w.0)).unwrap().1; + &mut ::std::io::Cursor::new(&w.0), self.keys_manager).unwrap().1; assert!(new_monitor == monitor); self.latest_monitor_update_id.lock().unwrap().insert(funding_txo.to_channel_id(), (funding_txo, monitor.get_latest_update_id())); self.added_monitors.lock().unwrap().push((funding_txo, monitor)); - assert!(self.chain_monitor.watch_channel(funding_txo, new_monitor).is_ok()); + let watch_res = self.chain_monitor.watch_channel(funding_txo, new_monitor); let ret = self.update_ret.lock().unwrap().clone(); if let Some(next_ret) = self.next_update_ret.lock().unwrap().take() { - *self.update_ret.lock().unwrap() = next_ret; + *self.update_ret.lock().unwrap() = Some(next_ret); } - ret + if ret.is_some() { + assert!(watch_res.is_ok()); + return ret.unwrap(); + } + watch_res } fn update_channel(&self, funding_txo: OutPoint, update: channelmonitor::ChannelMonitorUpdate) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> { @@ -110,23 +132,27 @@ impl<'a> chain::Watch for TestChainMonitor<'a> { &mut ::std::io::Cursor::new(&w.0)).unwrap() == update); self.latest_monitor_update_id.lock().unwrap().insert(funding_txo.to_channel_id(), (funding_txo, update.update_id)); - assert!(self.chain_monitor.update_channel(funding_txo, update).is_ok()); + let update_res = self.chain_monitor.update_channel(funding_txo, update); // At every point where we get a monitor update, we should be able to send a useful monitor // to a watchtower and disk... let monitors = self.chain_monitor.monitors.lock().unwrap(); let monitor = monitors.get(&funding_txo).unwrap(); w.0.clear(); - monitor.write_for_disk(&mut w).unwrap(); + monitor.write(&mut w).unwrap(); let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor)>::read( - &mut ::std::io::Cursor::new(&w.0)).unwrap().1; + &mut ::std::io::Cursor::new(&w.0), self.keys_manager).unwrap().1; assert!(new_monitor == *monitor); self.added_monitors.lock().unwrap().push((funding_txo, new_monitor)); let ret = self.update_ret.lock().unwrap().clone(); if let Some(next_ret) = self.next_update_ret.lock().unwrap().take() { - *self.update_ret.lock().unwrap() = next_ret; + *self.update_ret.lock().unwrap() = Some(next_ret); } - ret + if ret.is_some() { + assert!(update_res.is_ok()); + return ret.unwrap(); + } + update_res } fn release_pending_monitor_events(&self) -> Vec { @@ -134,6 +160,30 @@ impl<'a> chain::Watch for TestChainMonitor<'a> { } } +pub struct TestPersister { + pub update_ret: Mutex> +} +impl TestPersister { + pub fn new() -> Self { + Self { + update_ret: Mutex::new(Ok(())) + } + } + + pub fn set_update_ret(&self, ret: Result<(), channelmonitor::ChannelMonitorUpdateErr>) { + *self.update_ret.lock().unwrap() = ret; + } +} +impl channelmonitor::Persist for TestPersister { + fn persist_new_channel(&self, _funding_txo: OutPoint, _data: &channelmonitor::ChannelMonitor) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> { + self.update_ret.lock().unwrap().clone() + } + + fn update_persisted_channel(&self, _funding_txo: OutPoint, _update: &channelmonitor::ChannelMonitorUpdate, _data: &channelmonitor::ChannelMonitor) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> { + self.update_ret.lock().unwrap().clone() + } +} + pub struct TestBroadcaster { pub txn_broadcasted: Mutex>, } @@ -284,8 +334,28 @@ impl msgs::RoutingMessageHandler for TestRoutingMessageHandler { Vec::new() } - fn should_request_full_sync(&self, _node_id: &PublicKey) -> bool { - self.request_full_sync.load(Ordering::Acquire) + fn sync_routing_table(&self, _their_node_id: &PublicKey, _init_msg: &msgs::Init) {} + + fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: msgs::ReplyChannelRange) -> Result<(), msgs::LightningError> { + Ok(()) + } + + fn handle_reply_short_channel_ids_end(&self, _their_node_id: &PublicKey, _msg: msgs::ReplyShortChannelIdsEnd) -> Result<(), msgs::LightningError> { + Ok(()) + } + + fn handle_query_channel_range(&self, _their_node_id: &PublicKey, _msg: msgs::QueryChannelRange) -> Result<(), msgs::LightningError> { + Ok(()) + } + + fn handle_query_short_channel_ids(&self, _their_node_id: &PublicKey, _msg: msgs::QueryShortChannelIds) -> Result<(), msgs::LightningError> { + Ok(()) + } +} + +impl events::MessageSendEventsProvider for TestRoutingMessageHandler { + fn get_and_clear_pending_msg_events(&self) -> Vec { + vec![] } } @@ -378,6 +448,10 @@ impl keysinterface::KeysInterface for TestKeysInterface { } self.backing.get_secure_random_bytes() } + + fn read_chan_signer(&self, reader: &[u8]) -> Result { + EnforcingChannelKeys::read(&mut std::io::Cursor::new(reader)) + } } impl TestKeysInterface {