Include block hash for watched transaction output
[rust-lightning] / lightning / src / util / test_utils.rs
index 9f87795e31e7b5a1dbcf86f8468671a2b6c7b9a6..2eabfd5cb94ad1b84940892ba1942f91c7169820 100644 (file)
@@ -8,6 +8,7 @@
 // licenses.
 
 use chain;
+use chain::WatchedOutput;
 use chain::chaininterface;
 use chain::chaininterface::ConfirmationTarget;
 use chain::chainmonitor;
@@ -82,9 +83,13 @@ pub struct TestChainMonitor<'a> {
        pub chain_monitor: chainmonitor::ChainMonitor<EnforcingSigner, &'a TestChainSource, &'a chaininterface::BroadcasterInterface, &'a TestFeeEstimator, &'a TestLogger, &'a channelmonitor::Persist<EnforcingSigner>>,
        pub keys_manager: &'a TestKeysInterface,
        pub update_ret: Mutex<Option<Result<(), channelmonitor::ChannelMonitorUpdateErr>>>,
-       // If this is set to Some(), after the next return, we'll always return this until update_ret
-       // is changed:
+       /// 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<Option<Result<(), channelmonitor::ChannelMonitorUpdateErr>>>,
+       /// If this is set to Some(), the next update_channel call (not watch_channel) must be a
+       /// ChannelForceClosed event for the given channel_id with should_broadcast set to the given
+       /// boolean.
+       pub expect_channel_force_closed: Mutex<Option<([u8; 32], bool)>>,
 }
 impl<'a> TestChainMonitor<'a> {
        pub fn new(chain_source: Option<&'a TestChainSource>, broadcaster: &'a chaininterface::BroadcasterInterface, logger: &'a TestLogger, fee_estimator: &'a TestFeeEstimator, persister: &'a channelmonitor::Persist<EnforcingSigner>, keys_manager: &'a TestKeysInterface) -> Self {
@@ -95,6 +100,7 @@ impl<'a> TestChainMonitor<'a> {
                        keys_manager,
                        update_ret: Mutex::new(None),
                        next_update_ret: Mutex::new(None),
+                       expect_channel_force_closed: Mutex::new(None),
                }
        }
 }
@@ -129,6 +135,14 @@ impl<'a> chain::Watch<EnforcingSigner> for TestChainMonitor<'a> {
                assert!(channelmonitor::ChannelMonitorUpdate::read(
                                &mut ::std::io::Cursor::new(&w.0)).unwrap() == update);
 
+               if let Some(exp) = self.expect_channel_force_closed.lock().unwrap().take() {
+                       assert_eq!(funding_txo.to_channel_id(), exp.0);
+                       assert_eq!(update.updates.len(), 1);
+                       if let channelmonitor::ChannelMonitorUpdateStep::ChannelForceClosed { should_broadcast } = update.updates[0] {
+                               assert_eq!(should_broadcast, exp.1);
+                       } else { panic!(); }
+               }
+
                self.latest_monitor_update_id.lock().unwrap().insert(funding_txo.to_channel_id(), (funding_txo, update.update_id));
                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
@@ -218,6 +232,7 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
        fn handle_commitment_signed(&self, _their_node_id: &PublicKey, _msg: &msgs::CommitmentSigned) {}
        fn handle_revoke_and_ack(&self, _their_node_id: &PublicKey, _msg: &msgs::RevokeAndACK) {}
        fn handle_update_fee(&self, _their_node_id: &PublicKey, _msg: &msgs::UpdateFee) {}
+       fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelUpdate) {}
        fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &msgs::AnnouncementSignatures) {}
        fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelReestablish) {}
        fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
@@ -532,7 +547,8 @@ impl chain::Filter for TestChainSource {
                self.watched_txn.lock().unwrap().insert((*txid, script_pubkey.clone()));
        }
 
-       fn register_output(&self, outpoint: &OutPoint, script_pubkey: &Script) {
-               self.watched_outputs.lock().unwrap().insert((*outpoint, script_pubkey.clone()));
+       fn register_output(&self, output: WatchedOutput) -> Option<(usize, Transaction)> {
+               self.watched_outputs.lock().unwrap().insert((output.outpoint, output.script_pubkey));
+               None
        }
 }