Skip to content

Commit 48aef2d

Browse files
committed
Add test_fail_htlc_backwards_with_reason
Add a test for newly added function failing back a basic payment and ensuring the intended failure code and data are sent back to the peer.
1 parent 95892e3 commit 48aef2d

File tree

1 file changed

+68
-1
lines changed

1 file changed

+68
-1
lines changed

lightning/src/ln/onion_route_tests.rs

+68-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::chain::channelmonitor::{CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCK
1515
use crate::chain::keysinterface::{EntropySource, NodeSigner, Recipient};
1616
use crate::ln::{PaymentHash, PaymentSecret};
1717
use crate::ln::channel::EXPIRE_PREV_CONFIG_TICKS;
18-
use crate::ln::channelmanager::{HTLCForwardInfo, CLTV_FAR_FAR_AWAY, MIN_CLTV_EXPIRY_DELTA, PendingAddHTLCInfo, PendingHTLCInfo, PendingHTLCRouting, PaymentId};
18+
use crate::ln::channelmanager::{HTLCForwardInfo, FailureCode, CLTV_FAR_FAR_AWAY, MIN_CLTV_EXPIRY_DELTA, PendingAddHTLCInfo, PendingHTLCInfo, PendingHTLCRouting, PaymentId};
1919
use crate::ln::onion_utils;
2020
use crate::routing::gossip::{NetworkUpdate, RoutingFees};
2121
use crate::routing::router::{get_route, PaymentParameters, Route, RouteHint, RouteHintHop};
@@ -831,6 +831,73 @@ fn test_always_create_tlv_format_onion_payloads() {
831831
}
832832
}
833833

834+
fn do_test_fail_htlc_backwards_with_reason(failure_code: FailureCode) {
835+
836+
let chanmon_cfgs = create_chanmon_cfgs(2);
837+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
838+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
839+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
840+
841+
create_announced_chan_between_nodes(&nodes, 0, 1);
842+
843+
let payment_amount = 100_000;
844+
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], payment_amount);
845+
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
846+
check_added_monitors!(nodes[0], 1);
847+
848+
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
849+
let mut payment_event = SendEvent::from_event(events.pop().unwrap());
850+
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &payment_event.msgs[0]);
851+
commitment_signed_dance!(nodes[1], nodes[0], payment_event.commitment_msg, false);
852+
853+
expect_pending_htlcs_forwardable!(nodes[1]);
854+
expect_payment_claimable!(nodes[1], payment_hash, payment_secret, payment_amount);
855+
nodes[1].node.fail_htlc_backwards_with_reason(&payment_hash, &failure_code);
856+
857+
expect_pending_htlcs_forwardable_and_htlc_handling_failed!(nodes[1], vec![HTLCDestination::FailedPayment { payment_hash: payment_hash }]);
858+
check_added_monitors!(nodes[1], 1);
859+
860+
let events = nodes[1].node.get_and_clear_pending_msg_events();
861+
assert_eq!(events.len(), 1);
862+
let (update_fail_htlc, commitment_signed) = match events[0] {
863+
MessageSendEvent::UpdateHTLCs { node_id: _ , updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
864+
assert!(update_add_htlcs.is_empty());
865+
assert!(update_fulfill_htlcs.is_empty());
866+
assert_eq!(update_fail_htlcs.len(), 1);
867+
assert!(update_fail_malformed_htlcs.is_empty());
868+
assert!(update_fee.is_none());
869+
(update_fail_htlcs[0].clone(), commitment_signed)
870+
},
871+
_ => panic!("Unexpected event"),
872+
};
873+
874+
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &update_fail_htlc);
875+
commitment_signed_dance!(nodes[0], nodes[1], commitment_signed, false, true);
876+
877+
let failure_data = match failure_code {
878+
FailureCode::TemporaryNodeFailure => vec![],
879+
FailureCode::RequiredNodeFeatureMissing => vec![],
880+
FailureCode::IncorrectOrUnknownPaymentDetails => {
881+
let mut htlc_msat_height_data = (payment_amount as u64).to_be_bytes().to_vec();
882+
htlc_msat_height_data.extend_from_slice(&CHAN_CONFIRM_DEPTH.to_be_bytes());
883+
htlc_msat_height_data
884+
}
885+
};
886+
887+
let failure_code = failure_code as u16;
888+
let permanent_flag = 0x4000;
889+
let permanent_fail = (failure_code & permanent_flag) != 0;
890+
expect_payment_failed!(nodes[0], payment_hash, permanent_fail, failure_code, failure_data);
891+
892+
}
893+
894+
#[test]
895+
fn test_fail_htlc_backwards_with_reason() {
896+
do_test_fail_htlc_backwards_with_reason(FailureCode::TemporaryNodeFailure);
897+
do_test_fail_htlc_backwards_with_reason(FailureCode::RequiredNodeFeatureMissing);
898+
do_test_fail_htlc_backwards_with_reason(FailureCode::IncorrectOrUnknownPaymentDetails);
899+
}
900+
834901
macro_rules! get_phantom_route {
835902
($nodes: expr, $amt: expr, $channel: expr) => {{
836903
let phantom_pubkey = $nodes[1].keys_manager.get_node_id(Recipient::PhantomNode).unwrap();

0 commit comments

Comments
 (0)