Skip to content

Commit 6688991

Browse files
committed
Simplify node reload logic in tests
Store the latest persisted monitor in TestChainMonitor so it no longer needs to be passed into reload. This change also makes the test more realistic. If the monitor wasn't actually persisted, it won't reload properly.
1 parent 7439528 commit 6688991

File tree

7 files changed

+60
-44
lines changed

7 files changed

+60
-44
lines changed

lightning/src/ln/async_payments_tests.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2167,8 +2167,7 @@ fn offer_cache_round_trip_ser() {
21672167
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
21682168
let payee_node_deserialized;
21692169
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
2170-
let chan_id =
2171-
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0).0.channel_id;
2170+
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0);
21722171
let server = &nodes[0];
21732172
let recipient = &nodes[1];
21742173

@@ -2188,12 +2187,10 @@ fn offer_cache_round_trip_ser() {
21882187
// offers.
21892188
let cached_offers_pre_ser = recipient.node.flow.test_get_async_receive_offers();
21902189
let config = test_default_channel_config();
2191-
let serialized_monitor = get_monitor!(recipient, chan_id).encode();
2192-
reload_node!(
2190+
reload_node_and_monitors!(
21932191
nodes[1],
21942192
config,
21952193
recipient.node.encode(),
2196-
&[&serialized_monitor],
21972194
persister,
21982195
chain_monitor,
21992196
payee_node_deserialized

lightning/src/ln/channelmanager.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19066,10 +19066,9 @@ mod tests {
1906619066
*chanmgr_fwd_htlcs = forward_htlcs.clone();
1906719067
core::mem::drop(chanmgr_fwd_htlcs);
1906819068

19069-
reload_node!(nodes[0], nodes[0].node.encode(), &[], persister, chain_monitor, deserialized_chanmgr);
19069+
reload_node_and_monitors!(nodes[0], nodes[0].node.encode(), persister, chain_monitor, deserialized_chanmgr);
1907019070

19071-
let mut deserialized_fwd_htlcs = nodes[0].node.forward_htlcs.lock().unwrap();
19072-
for scid in [scid_1, scid_2].iter() {
19071+
let mut deserialized_fwd_htlcs = nodes[0].node.forward_htlcs.lock().unwrap(); for scid in [scid_1, scid_2].iter() {
1907319072
let deserialized_htlcs = deserialized_fwd_htlcs.remove(scid).unwrap();
1907419073
assert_eq!(forward_htlcs.remove(scid).unwrap(), deserialized_htlcs);
1907519074
}

lightning/src/ln/functional_test_utils.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,38 @@ macro_rules! reload_node {
13821382
};
13831383
}
13841384

1385+
#[cfg(test)]
1386+
macro_rules! reload_node_and_monitors {
1387+
($node: expr, $new_config: expr, $chanman_encoded: expr, $persister: ident, $new_chain_monitor: ident, $new_channelmanager: ident) => {
1388+
let monitors_serialized = {
1389+
let monitor_map = $node.chain_monitor.persisted_monitors.lock().unwrap();
1390+
monitor_map.values().cloned().collect::<Vec<_>>()
1391+
};
1392+
let monitors_serialized_ref: Vec<&[u8]> =
1393+
monitors_serialized.iter().map(|v| v.as_slice()).collect();
1394+
1395+
reload_node!(
1396+
$node,
1397+
$new_config,
1398+
$chanman_encoded,
1399+
&monitors_serialized_ref,
1400+
$persister,
1401+
$new_chain_monitor,
1402+
$new_channelmanager
1403+
);
1404+
};
1405+
($node: expr, $chanman_encoded: expr, $persister: ident, $new_chain_monitor: ident, $new_channelmanager: ident) => {
1406+
reload_node_and_monitors!(
1407+
$node,
1408+
$crate::util::config::UserConfig::default(),
1409+
$chanman_encoded,
1410+
$persister,
1411+
$new_chain_monitor,
1412+
$new_channelmanager
1413+
);
1414+
};
1415+
}
1416+
13851417
pub fn create_funding_transaction<'a, 'b, 'c>(
13861418
node: &Node<'a, 'b, 'c>, expected_counterparty_node_id: &PublicKey, expected_chan_value: u64,
13871419
expected_user_chan_id: u128,

lightning/src/ln/monitor_tests.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3244,7 +3244,7 @@ fn test_event_replay_causing_monitor_replay() {
32443244
let node_deserialized;
32453245
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
32463246

3247-
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000);
3247+
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000);
32483248

32493249
let payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 1_000_000).0;
32503250

@@ -3262,9 +3262,7 @@ fn test_event_replay_causing_monitor_replay() {
32623262
expect_payment_sent(&nodes[0], payment_preimage, None, true, true /* expected post-event monitor update*/);
32633263
assert!(nodes[0].node.get_and_clear_needs_persistence());
32643264

3265-
let serialized_monitor = get_monitor!(nodes[0], chan.2).encode();
3266-
reload_node!(nodes[0], &serialized_channel_manager, &[&serialized_monitor], persister, new_chain_monitor, node_deserialized);
3267-
3265+
reload_node_and_monitors!(nodes[0], &serialized_channel_manager, persister, new_chain_monitor, node_deserialized);
32683266
// Expect the `PaymentSent` to get replayed, this time without the duplicate monitor update
32693267
expect_payment_sent(&nodes[0], payment_preimage, None, false, false /* expected post-event monitor update*/);
32703268
}
@@ -3363,7 +3361,7 @@ fn test_claim_event_never_handled() {
33633361

33643362
let init_node_ser = nodes[1].node.encode();
33653363

3366-
let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
3364+
create_announced_chan_between_nodes(&nodes, 0, 1);
33673365

33683366
// Send the payment we'll ultimately test the PaymentClaimed event for.
33693367
let (preimage_a, payment_hash_a, ..) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
@@ -3392,10 +3390,7 @@ fn test_claim_event_never_handled() {
33923390

33933391
// Finally, reload node B with an empty `ChannelManager` and check that we get the
33943392
// `PaymentClaimed` event.
3395-
let chan_0_monitor_serialized = get_monitor!(nodes[1], chan.2).encode();
3396-
let mons = &[&chan_0_monitor_serialized[..]];
3397-
reload_node!(nodes[1], &init_node_ser, mons, persister, new_chain_mon, nodes_1_reload);
3398-
3393+
reload_node_and_monitors!(nodes[1], &init_node_ser, persister, new_chain_mon, nodes_1_reload);
33993394
expect_payment_claimed!(nodes[1], payment_hash_a, 1_000_000);
34003395
// The reload logic spuriously generates a redundant payment preimage-containing
34013396
// `ChannelMonitorUpdate`.

lightning/src/ln/payment_tests.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2613,7 +2613,7 @@ fn do_automatic_retries(test: AutoRetry) {
26132613
let node_b_id = nodes[1].node.get_our_node_id();
26142614
let node_c_id = nodes[2].node.get_our_node_id();
26152615

2616-
let channel_id_1 = create_announced_chan_between_nodes(&nodes, 0, 1).2;
2616+
create_announced_chan_between_nodes(&nodes, 0, 1);
26172617
let channel_id_2 = create_announced_chan_between_nodes(&nodes, 2, 1).2;
26182618

26192619
// Marshall data to send the payment
@@ -2801,8 +2801,7 @@ fn do_automatic_retries(test: AutoRetry) {
28012801

28022802
// Restart the node and ensure that ChannelManager does not use its remaining retry attempt
28032803
let node_encoded = nodes[0].node.encode();
2804-
let mon_ser = get_monitor!(nodes[0], channel_id_1).encode();
2805-
reload_node!(nodes[0], node_encoded, &[&mon_ser], persister, chain_monitor, node_a_reload);
2804+
reload_node_and_monitors!(nodes[0], node_encoded, persister, chain_monitor, node_a_reload);
28062805

28072806
nodes[0].node.process_pending_htlc_forwards();
28082807
// Make sure we don't retry again.

lightning/src/ln/reload_tests.rs

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,9 @@ fn test_funding_peer_disconnect() {
9393
nodes[1].node.handle_channel_reestablish(nodes[0].node.get_our_node_id(), &as_reestablish);
9494
let events_4 = nodes[1].node.get_and_clear_pending_msg_events();
9595
assert_eq!(events_4.len(), 3);
96-
let chan_id;
9796
let bs_channel_ready = match events_4[0] {
9897
MessageSendEvent::SendChannelReady { ref node_id, ref msg } => {
9998
assert_eq!(*node_id, nodes[0].node.get_our_node_id());
100-
chan_id = msg.channel_id;
10199
msg.clone()
102100
},
103101
_ => panic!("Unexpected event {:?}", events_4[0]),
@@ -183,9 +181,7 @@ fn test_funding_peer_disconnect() {
183181
// channel_announcement from the cached signatures.
184182
nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
185183

186-
let chan_0_monitor_serialized = get_monitor!(nodes[0], chan_id).encode();
187-
188-
reload_node!(nodes[0], &nodes[0].node.encode(), &[&chan_0_monitor_serialized], persister, new_chain_monitor, nodes_0_deserialized);
184+
reload_node_and_monitors!(nodes[0], &nodes[0].node.encode(), persister, new_chain_monitor, nodes_0_deserialized);
189185

190186
reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
191187
}
@@ -205,10 +201,7 @@ fn test_no_txn_manager_serialize_deserialize() {
205201

206202
nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
207203

208-
let chan_0_monitor_serialized =
209-
get_monitor!(nodes[0], ChannelId::v1_from_funding_outpoint(OutPoint { txid: tx.compute_txid(), index: 0 })).encode();
210-
reload_node!(nodes[0], nodes[0].node.encode(), &[&chan_0_monitor_serialized], persister, new_chain_monitor, nodes_0_deserialized);
211-
204+
reload_node_and_monitors!(nodes[0], nodes[0].node.encode(), persister, new_chain_monitor, nodes_0_deserialized);
212205
nodes[0].node.peer_connected(nodes[1].node.get_our_node_id(), &msgs::Init {
213206
features: nodes[1].node.init_features(), networks: None, remote_network_address: None
214207
}, true).unwrap();
@@ -291,11 +284,9 @@ fn test_manager_serialize_deserialize_events() {
291284
nodes.push(node_b);
292285

293286
// Start the de/seriailization process mid-channel creation to check that the channel manager will hold onto events that are serialized
294-
let chan_0_monitor_serialized = get_monitor!(nodes[0], bs_funding_signed.channel_id).encode();
295-
reload_node!(nodes[0], nodes[0].node.encode(), &[&chan_0_monitor_serialized], persister, new_chain_monitor, nodes_0_deserialized);
287+
reload_node_and_monitors!(nodes[0], nodes[0].node.encode(), persister, new_chain_monitor, nodes_0_deserialized);
296288

297289
nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
298-
299290
// After deserializing, make sure the funding_transaction is still held by the channel manager
300291
let events_4 = nodes[0].node.get_and_clear_pending_events();
301292
assert_eq!(events_4.len(), 0);
@@ -341,15 +332,14 @@ fn test_simple_manager_serialize_deserialize() {
341332
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
342333
let nodes_0_deserialized;
343334
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
344-
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
335+
create_announced_chan_between_nodes(&nodes, 0, 1);
345336

346337
let (our_payment_preimage, ..) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
347338
let (_, our_payment_hash, ..) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
348339

349340
nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
350341

351-
let chan_0_monitor_serialized = get_monitor!(nodes[0], chan_id).encode();
352-
reload_node!(nodes[0], nodes[0].node.encode(), &[&chan_0_monitor_serialized], persister, new_chain_monitor, nodes_0_deserialized);
342+
reload_node_and_monitors!(nodes[0], nodes[0].node.encode(), persister, new_chain_monitor, nodes_0_deserialized);
353343

354344
reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
355345

@@ -1112,7 +1102,7 @@ fn removed_payment_no_manager_persistence() {
11121102

11131103
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
11141104

1115-
let chan_id_1 = create_announced_chan_between_nodes(&nodes, 0, 1).2;
1105+
create_announced_chan_between_nodes(&nodes, 0, 1);
11161106
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2).2;
11171107

11181108
let (_, payment_hash, ..) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
@@ -1135,9 +1125,7 @@ fn removed_payment_no_manager_persistence() {
11351125
_ => panic!("Unexpected event"),
11361126
}
11371127

1138-
let chan_0_monitor_serialized = get_monitor!(nodes[1], chan_id_1).encode();
1139-
let chan_1_monitor_serialized = get_monitor!(nodes[1], chan_id_2).encode();
1140-
reload_node!(nodes[1], node_encoded, &[&chan_0_monitor_serialized, &chan_1_monitor_serialized], persister, new_chain_monitor, nodes_1_deserialized);
1128+
reload_node_and_monitors!(nodes[1], node_encoded, persister, new_chain_monitor, nodes_1_deserialized);
11411129

11421130
match nodes[1].node.pop_pending_event().unwrap() {
11431131
Event::ChannelClosed { ref reason, .. } => {
@@ -1206,8 +1194,7 @@ fn test_reload_partial_funding_batch() {
12061194
// Reload the node while a subset of the channels in the funding batch have persisted monitors.
12071195
let channel_id_1 = ChannelId::v1_from_funding_outpoint(OutPoint { txid: tx.compute_txid(), index: 0 });
12081196
let node_encoded = nodes[0].node.encode();
1209-
let channel_monitor_1_serialized = get_monitor!(nodes[0], channel_id_1).encode();
1210-
reload_node!(nodes[0], node_encoded, &[&channel_monitor_1_serialized], new_persister, new_chain_monitor, new_channel_manager);
1197+
reload_node_and_monitors!(nodes[0], node_encoded, new_persister, new_chain_monitor, new_channel_manager);
12111198

12121199
// Process monitor events.
12131200
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
@@ -1283,8 +1270,7 @@ fn test_htlc_localremoved_persistence() {
12831270
nodes[0].node.peer_disconnected(nodes[1].node.get_our_node_id());
12841271
nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
12851272

1286-
let monitor_encoded = get_monitor!(nodes[1], _chan.3).encode();
1287-
reload_node!(nodes[1], nodes[1].node.encode(), &[&monitor_encoded], persister, chain_monitor, deserialized_chanmgr);
1273+
reload_node_and_monitors!(nodes[1], nodes[1].node.encode(), persister, chain_monitor, deserialized_chanmgr);
12881274

12891275
nodes[0].node.peer_connected(nodes[1].node.get_our_node_id(), &msgs::Init {
12901276
features: nodes[1].node.init_features(), networks: None, remote_network_address: None
@@ -1419,4 +1405,3 @@ fn test_peer_storage() {
14191405
let res = std::panic::catch_unwind(|| drop(nodes));
14201406
assert!(res.is_err());
14211407
}
1422-

lightning/src/util/test_utils.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,8 @@ pub struct TestChainMonitor<'a> {
486486
pub expect_monitor_round_trip_fail: Mutex<Option<ChannelId>>,
487487
#[cfg(feature = "std")]
488488
pub write_blocker: Mutex<Option<std::sync::mpsc::Receiver<()>>>,
489+
/// The latest persisted monitor for each channel.
490+
pub persisted_monitors: Mutex<HashMap<ChannelId, Vec<u8>>>,
489491
}
490492
impl<'a> TestChainMonitor<'a> {
491493
pub fn new(
@@ -511,6 +513,7 @@ impl<'a> TestChainMonitor<'a> {
511513
expect_monitor_round_trip_fail: Mutex::new(None),
512514
#[cfg(feature = "std")]
513515
write_blocker: Mutex::new(None),
516+
persisted_monitors: Mutex::new(new_hash_map()),
514517
}
515518
}
516519

@@ -564,6 +567,9 @@ impl<'a> chain::Watch<TestChannelSigner> for TestChainMonitor<'a> {
564567
// monitor to a serialized copy and get he same one back.
565568
let mut w = TestVecWriter(Vec::new());
566569
monitor.write(&mut w).unwrap();
570+
571+
self.persisted_monitors.lock().unwrap().insert(channel_id, w.0.clone());
572+
567573
let new_monitor = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
568574
&mut io::Cursor::new(&w.0),
569575
(self.keys_manager, self.keys_manager),
@@ -620,6 +626,9 @@ impl<'a> chain::Watch<TestChannelSigner> for TestChainMonitor<'a> {
620626
let monitor = self.chain_monitor.get_monitor(channel_id).unwrap();
621627
w.0.clear();
622628
monitor.write(&mut w).unwrap();
629+
630+
self.persisted_monitors.lock().unwrap().insert(channel_id, w.0.clone());
631+
623632
let new_monitor = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
624633
&mut io::Cursor::new(&w.0),
625634
(self.keys_manager, self.keys_manager),

0 commit comments

Comments
 (0)