Skip to content

Commit 9ae9261

Browse files
committed
f - Test handling events from ChainMonitor
1 parent ba0d8db commit 9ae9261

File tree

2 files changed

+65
-13
lines changed

2 files changed

+65
-13
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,13 @@ impl BackgroundProcessor {
170170

171171
#[cfg(test)]
172172
mod tests {
173+
use bitcoin::blockdata::block::BlockHeader;
173174
use bitcoin::blockdata::constants::genesis_block;
174175
use bitcoin::blockdata::transaction::{Transaction, TxOut};
175176
use bitcoin::network::constants::Network;
177+
use lightning::chain::Confirm;
176178
use lightning::chain::chainmonitor;
179+
use lightning::chain::channelmonitor::ANTI_REORG_DELAY;
177180
use lightning::chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager};
178181
use lightning::chain::transaction::OutPoint;
179182
use lightning::get_event_msg;
@@ -192,6 +195,8 @@ mod tests {
192195
use std::time::Duration;
193196
use super::{BackgroundProcessor, FRESHNESS_TIMER};
194197

198+
const EVENT_DEADLINE: u64 = 5 * FRESHNESS_TIMER;
199+
195200
#[derive(Clone, Eq, Hash, PartialEq)]
196201
struct TestDescriptor{}
197202
impl SocketDescriptor for TestDescriptor {
@@ -209,7 +214,9 @@ mod tests {
209214
peer_manager: Arc<PeerManager<TestDescriptor, Arc<test_utils::TestChannelMessageHandler>, Arc<test_utils::TestRoutingMessageHandler>, Arc<test_utils::TestLogger>>>,
210215
chain_monitor: Arc<ChainMonitor>,
211216
persister: Arc<FilesystemPersister>,
217+
tx_broadcaster: Arc<test_utils::TestBroadcaster>,
212218
logger: Arc<test_utils::TestLogger>,
219+
best_block: BestBlock,
213220
}
214221

215222
impl Drop for Node {
@@ -241,14 +248,12 @@ mod tests {
241248
let now = Duration::from_secs(genesis_block(network).header.time as u64);
242249
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
243250
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), persister.clone()));
244-
let params = ChainParameters {
245-
network,
246-
best_block: BestBlock::from_genesis(network),
247-
};
248-
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster, logger.clone(), keys_manager.clone(), UserConfig::default(), params));
251+
let best_block = BestBlock::from_genesis(network);
252+
let params = ChainParameters { network, best_block };
253+
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
249254
let msg_handler = MessageHandler { chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new()), route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new() )};
250255
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(), &seed, logger.clone()));
251-
let node = Node { node: manager, peer_manager, chain_monitor, persister, logger };
256+
let node = Node { node: manager, peer_manager, chain_monitor, persister, tx_broadcaster, logger, best_block };
252257
nodes.push(node);
253258
}
254259
nodes
@@ -298,6 +303,27 @@ mod tests {
298303
}}
299304
}
300305

306+
fn confirm_transaction(node: &mut Node, tx: &Transaction) {
307+
for i in 1..=ANTI_REORG_DELAY {
308+
let prev_blockhash = node.best_block.block_hash();
309+
let height = node.best_block.height() + 1;
310+
let header = BlockHeader { version: 0x20000000, prev_blockhash, merkle_root: Default::default(), time: height, bits: 42, nonce: 42 };
311+
let txdata = vec![(0, tx)];
312+
node.best_block = BestBlock::new(header.block_hash(), height);
313+
match i {
314+
1 => {
315+
node.node.transactions_confirmed(&header, &txdata, height);
316+
node.chain_monitor.transactions_confirmed(&header, &txdata, height);
317+
},
318+
ANTI_REORG_DELAY => {
319+
node.node.best_block_updated(&header, height);
320+
node.chain_monitor.best_block_updated(&header, height);
321+
},
322+
_ => {},
323+
}
324+
}
325+
}
326+
301327
#[test]
302328
fn test_background_processor() {
303329
// Test that when a new channel is created, the ChannelManager needs to be re-persisted with
@@ -391,7 +417,7 @@ mod tests {
391417

392418
#[test]
393419
fn test_background_event_handling() {
394-
let nodes = create_nodes(2, "test_background_event_handling".to_string());
420+
let mut nodes = create_nodes(2, "test_background_event_handling".to_string());
395421
let channel_value = 100000;
396422
let data_dir = nodes[0].persister.get_data_dir();
397423
let persister = move |node: &_| FilesystemPersister::persist_manager(data_dir.clone(), node);
@@ -401,15 +427,41 @@ mod tests {
401427
let event_handler = move |event| {
402428
sender.send(handle_funding_generation_ready!(event, channel_value)).unwrap();
403429
};
404-
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
430+
let bg_processor = BackgroundProcessor::start(persister.clone(), event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
405431

406432
// Open a channel and check that the FundingGenerationReady event was handled.
407433
begin_open_channel!(nodes[0], nodes[1], channel_value);
408-
let timeout = Duration::from_secs(5 * FRESHNESS_TIMER);
409-
let (temporary_channel_id, tx) = receiver
410-
.recv_timeout(timeout)
434+
let (temporary_channel_id, funding_tx) = receiver
435+
.recv_timeout(Duration::from_secs(EVENT_DEADLINE))
411436
.expect("FundingGenerationReady not handled within deadline");
412-
end_open_channel!(nodes[0], nodes[1], temporary_channel_id, tx);
437+
end_open_channel!(nodes[0], nodes[1], temporary_channel_id, funding_tx);
438+
439+
assert!(bg_processor.stop().is_ok());
440+
441+
// Set up a background event handler for SpendableOutputs events.
442+
let (sender, receiver) = std::sync::mpsc::sync_channel(1);
443+
let event_handler = move |event| {
444+
sender.send(event).unwrap();
445+
};
446+
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
447+
448+
// Confirm the funding transaction.
449+
confirm_transaction(&mut nodes[0], &funding_tx);
450+
confirm_transaction(&mut nodes[1], &funding_tx);
451+
nodes[0].node.handle_funding_locked(&nodes[1].node.get_our_node_id(), &get_event_msg!(nodes[1], MessageSendEvent::SendFundingLocked, nodes[0].node.get_our_node_id()));
452+
nodes[1].node.handle_funding_locked(&nodes[0].node.get_our_node_id(), &get_event_msg!(nodes[0], MessageSendEvent::SendFundingLocked, nodes[1].node.get_our_node_id()));
453+
454+
// Force close the channel and check that the SpendableOutputs event was handled.
455+
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
456+
let commitment_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().pop().unwrap();
457+
confirm_transaction(&mut nodes[0], &commitment_tx);
458+
let event = receiver
459+
.recv_timeout(Duration::from_secs(EVENT_DEADLINE))
460+
.expect("SpendableOutputs not handled within deadline");
461+
match event {
462+
Event::SpendableOutputs { .. } => {},
463+
_ => panic!("Unexpected event: {:?}", event),
464+
}
413465

414466
assert!(bg_processor.stop().is_ok());
415467
}

lightning/src/chain/channelmonitor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ pub(crate) const LATENCY_GRACE_PERIOD_BLOCKS: u32 = 3;
226226
/// It may cause spurrious generation of bumped claim txn but that's allright given the outpoint is already
227227
/// solved by a previous claim tx. What we want to avoid is reorg evicting our claim tx and us not
228228
/// keeping bumping another claim tx to solve the outpoint.
229-
pub(crate) const ANTI_REORG_DELAY: u32 = 6;
229+
pub const ANTI_REORG_DELAY: u32 = 6;
230230
/// Number of blocks before confirmation at which we fail back an un-relayed HTLC or at which we
231231
/// refuse to accept a new HTLC.
232232
///

0 commit comments

Comments
 (0)