Skip to content

Commit 22dc964

Browse files
authored
Merge pull request #1496 from TheBlueMatt/2022-05-macro-function-bonus
Make `expect_payment_failed_conditions` a function
2 parents 6e00c28 + 70acdf9 commit 22dc964

File tree

5 files changed

+75
-65
lines changed

5 files changed

+75
-65
lines changed

lightning/src/ln/functional_test_utils.rs

+59-49
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use chain::channelmonitor::ChannelMonitor;
1515
use chain::transaction::OutPoint;
1616
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
1717
use ln::channelmanager::{ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, PaymentId, MIN_CLTV_EXPIRY_DELTA};
18-
use routing::gossip::{P2PGossipSync, NetworkGraph};
18+
use routing::gossip::{P2PGossipSync, NetworkGraph, NetworkUpdate};
1919
use routing::router::{PaymentParameters, Route, get_route};
2020
use ln::features::{InitFeatures, InvoiceFeatures};
2121
use ln::msgs;
@@ -1466,8 +1466,10 @@ impl<'a> PaymentFailedConditions<'a> {
14661466
#[cfg(test)]
14671467
macro_rules! expect_payment_failed_with_update {
14681468
($node: expr, $expected_payment_hash: expr, $rejected_by_dest: expr, $scid: expr, $chan_closed: expr) => {
1469-
expect_payment_failed_conditions!($node, $expected_payment_hash, $rejected_by_dest,
1470-
$crate::ln::functional_test_utils::PaymentFailedConditions::new().blamed_scid($scid).blamed_chan_closed($chan_closed));
1469+
$crate::ln::functional_test_utils::expect_payment_failed_conditions(
1470+
&$node, $expected_payment_hash, $rejected_by_dest,
1471+
$crate::ln::functional_test_utils::PaymentFailedConditions::new()
1472+
.blamed_scid($scid).blamed_chan_closed($chan_closed));
14711473
}
14721474
}
14731475

@@ -1479,64 +1481,72 @@ macro_rules! expect_payment_failed {
14791481
$(
14801482
conditions = conditions.expected_htlc_error_data($expected_error_code, &$expected_error_data);
14811483
)*
1482-
expect_payment_failed_conditions!($node, $expected_payment_hash, $rejected_by_dest, conditions);
1484+
$crate::ln::functional_test_utils::expect_payment_failed_conditions(&$node, $expected_payment_hash, $rejected_by_dest, conditions);
14831485
};
14841486
}
14851487

1486-
#[cfg(test)]
1487-
macro_rules! expect_payment_failed_conditions {
1488-
($node: expr, $expected_payment_hash: expr, $rejected_by_dest: expr, $conditions: expr) => {
1489-
let events = $node.node.get_and_clear_pending_events();
1490-
assert_eq!(events.len(), 1);
1491-
let expected_payment_id = match events[0] {
1492-
Event::PaymentPathFailed { ref payment_hash, rejected_by_dest, ref error_code, ref error_data, ref path, ref retry, ref payment_id, ref network_update, .. } => {
1493-
assert_eq!(*payment_hash, $expected_payment_hash, "unexpected payment_hash");
1494-
assert_eq!(rejected_by_dest, $rejected_by_dest, "unexpected rejected_by_dest value");
1495-
assert!(retry.is_some(), "expected retry.is_some()");
1496-
assert_eq!(retry.as_ref().unwrap().final_value_msat, path.last().unwrap().fee_msat, "Retry amount should match last hop in path");
1497-
assert_eq!(retry.as_ref().unwrap().payment_params.payee_pubkey, path.last().unwrap().pubkey, "Retry payee node_id should match last hop in path");
1498-
1488+
pub fn expect_payment_failed_conditions<'a, 'b, 'c, 'd, 'e>(
1489+
node: &'a Node<'b, 'c, 'd>, expected_payment_hash: PaymentHash, expected_rejected_by_dest: bool,
1490+
conditions: PaymentFailedConditions<'e>
1491+
) {
1492+
let mut events = node.node.get_and_clear_pending_events();
1493+
assert_eq!(events.len(), 1);
1494+
let expected_payment_id = match events.pop().unwrap() {
1495+
Event::PaymentPathFailed { payment_hash, rejected_by_dest, path, retry, payment_id, network_update,
1496+
#[cfg(test)]
1497+
error_code,
1498+
#[cfg(test)]
1499+
error_data, .. } => {
1500+
assert_eq!(payment_hash, expected_payment_hash, "unexpected payment_hash");
1501+
assert_eq!(rejected_by_dest, expected_rejected_by_dest, "unexpected rejected_by_dest value");
1502+
assert!(retry.is_some(), "expected retry.is_some()");
1503+
assert_eq!(retry.as_ref().unwrap().final_value_msat, path.last().unwrap().fee_msat, "Retry amount should match last hop in path");
1504+
assert_eq!(retry.as_ref().unwrap().payment_params.payee_pubkey, path.last().unwrap().pubkey, "Retry payee node_id should match last hop in path");
1505+
1506+
#[cfg(test)]
1507+
{
14991508
assert!(error_code.is_some(), "expected error_code.is_some() = true");
15001509
assert!(error_data.is_some(), "expected error_data.is_some() = true");
1501-
if let Some((code, data)) = $conditions.expected_htlc_error_data {
1510+
if let Some((code, data)) = conditions.expected_htlc_error_data {
15021511
assert_eq!(error_code.unwrap(), code, "unexpected error code");
15031512
assert_eq!(&error_data.as_ref().unwrap()[..], data, "unexpected error data");
15041513
}
1514+
}
15051515

1506-
if let Some(chan_closed) = $conditions.expected_blamed_chan_closed {
1507-
match network_update {
1508-
&Some($crate::routing::gossip::NetworkUpdate::ChannelUpdateMessage { ref msg }) if !chan_closed => {
1509-
if let Some(scid) = $conditions.expected_blamed_scid {
1510-
assert_eq!(msg.contents.short_channel_id, scid);
1511-
}
1512-
assert_eq!(msg.contents.flags & 2, 0);
1513-
},
1514-
&Some($crate::routing::gossip::NetworkUpdate::ChannelFailure { short_channel_id, is_permanent }) if chan_closed => {
1515-
if let Some(scid) = $conditions.expected_blamed_scid {
1516-
assert_eq!(short_channel_id, scid);
1517-
}
1518-
assert!(is_permanent);
1519-
},
1520-
Some(_) => panic!("Unexpected update type"),
1521-
None => panic!("Expected update"),
1522-
}
1516+
if let Some(chan_closed) = conditions.expected_blamed_chan_closed {
1517+
match network_update {
1518+
Some(NetworkUpdate::ChannelUpdateMessage { ref msg }) if !chan_closed => {
1519+
if let Some(scid) = conditions.expected_blamed_scid {
1520+
assert_eq!(msg.contents.short_channel_id, scid);
1521+
}
1522+
const CHAN_DISABLED_FLAG: u8 = 2;
1523+
assert_eq!(msg.contents.flags & CHAN_DISABLED_FLAG, 0);
1524+
},
1525+
Some(NetworkUpdate::ChannelFailure { short_channel_id, is_permanent }) if chan_closed => {
1526+
if let Some(scid) = conditions.expected_blamed_scid {
1527+
assert_eq!(short_channel_id, scid);
1528+
}
1529+
assert!(is_permanent);
1530+
},
1531+
Some(_) => panic!("Unexpected update type"),
1532+
None => panic!("Expected update"),
15231533
}
1534+
}
15241535

1525-
payment_id.unwrap()
1526-
},
1527-
_ => panic!("Unexpected event"),
1528-
};
1529-
if !$conditions.expected_mpp_parts_remain {
1530-
$node.node.abandon_payment(expected_payment_id);
1531-
let events = $node.node.get_and_clear_pending_events();
1532-
assert_eq!(events.len(), 1);
1533-
match events[0] {
1534-
Event::PaymentFailed { ref payment_hash, ref payment_id } => {
1535-
assert_eq!(*payment_hash, $expected_payment_hash, "unexpected second payment_hash");
1536-
assert_eq!(*payment_id, expected_payment_id);
1537-
}
1538-
_ => panic!("Unexpected second event"),
1536+
payment_id.unwrap()
1537+
},
1538+
_ => panic!("Unexpected event"),
1539+
};
1540+
if !conditions.expected_mpp_parts_remain {
1541+
node.node.abandon_payment(expected_payment_id);
1542+
let events = node.node.get_and_clear_pending_events();
1543+
assert_eq!(events.len(), 1);
1544+
match events[0] {
1545+
Event::PaymentFailed { ref payment_hash, ref payment_id } => {
1546+
assert_eq!(*payment_hash, expected_payment_hash, "unexpected second payment_hash");
1547+
assert_eq!(*payment_id, expected_payment_id);
15391548
}
1549+
_ => panic!("Unexpected second event"),
15401550
}
15411551
}
15421552
}

lightning/src/ln/functional_tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9727,7 +9727,7 @@ fn do_test_dup_htlc_second_rejected(test_for_second_fail_panic: bool) {
97279727
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &fail_updates_1.update_fail_htlcs[0]);
97289728
commitment_signed_dance!(nodes[0], nodes[1], fail_updates_1.commitment_signed, false);
97299729

9730-
expect_payment_failed_conditions!(nodes[0], our_payment_hash, true, PaymentFailedConditions::new().mpp_parts_remain());
9730+
expect_payment_failed_conditions(&nodes[0], our_payment_hash, true, PaymentFailedConditions::new().mpp_parts_remain());
97319731

97329732
claim_payment(&nodes[0], &[&nodes[1]], our_payment_preimage);
97339733
}
@@ -9832,7 +9832,7 @@ fn test_inconsistent_mpp_params() {
98329832
nodes[0].node.handle_update_fail_htlc(&nodes[2].node.get_our_node_id(), &fail_updates_2.update_fail_htlcs[0]);
98339833
commitment_signed_dance!(nodes[0], nodes[2], fail_updates_2.commitment_signed, false);
98349834

9835-
expect_payment_failed_conditions!(nodes[0], our_payment_hash, true, PaymentFailedConditions::new().mpp_parts_remain());
9835+
expect_payment_failed_conditions(&nodes[0], our_payment_hash, true, PaymentFailedConditions::new().mpp_parts_remain());
98369836

98379837
nodes[0].node.send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None).unwrap();
98389838
check_added_monitors!(nodes[0], 1);

lightning/src/ln/onion_route_tests.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ fn test_phantom_onion_hmac_failure() {
854854
.blamed_scid(phantom_scid)
855855
.blamed_chan_closed(true)
856856
.expected_htlc_error_data(0x8000 | 0x4000 | 5, &sha256_of_onion);
857-
expect_payment_failed_conditions!(nodes[0], payment_hash, false, fail_conditions);
857+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, fail_conditions);
858858
}
859859

860860
#[test]
@@ -927,7 +927,7 @@ fn test_phantom_invalid_onion_payload() {
927927
.blamed_scid(phantom_scid)
928928
.blamed_chan_closed(true)
929929
.expected_htlc_error_data(0x4000 | 22, &error_data);
930-
expect_payment_failed_conditions!(nodes[0], payment_hash, true, fail_conditions);
930+
expect_payment_failed_conditions(&nodes[0], payment_hash, true, fail_conditions);
931931
}
932932

933933
#[test]
@@ -983,7 +983,7 @@ fn test_phantom_final_incorrect_cltv_expiry() {
983983
let mut fail_conditions = PaymentFailedConditions::new()
984984
.blamed_scid(phantom_scid)
985985
.expected_htlc_error_data(18, &error_data);
986-
expect_payment_failed_conditions!(nodes[0], payment_hash, false, fail_conditions);
986+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, fail_conditions);
987987
}
988988

989989
#[test]
@@ -1028,7 +1028,7 @@ fn test_phantom_failure_too_low_cltv() {
10281028
let mut fail_conditions = PaymentFailedConditions::new()
10291029
.blamed_scid(phantom_scid)
10301030
.expected_htlc_error_data(17, &error_data);
1031-
expect_payment_failed_conditions!(nodes[0], payment_hash, false, fail_conditions);
1031+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, fail_conditions);
10321032
}
10331033

10341034
#[test]
@@ -1076,7 +1076,7 @@ fn test_phantom_failure_too_low_recv_amt() {
10761076
let mut fail_conditions = PaymentFailedConditions::new()
10771077
.blamed_scid(phantom_scid)
10781078
.expected_htlc_error_data(0x4000 | 15, &error_data);
1079-
expect_payment_failed_conditions!(nodes[0], payment_hash, true, fail_conditions);
1079+
expect_payment_failed_conditions(&nodes[0], payment_hash, true, fail_conditions);
10801080
}
10811081

10821082
#[test]
@@ -1123,7 +1123,7 @@ fn test_phantom_dust_exposure_failure() {
11231123
.blamed_scid(channel.0.contents.short_channel_id)
11241124
.blamed_chan_closed(false)
11251125
.expected_htlc_error_data(0x1000 | 7, &err_data);
1126-
expect_payment_failed_conditions!(nodes[0], payment_hash, false, fail_conditions);
1126+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, fail_conditions);
11271127
}
11281128

11291129
#[test]
@@ -1174,5 +1174,5 @@ fn test_phantom_failure_reject_payment() {
11741174
let mut fail_conditions = PaymentFailedConditions::new()
11751175
.blamed_scid(phantom_scid)
11761176
.expected_htlc_error_data(0x4000 | 15, &error_data);
1177-
expect_payment_failed_conditions!(nodes[0], payment_hash, true, fail_conditions);
1177+
expect_payment_failed_conditions(&nodes[0], payment_hash, true, fail_conditions);
11781178
}

lightning/src/ln/payment_tests.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ fn retry_single_path_payment() {
7070
check_added_monitors!(nodes[1], 1);
7171
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &htlc_updates.update_fail_htlcs[0]);
7272
commitment_signed_dance!(nodes[0], nodes[1], htlc_updates.commitment_signed, false);
73-
expect_payment_failed_conditions!(nodes[0], payment_hash, false, PaymentFailedConditions::new().mpp_parts_remain());
73+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, PaymentFailedConditions::new().mpp_parts_remain());
7474

7575
// Rebalance the channel so the retry succeeds.
7676
send_payment(&nodes[2], &vec!(&nodes[1])[..], 3_000_000);
@@ -173,7 +173,7 @@ fn mpp_retry() {
173173
check_added_monitors!(nodes[2], 1);
174174
nodes[0].node.handle_update_fail_htlc(&nodes[2].node.get_our_node_id(), &htlc_updates.update_fail_htlcs[0]);
175175
commitment_signed_dance!(nodes[0], nodes[2], htlc_updates.commitment_signed, false);
176-
expect_payment_failed_conditions!(nodes[0], payment_hash, false, PaymentFailedConditions::new().mpp_parts_remain());
176+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, PaymentFailedConditions::new().mpp_parts_remain());
177177

178178
// Rebalance the channel so the second half of the payment can succeed.
179179
send_payment(&nodes[3], &vec!(&nodes[2])[..], 1_500_000);
@@ -251,7 +251,7 @@ fn do_mpp_receive_timeout(send_partial_mpp: bool) {
251251
check_added_monitors!(nodes[1], 1);
252252
commitment_signed_dance!(nodes[0], nodes[1], htlc_fail_updates_1_0.commitment_signed, false);
253253

254-
expect_payment_failed_conditions!(nodes[0], payment_hash, false, PaymentFailedConditions::new().mpp_parts_remain().expected_htlc_error_data(23, &[][..]));
254+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, PaymentFailedConditions::new().mpp_parts_remain().expected_htlc_error_data(23, &[][..]));
255255
} else {
256256
// Pass half of the payment along the second path.
257257
pass_along_path(&nodes[0], &[&nodes[2], &nodes[3]], 200_000, payment_hash, Some(payment_secret), events.remove(0), true, None);
@@ -521,7 +521,7 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
521521
confirm_transaction(&nodes[0], &first_htlc_timeout_tx);
522522
}
523523
nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().clear();
524-
expect_payment_failed_conditions!(nodes[0], payment_hash, false, PaymentFailedConditions::new().mpp_parts_remain());
524+
expect_payment_failed_conditions(&nodes[0], payment_hash, false, PaymentFailedConditions::new().mpp_parts_remain());
525525

526526
// Finally, retry the payment (which was reloaded from the ChannelMonitor when nodes[0] was
527527
// reloaded) via a route over the new channel, which work without issue and eventually be

lightning/src/ln/priv_short_conf_tests.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ fn test_inbound_scid_privacy() {
460460
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &updates.update_fail_htlcs[0]);
461461
commitment_signed_dance!(nodes[0], nodes[1], updates.commitment_signed, false);
462462

463-
expect_payment_failed_conditions!(nodes[0], payment_hash_2, false,
463+
expect_payment_failed_conditions(&nodes[0], payment_hash_2, false,
464464
PaymentFailedConditions::new().blamed_scid(last_hop[0].short_channel_id.unwrap())
465465
.blamed_chan_closed(true).expected_htlc_error_data(0x4000|10, &[0; 0]));
466466
}
@@ -537,7 +537,7 @@ fn test_scid_alias_returned() {
537537
err_data.extend_from_slice(&ChannelUpdate::TYPE.to_be_bytes());
538538
err_data.extend_from_slice(&msg.encode());
539539

540-
expect_payment_failed_conditions!(nodes[0], payment_hash, false,
540+
expect_payment_failed_conditions(&nodes[0], payment_hash, false,
541541
PaymentFailedConditions::new().blamed_scid(last_hop[0].inbound_scid_alias.unwrap())
542542
.blamed_chan_closed(false).expected_htlc_error_data(0x1000|7, &err_data));
543543

@@ -560,7 +560,7 @@ fn test_scid_alias_returned() {
560560
err_data.extend_from_slice(&(msg.serialized_length() as u16 + 2).to_be_bytes());
561561
err_data.extend_from_slice(&ChannelUpdate::TYPE.to_be_bytes());
562562
err_data.extend_from_slice(&msg.encode());
563-
expect_payment_failed_conditions!(nodes[0], payment_hash, false,
563+
expect_payment_failed_conditions(&nodes[0], payment_hash, false,
564564
PaymentFailedConditions::new().blamed_scid(last_hop[0].inbound_scid_alias.unwrap())
565565
.blamed_chan_closed(false).expected_htlc_error_data(0x1000|12, &err_data));
566566
}

0 commit comments

Comments
 (0)