Skip to content

Commit c0d7887

Browse files
committed
Use Persister to return errors in fuzzers not chain::Watch
1 parent 7df3201 commit c0d7887

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

fuzz/src/chanmon_consistency.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ impl Writer for VecWriter {
9999
struct TestChainMonitor {
100100
pub logger: Arc<dyn Logger>,
101101
pub keys: Arc<KeyProvider>,
102+
pub persister: Arc<TestPersister>,
102103
pub chain_monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
103-
pub update_ret: Mutex<Result<(), chain::ChannelMonitorUpdateErr>>,
104104
// If we reload a node with an old copy of ChannelMonitors, the ChannelManager deserialization
105105
// logic will automatically force-close our channels for us (as we don't have an up-to-date
106106
// monitor implying we are not able to punish misbehaving counterparties). Because this test
@@ -112,10 +112,10 @@ struct TestChainMonitor {
112112
impl TestChainMonitor {
113113
pub fn new(broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger>, feeest: Arc<FuzzEstimator>, persister: Arc<TestPersister>, keys: Arc<KeyProvider>) -> Self {
114114
Self {
115-
chain_monitor: Arc::new(chainmonitor::ChainMonitor::new(None, broadcaster, logger.clone(), feeest, persister)),
115+
chain_monitor: Arc::new(chainmonitor::ChainMonitor::new(None, broadcaster, logger.clone(), feeest, Arc::clone(&persister))),
116116
logger,
117117
keys,
118-
update_ret: Mutex::new(Ok(())),
118+
persister,
119119
latest_monitors: Mutex::new(HashMap::new()),
120120
should_update_manager: atomic::AtomicBool::new(false),
121121
}
@@ -129,8 +129,7 @@ impl chain::Watch<EnforcingSigner> for TestChainMonitor {
129129
panic!("Already had monitor pre-watch_channel");
130130
}
131131
self.should_update_manager.store(true, atomic::Ordering::Relaxed);
132-
assert!(self.chain_monitor.watch_channel(funding_txo, monitor).is_ok());
133-
self.update_ret.lock().unwrap().clone()
132+
self.chain_monitor.watch_channel(funding_txo, monitor)
134133
}
135134

136135
fn update_channel(&self, funding_txo: OutPoint, update: channelmonitor::ChannelMonitorUpdate) -> Result<(), chain::ChannelMonitorUpdateErr> {
@@ -146,8 +145,7 @@ impl chain::Watch<EnforcingSigner> for TestChainMonitor {
146145
deserialized_monitor.write(&mut ser).unwrap();
147146
map_entry.insert((update.update_id, ser.0));
148147
self.should_update_manager.store(true, atomic::Ordering::Relaxed);
149-
assert!(self.chain_monitor.update_channel(funding_txo, update).is_ok());
150-
self.update_ret.lock().unwrap().clone()
148+
self.chain_monitor.update_channel(funding_txo, update)
151149
}
152150

153151
fn release_pending_monitor_events(&self) -> Vec<MonitorEvent> {
@@ -346,7 +344,8 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
346344
($node_id: expr, $fee_estimator: expr) => { {
347345
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
348346
let keys_manager = Arc::new(KeyProvider { node_id: $node_id, rand_bytes_id: atomic::AtomicU32::new(0), enforcement_states: Mutex::new(HashMap::new()) });
349-
let monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), $fee_estimator.clone(), Arc::new(TestPersister{}), Arc::clone(&keys_manager)));
347+
let monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), $fee_estimator.clone(),
348+
Arc::new(TestPersister { update_ret: Mutex::new(Ok(())) }), Arc::clone(&keys_manager)));
350349

351350
let mut config = UserConfig::default();
352351
config.channel_options.forwarding_fee_proportional_millionths = 0;
@@ -365,7 +364,8 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
365364
($ser: expr, $node_id: expr, $old_monitors: expr, $keys_manager: expr, $fee_estimator: expr) => { {
366365
let keys_manager = Arc::clone(& $keys_manager);
367366
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
368-
let chain_monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), $fee_estimator.clone(), Arc::new(TestPersister{}), Arc::clone(& $keys_manager)));
367+
let chain_monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), $fee_estimator.clone(),
368+
Arc::new(TestPersister { update_ret: Mutex::new(Ok(())) }), Arc::clone(& $keys_manager)));
369369

370370
let mut config = UserConfig::default();
371371
config.channel_options.forwarding_fee_proportional_millionths = 0;
@@ -846,12 +846,12 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
846846
// bit-twiddling mutations to have similar effects. This is probably overkill, but no
847847
// harm in doing so.
848848

849-
0x00 => *monitor_a.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
850-
0x01 => *monitor_b.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
851-
0x02 => *monitor_c.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
852-
0x04 => *monitor_a.update_ret.lock().unwrap() = Ok(()),
853-
0x05 => *monitor_b.update_ret.lock().unwrap() = Ok(()),
854-
0x06 => *monitor_c.update_ret.lock().unwrap() = Ok(()),
849+
0x00 => *monitor_a.persister.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
850+
0x01 => *monitor_b.persister.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
851+
0x02 => *monitor_c.persister.update_ret.lock().unwrap() = Err(ChannelMonitorUpdateErr::TemporaryFailure),
852+
0x04 => *monitor_a.persister.update_ret.lock().unwrap() = Ok(()),
853+
0x05 => *monitor_b.persister.update_ret.lock().unwrap() = Ok(()),
854+
0x06 => *monitor_c.persister.update_ret.lock().unwrap() = Ok(()),
855855

856856
0x08 => {
857857
if let Some((id, _)) = monitor_a.latest_monitors.lock().unwrap().get(&chan_1_funding) {
@@ -1072,9 +1072,9 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
10721072
// after we resolve all pending events.
10731073
// First make sure there are no pending monitor updates, resetting the error state
10741074
// and calling channel_monitor_updated for each monitor.
1075-
*monitor_a.update_ret.lock().unwrap() = Ok(());
1076-
*monitor_b.update_ret.lock().unwrap() = Ok(());
1077-
*monitor_c.update_ret.lock().unwrap() = Ok(());
1075+
*monitor_a.persister.update_ret.lock().unwrap() = Ok(());
1076+
*monitor_b.persister.update_ret.lock().unwrap() = Ok(());
1077+
*monitor_c.persister.update_ret.lock().unwrap() = Ok(());
10781078

10791079
if let Some((id, _)) = monitor_a.latest_monitors.lock().unwrap().get(&chan_1_funding) {
10801080
nodes[0].channel_monitor_updated(&chan_1_funding, *id);

fuzz/src/full_stack.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
365365
};
366366

367367
let broadcast = Arc::new(TestBroadcaster{ txn_broadcasted: Mutex::new(Vec::new()) });
368-
let monitor = Arc::new(chainmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone(), Arc::new(TestPersister{})));
368+
let monitor = Arc::new(chainmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone(),
369+
Arc::new(TestPersister { update_ret: Mutex::new(Ok(())) })));
369370

370371
let keys_manager = Arc::new(KeyProvider { node_secret: our_network_key.clone(), counter: AtomicU64::new(0) });
371372
let mut config = UserConfig::default();

fuzz/src/utils/test_persister.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@ use lightning::chain::{chainmonitor, channelmonitor};
33
use lightning::chain::transaction::OutPoint;
44
use lightning::util::enforcing_trait_impls::EnforcingSigner;
55

6-
pub struct TestPersister {}
6+
use std::sync::Mutex;
7+
8+
pub struct TestPersister {
9+
pub update_ret: Mutex<Result<(), chain::ChannelMonitorUpdateErr>>,
10+
}
711
impl chainmonitor::Persist<EnforcingSigner> for TestPersister {
812
fn persist_new_channel(&self, _funding_txo: OutPoint, _data: &channelmonitor::ChannelMonitor<EnforcingSigner>) -> Result<(), chain::ChannelMonitorUpdateErr> {
9-
Ok(())
13+
self.update_ret.lock().unwrap().clone()
1014
}
1115

1216
fn update_persisted_channel(&self, _funding_txo: OutPoint, _update: &channelmonitor::ChannelMonitorUpdate, _data: &channelmonitor::ChannelMonitor<EnforcingSigner>) -> Result<(), chain::ChannelMonitorUpdateErr> {
13-
Ok(())
17+
self.update_ret.lock().unwrap().clone()
1418
}
1519
}

0 commit comments

Comments
 (0)