Skip to content

Commit 4d1462b

Browse files
committed
Add persistence test for htlc in the LocalRemoved state
Increase coverage and prepare for attributable failures which are going to extend the update_fail_htlc message with an additional field that needs to be persisted as well.
1 parent eaeed77 commit 4d1462b

File tree

2 files changed

+81
-4
lines changed

2 files changed

+81
-4
lines changed

lightning/src/ln/channelmanager.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -14834,7 +14834,7 @@ mod tests {
1483414834
use crate::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
1483514835
use crate::ln::types::ChannelId;
1483614836
use crate::types::payment::{PaymentPreimage, PaymentHash, PaymentSecret};
14837-
use crate::ln::channelmanager::{create_recv_pending_htlc_info, inbound_payment, ChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
14837+
use crate::ln::channelmanager::{RAACommitmentOrder, create_recv_pending_htlc_info, inbound_payment, ChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
1483814838
use crate::ln::functional_test_utils::*;
1483914839
use crate::ln::msgs::{self, AcceptChannel, ErrorAction};
1484014840
use crate::ln::msgs::ChannelMessageHandler;
@@ -15054,8 +15054,8 @@ mod tests {
1505415054
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
1505515055

1505615056
create_announced_chan_between_nodes(&nodes, 0, 1);
15057-
15058-
// Since we do not send peer storage, we manually simulate receiving a dummy
15057+
15058+
// Since we do not send peer storage, we manually simulate receiving a dummy
1505915059
// `PeerStorage` from the channel partner.
1506015060
nodes[0].node.handle_peer_storage(nodes[1].node.get_our_node_id(), msgs::PeerStorage{data: vec![0; 100]});
1506115061

lightning/src/ln/reload_tests.rs

+78-1
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
use crate::chain::{ChannelMonitorUpdateStatus, Watch};
1313
use crate::chain::chaininterface::LowerBoundedFeeEstimator;
1414
use crate::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdateStep};
15+
use crate::routing::router::{PaymentParameters, RouteParameters};
1516
use crate::sign::EntropySource;
1617
use crate::chain::transaction::OutPoint;
1718
use crate::events::{ClosureReason, Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider};
18-
use crate::ln::channelmanager::{ChannelManager, ChannelManagerReadArgs, PaymentId, RecipientOnionFields};
19+
use crate::ln::channelmanager::{ChannelManager, ChannelManagerReadArgs, PaymentId, RecipientOnionFields, RAACommitmentOrder};
1920
use crate::ln::msgs;
2021
use crate::ln::types::ChannelId;
2122
use crate::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler, ErrorAction};
@@ -27,6 +28,7 @@ use crate::util::config::UserConfig;
2728

2829
use bitcoin::hashes::Hash;
2930
use bitcoin::hash_types::BlockHash;
31+
use types::payment::{PaymentHash, PaymentPreimage};
3032

3133
use crate::prelude::*;
3234

@@ -1286,3 +1288,78 @@ fn test_reload_partial_funding_batch() {
12861288
// Ensure the channels don't exist anymore.
12871289
assert!(nodes[0].node.list_channels().is_empty());
12881290
}
1291+
1292+
#[test]
1293+
fn test_htlc_localremoved_persistence() {
1294+
// Tests that if we fail an htlc back (update_fail_htlc message) and then restart the node, the node will resend the
1295+
// exact same fail message.
1296+
let chanmon_cfgs: Vec<TestChanMonCfg> = create_chanmon_cfgs(2);
1297+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
1298+
1299+
let persister;
1300+
let chain_monitor;
1301+
let deserialized_chanmgr;
1302+
1303+
// Send a keysend payment that fails because of a preimage mismatch.
1304+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
1305+
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
1306+
1307+
let payer_pubkey = nodes[0].node.get_our_node_id();
1308+
let payee_pubkey = nodes[1].node.get_our_node_id();
1309+
1310+
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1]);
1311+
let route_params = RouteParameters::from_payment_params_and_value(
1312+
PaymentParameters::for_keysend(payee_pubkey, 40, false), 10_000);
1313+
let network_graph = nodes[0].network_graph;
1314+
let first_hops = nodes[0].node.list_usable_channels();
1315+
let scorer = test_utils::TestScorer::new();
1316+
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
1317+
let route = find_route(
1318+
&nodes[0], &route_params
1319+
).unwrap();
1320+
1321+
let test_preimage = PaymentPreimage([42; 32]);
1322+
let mismatch_payment_hash = PaymentHash([43; 32]);
1323+
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash,
1324+
RecipientOnionFields::spontaneous_empty(), PaymentId(mismatch_payment_hash.0), &route).unwrap();
1325+
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash,
1326+
RecipientOnionFields::spontaneous_empty(), Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
1327+
check_added_monitors!(nodes[0], 1);
1328+
1329+
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
1330+
nodes[1].node.handle_update_add_htlc(nodes[0].node.get_our_node_id(), &updates.update_add_htlcs[0]);
1331+
commitment_signed_dance!(nodes[1], nodes[0], &updates.commitment_signed, false);
1332+
expect_pending_htlcs_forwardable!(nodes[1]);
1333+
expect_htlc_handling_failed_destinations!(nodes[1].node.get_and_clear_pending_events(), &[HTLCDestination::FailedPayment { payment_hash: mismatch_payment_hash }]);
1334+
check_added_monitors(&nodes[1], 1);
1335+
1336+
// Save the update_fail_htlc message for later comparison.
1337+
let msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
1338+
let htlc_fail_msg = msgs.update_fail_htlcs[0].clone();
1339+
1340+
// Reload nodes.
1341+
nodes[0].node.peer_disconnected(nodes[1].node.get_our_node_id());
1342+
nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
1343+
1344+
let monitor_encoded = get_monitor!(nodes[1], _chan.3).encode();
1345+
reload_node!(nodes[1], nodes[1].node.encode(), &[&monitor_encoded], persister, chain_monitor, deserialized_chanmgr);
1346+
1347+
nodes[0].node.peer_connected(nodes[1].node.get_our_node_id(), &msgs::Init {
1348+
features: nodes[1].node.init_features(), networks: None, remote_network_address: None
1349+
}, true).unwrap();
1350+
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
1351+
assert_eq!(reestablish_1.len(), 1);
1352+
nodes[1].node.peer_connected(nodes[0].node.get_our_node_id(), &msgs::Init {
1353+
features: nodes[0].node.init_features(), networks: None, remote_network_address: None
1354+
}, false).unwrap();
1355+
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
1356+
assert_eq!(reestablish_2.len(), 1);
1357+
nodes[0].node.handle_channel_reestablish(nodes[1].node.get_our_node_id(), &reestablish_2[0]);
1358+
handle_chan_reestablish_msgs!(nodes[0], nodes[1]);
1359+
nodes[1].node.handle_channel_reestablish(nodes[0].node.get_our_node_id(), &reestablish_1[0]);
1360+
1361+
// Assert that same failure message is resent after reload.
1362+
let msgs = handle_chan_reestablish_msgs!(nodes[1], nodes[0]);
1363+
let htlc_fail_msg_after_reload = msgs.2.unwrap().update_fail_htlcs[0].clone();
1364+
assert_eq!(htlc_fail_msg, htlc_fail_msg_after_reload);
1365+
}

0 commit comments

Comments
 (0)