Merge pull request #961 from TheBlueMatt/2021-06-workaround-broken-cln
[rust-lightning] / fuzz / src / full_stack.rs
index adfd2a8309cc5e3091770b2091729f46eff365da..f68cc8f3df7a16bf43d81993c2cff9ad1f963793 100644 (file)
@@ -27,18 +27,19 @@ use bitcoin::hashes::sha256::Hash as Sha256;
 use bitcoin::hash_types::{Txid, BlockHash, WPubkeyHash};
 
 use lightning::chain;
-use lightning::chain::{Confirm, Listen};
+use lightning::chain::{BestBlock, Confirm, Listen};
 use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
 use lightning::chain::chainmonitor;
 use lightning::chain::transaction::OutPoint;
 use lightning::chain::keysinterface::{InMemorySigner, KeysInterface};
 use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
-use lightning::ln::channelmanager::{BestBlock, ChainParameters, ChannelManager};
+use lightning::ln::channelmanager::{ChainParameters, ChannelManager};
 use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor};
 use lightning::ln::msgs::DecodeError;
 use lightning::routing::router::get_route;
 use lightning::routing::network_graph::NetGraphMsgHandler;
 use lightning::util::config::UserConfig;
+use lightning::util::errors::APIError;
 use lightning::util::events::Event;
 use lightning::util::enforcing_trait_impls::EnforcingSigner;
 use lightning::util::logger::Logger;
@@ -531,12 +532,18 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
                                                        continue 'outer_loop;
                                                }
                                        };
-                                       channelmanager.funding_transaction_generated(&funding_generation.0, tx.clone()).unwrap();
+                                       if let Err(e) = channelmanager.funding_transaction_generated(&funding_generation.0, tx.clone()) {
+                                               // It's possible the channel has been closed in the mean time, but any other
+                                               // failure may be a bug.
+                                               if let APIError::ChannelUnavailable { err } = e {
+                                                       assert_eq!(err, "No such channel");
+                                               } else { panic!(); }
+                                       }
                                        pending_funding_signatures.insert(funding_output, tx);
                                }
                        },
                        11 => {
-                               let mut txn = broadcast.txn_broadcasted.lock().unwrap();
+                               let mut txn = broadcast.txn_broadcasted.lock().unwrap().split_off(0);
                                if !txn.is_empty() {
                                        loss_detector.connect_block(&txn[..]);
                                        for _ in 2..100 {