Skip to content

Commit 4006717

Browse files
authored
Merge pull request #1853 from TheBlueMatt/2022-11-reload-macro
Replace manual node reloading with a macro/function in tests
2 parents 4d914b5 + 97b210d commit 4006717

9 files changed

+931
-1405
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

+5-79
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ use bitcoin::network::constants::Network;
1919
use crate::chain::channelmonitor::{ANTI_REORG_DELAY, ChannelMonitor};
2020
use crate::chain::transaction::OutPoint;
2121
use crate::chain::{ChannelMonitorUpdateStatus, Listen, Watch};
22-
use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, PaymentId};
22+
use crate::ln::channelmanager::{self, ChannelManager, RAACommitmentOrder, PaymentSendFailure, PaymentId};
2323
use crate::ln::channel::AnnouncementSigsState;
2424
use crate::ln::msgs;
2525
use crate::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler};
26-
use crate::util::config::UserConfig;
2726
use crate::util::enforcing_trait_impls::EnforcingSigner;
2827
use crate::util::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose, ClosureReason, HTLCDestination};
2928
use crate::util::errors::APIError;
@@ -2294,40 +2293,8 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
22942293
// disconnect the peers. Note that the fuzzer originally found this issue because
22952294
// deserializing a ChannelManager in this state causes an assertion failure.
22962295
if reload_a {
2297-
let nodes_0_serialized = nodes[0].node.encode();
2298-
let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
2299-
get_monitor!(nodes[0], chan_id).write(&mut chan_0_monitor_serialized).unwrap();
2300-
2301-
persister = test_utils::TestPersister::new();
2302-
let keys_manager = &chanmon_cfgs[0].keys_manager;
2303-
new_chain_monitor = test_utils::TestChainMonitor::new(Some(nodes[0].chain_source), nodes[0].tx_broadcaster.clone(), nodes[0].logger, node_cfgs[0].fee_estimator, &persister, keys_manager);
2304-
nodes[0].chain_monitor = &new_chain_monitor;
2305-
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
2306-
let (_, mut chan_0_monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
2307-
&mut chan_0_monitor_read, keys_manager).unwrap();
2308-
assert!(chan_0_monitor_read.is_empty());
2309-
2310-
let mut nodes_0_read = &nodes_0_serialized[..];
2311-
let config = UserConfig::default();
2312-
nodes_0_deserialized = {
2313-
let mut channel_monitors = HashMap::new();
2314-
channel_monitors.insert(chan_0_monitor.get_funding_txo().0, &mut chan_0_monitor);
2315-
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
2316-
default_config: config,
2317-
keys_manager,
2318-
fee_estimator: node_cfgs[0].fee_estimator,
2319-
chain_monitor: nodes[0].chain_monitor,
2320-
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
2321-
logger: nodes[0].logger,
2322-
channel_monitors,
2323-
}).unwrap().1
2324-
};
2325-
nodes[0].node = &nodes_0_deserialized;
2326-
assert!(nodes_0_read.is_empty());
2327-
2328-
assert_eq!(nodes[0].chain_monitor.watch_channel(chan_0_monitor.get_funding_txo().0.clone(), chan_0_monitor),
2329-
ChannelMonitorUpdateStatus::Completed);
2330-
check_added_monitors!(nodes[0], 1);
2296+
let chan_0_monitor_serialized = get_monitor!(nodes[0], chan_id).encode();
2297+
reload_node!(nodes[0], &nodes[0].node.encode(), &[&chan_0_monitor_serialized], persister, new_chain_monitor, nodes_0_deserialized);
23312298
} else {
23322299
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
23332300
}
@@ -2832,28 +2799,7 @@ fn do_test_outbound_reload_without_init_mon(use_0conf: bool) {
28322799
nodes[0].chain_source.watched_txn.lock().unwrap().clear();
28332800
nodes[0].chain_source.watched_outputs.lock().unwrap().clear();
28342801

2835-
let nodes_0_serialized = nodes[0].node.encode();
2836-
persister = test_utils::TestPersister::new();
2837-
let keys_manager = &chanmon_cfgs[0].keys_manager;
2838-
new_chain_monitor = test_utils::TestChainMonitor::new(Some(nodes[0].chain_source), nodes[0].tx_broadcaster.clone(), nodes[0].logger, node_cfgs[0].fee_estimator, &persister, keys_manager);
2839-
nodes[0].chain_monitor = &new_chain_monitor;
2840-
2841-
let mut nodes_0_read = &nodes_0_serialized[..];
2842-
let config = UserConfig::default();
2843-
nodes_0_deserialized = {
2844-
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
2845-
default_config: config,
2846-
keys_manager,
2847-
fee_estimator: node_cfgs[0].fee_estimator,
2848-
chain_monitor: nodes[0].chain_monitor,
2849-
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
2850-
logger: nodes[0].logger,
2851-
channel_monitors: HashMap::new(),
2852-
}).unwrap().1
2853-
};
2854-
nodes[0].node = &nodes_0_deserialized;
2855-
assert!(nodes_0_read.is_empty());
2856-
2802+
reload_node!(nodes[0], &nodes[0].node.encode(), &[], persister, new_chain_monitor, nodes_0_deserialized);
28572803
check_closed_event!(nodes[0], 1, ClosureReason::DisconnectedPeer);
28582804
assert!(nodes[0].node.list_channels().is_empty());
28592805
}
@@ -2938,27 +2884,7 @@ fn do_test_inbound_reload_without_init_mon(use_0conf: bool, lock_commitment: boo
29382884
nodes[1].chain_source.watched_txn.lock().unwrap().clear();
29392885
nodes[1].chain_source.watched_outputs.lock().unwrap().clear();
29402886

2941-
let nodes_1_serialized = nodes[1].node.encode();
2942-
persister = test_utils::TestPersister::new();
2943-
let keys_manager = &chanmon_cfgs[1].keys_manager;
2944-
new_chain_monitor = test_utils::TestChainMonitor::new(Some(nodes[1].chain_source), nodes[1].tx_broadcaster.clone(), nodes[1].logger, node_cfgs[1].fee_estimator, &persister, keys_manager);
2945-
nodes[1].chain_monitor = &new_chain_monitor;
2946-
2947-
let mut nodes_1_read = &nodes_1_serialized[..];
2948-
let config = UserConfig::default();
2949-
nodes_1_deserialized = {
2950-
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut nodes_1_read, ChannelManagerReadArgs {
2951-
default_config: config,
2952-
keys_manager,
2953-
fee_estimator: node_cfgs[1].fee_estimator,
2954-
chain_monitor: nodes[1].chain_monitor,
2955-
tx_broadcaster: nodes[1].tx_broadcaster.clone(),
2956-
logger: nodes[1].logger,
2957-
channel_monitors: HashMap::new(),
2958-
}).unwrap().1
2959-
};
2960-
nodes[1].node = &nodes_1_deserialized;
2961-
assert!(nodes_1_read.is_empty());
2887+
reload_node!(nodes[1], &nodes[1].node.encode(), &[], persister, new_chain_monitor, nodes_1_deserialized);
29622888

29632889
check_closed_event!(nodes[1], 1, ClosureReason::DisconnectedPeer);
29642890
assert!(nodes[1].node.list_channels().is_empty());

lightning/src/ln/functional_test_utils.rs

+56
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ pub struct NodeCfg<'a> {
276276
pub struct Node<'a, 'b: 'a, 'c: 'b> {
277277
pub chain_source: &'c test_utils::TestChainSource,
278278
pub tx_broadcaster: &'c test_utils::TestBroadcaster,
279+
pub fee_estimator: &'c test_utils::TestFeeEstimator,
279280
pub chain_monitor: &'b test_utils::TestChainMonitor<'c>,
280281
pub keys_manager: &'b test_utils::TestKeysInterface,
281282
pub node: &'a ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestLogger>,
@@ -618,6 +619,60 @@ macro_rules! check_added_monitors {
618619
}
619620
}
620621

622+
pub fn _reload_node<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, default_config: UserConfig, chanman_encoded: &[u8], monitors_encoded: &[&[u8]]) -> ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestLogger> {
623+
let mut monitors_read = Vec::with_capacity(monitors_encoded.len());
624+
for encoded in monitors_encoded {
625+
let mut monitor_read = &encoded[..];
626+
let (_, monitor) = <(BlockHash, ChannelMonitor<EnforcingSigner>)>
627+
::read(&mut monitor_read, node.keys_manager).unwrap();
628+
assert!(monitor_read.is_empty());
629+
monitors_read.push(monitor);
630+
}
631+
632+
let mut node_read = &chanman_encoded[..];
633+
let (_, node_deserialized) = {
634+
let mut channel_monitors = HashMap::new();
635+
for monitor in monitors_read.iter_mut() {
636+
assert!(channel_monitors.insert(monitor.get_funding_txo().0, monitor).is_none());
637+
}
638+
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>)>::read(&mut node_read, ChannelManagerReadArgs {
639+
default_config,
640+
keys_manager: node.keys_manager,
641+
fee_estimator: node.fee_estimator,
642+
chain_monitor: node.chain_monitor,
643+
tx_broadcaster: node.tx_broadcaster,
644+
logger: node.logger,
645+
channel_monitors,
646+
}).unwrap()
647+
};
648+
assert!(node_read.is_empty());
649+
650+
for monitor in monitors_read.drain(..) {
651+
assert_eq!(node.chain_monitor.watch_channel(monitor.get_funding_txo().0, monitor),
652+
ChannelMonitorUpdateStatus::Completed);
653+
check_added_monitors!(node, 1);
654+
}
655+
656+
node_deserialized
657+
}
658+
659+
#[cfg(test)]
660+
macro_rules! reload_node {
661+
($node: expr, $new_config: expr, $chanman_encoded: expr, $monitors_encoded: expr, $persister: ident, $new_chain_monitor: ident, $new_channelmanager: ident) => {
662+
let chanman_encoded = $chanman_encoded;
663+
664+
$persister = test_utils::TestPersister::new();
665+
$new_chain_monitor = test_utils::TestChainMonitor::new(Some($node.chain_source), $node.tx_broadcaster.clone(), $node.logger, $node.fee_estimator, &$persister, &$node.keys_manager);
666+
$node.chain_monitor = &$new_chain_monitor;
667+
668+
$new_channelmanager = _reload_node(&$node, $new_config, &chanman_encoded, $monitors_encoded);
669+
$node.node = &$new_channelmanager;
670+
};
671+
($node: expr, $chanman_encoded: expr, $monitors_encoded: expr, $persister: ident, $new_chain_monitor: ident, $new_channelmanager: ident) => {
672+
reload_node!($node, $crate::util::config::UserConfig::default(), $chanman_encoded, $monitors_encoded, $persister, $new_chain_monitor, $new_channelmanager);
673+
};
674+
}
675+
621676
pub fn create_funding_transaction<'a, 'b, 'c>(node: &Node<'a, 'b, 'c>, expected_counterparty_node_id: &PublicKey, expected_chan_value: u64, expected_user_chan_id: u128) -> ([u8; 32], Transaction, OutPoint) {
622677
let chan_id = *node.network_chan_count.borrow();
623678

@@ -2126,6 +2181,7 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
21262181
let gossip_sync = P2PGossipSync::new(&cfgs[i].network_graph, None, cfgs[i].logger);
21272182
nodes.push(Node{
21282183
chain_source: cfgs[i].chain_source, tx_broadcaster: cfgs[i].tx_broadcaster,
2184+
fee_estimator: cfgs[i].fee_estimator,
21292185
chain_monitor: &cfgs[i].chain_monitor, keys_manager: &cfgs[i].keys_manager,
21302186
node: &chan_mgrs[i], network_graph: &cfgs[i].network_graph, gossip_sync,
21312187
node_seed: cfgs[i].node_seed, network_chan_count: chan_count.clone(),

0 commit comments

Comments
 (0)