Skip to content

Commit 70acdf9

Browse files
committed
Make expect_payment_failed_conditions a function
This reduces macro generated code in tests a good bit, and moves us one step further away from using macros everywhere when we don't need to.
1 parent 8e5cf75 commit 70acdf9

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;
@@ -1467,8 +1467,10 @@ impl<'a> PaymentFailedConditions<'a> {
14671467
#[cfg(test)]
14681468
macro_rules! expect_payment_failed_with_update {
14691469
($node: expr, $expected_payment_hash: expr, $rejected_by_dest: expr, $scid: expr, $chan_closed: expr) => {
1470-
expect_payment_failed_conditions!($node, $expected_payment_hash, $rejected_by_dest,
1471-
$crate::ln::functional_test_utils::PaymentFailedConditions::new().blamed_scid($scid).blamed_chan_closed($chan_closed));
1470+
$crate::ln::functional_test_utils::expect_payment_failed_conditions(
1471+
&$node, $expected_payment_hash, $rejected_by_dest,
1472+
$crate::ln::functional_test_utils::PaymentFailedConditions::new()
1473+
.blamed_scid($scid).blamed_chan_closed($chan_closed));
14721474
}
14731475
}
14741476

@@ -1480,64 +1482,72 @@ macro_rules! expect_payment_failed {
14801482
$(
14811483
conditions = conditions.expected_htlc_error_data($expected_error_code, &$expected_error_data);
14821484
)*
1483-
expect_payment_failed_conditions!($node, $expected_payment_hash, $rejected_by_dest, conditions);
1485+
$crate::ln::functional_test_utils::expect_payment_failed_conditions(&$node, $expected_payment_hash, $rejected_by_dest, conditions);
14841486
};
14851487
}
14861488

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

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

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

lightning/src/ln/functional_tests.rs

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

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

97309730
claim_payment(&nodes[0], &[&nodes[1]], our_payment_preimage);
97319731
}
@@ -9830,7 +9830,7 @@ fn test_inconsistent_mpp_params() {
98309830
nodes[0].node.handle_update_fail_htlc(&nodes[2].node.get_our_node_id(), &fail_updates_2.update_fail_htlcs[0]);
98319831
commitment_signed_dance!(nodes[0], nodes[2], fail_updates_2.commitment_signed, false);
98329832

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

98359835
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();
98369836
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)