@@ -1130,7 +1130,7 @@ macro_rules! commitment_signed_dance {
1130
1130
{
1131
1131
commitment_signed_dance!( $node_a, $node_b, $commitment_signed, $fail_backwards, true ) ;
1132
1132
if $fail_backwards {
1133
- $crate :: expect_pending_htlcs_forwardable!( $node_a) ;
1133
+ expect_pending_htlcs_forwardable!( $node_a, PaymentForwardedFailedConditions :: new ( ) . payment_forwarding_failed ( ) ) ;
1134
1134
check_added_monitors!( $node_a, 1 ) ;
1135
1135
1136
1136
let channel_state = $node_a. node. channel_state. lock( ) . unwrap( ) ;
@@ -1191,24 +1191,81 @@ macro_rules! get_route_and_payment_hash {
1191
1191
} }
1192
1192
}
1193
1193
1194
+ pub struct PaymentForwardedFailedConditions {
1195
+ pub expected_pending_htlcs_forwardable : bool ,
1196
+ pub expected_payment_forwarding_failed : Option < u32 > ,
1197
+ }
1198
+
1199
+ impl PaymentForwardedFailedConditions {
1200
+ pub fn new ( ) -> Self {
1201
+ Self {
1202
+ expected_pending_htlcs_forwardable : false ,
1203
+ expected_payment_forwarding_failed : None ,
1204
+ }
1205
+ }
1206
+
1207
+ pub fn pending_htlcs_forwardable ( mut self ) -> Self {
1208
+ self . expected_pending_htlcs_forwardable = true ;
1209
+ self
1210
+ }
1211
+
1212
+ pub fn payment_forwarding_failed ( mut self ) -> Self {
1213
+ self . expected_payment_forwarding_failed = Some ( 1 ) ;
1214
+ self
1215
+ }
1216
+
1217
+ pub fn payment_forwarding_failed_with_count ( mut self , count : u32 ) -> Self {
1218
+ self . expected_payment_forwarding_failed = Some ( count) ;
1219
+ self
1220
+ }
1221
+ }
1222
+
1194
1223
#[ macro_export]
1195
- /// Clears (and ignores) a PendingHTLCsForwardable event
1196
- macro_rules! expect_pending_htlcs_forwardable_ignore {
1197
- ( $node: expr) => { {
1224
+ macro_rules! expect_pending_htlcs_forwardable_conditions {
1225
+ ( $node: expr, $conditions: expr) => { {
1198
1226
let events = $node. node. get_and_clear_pending_events( ) ;
1199
- assert_eq!( events. len( ) , 1 ) ;
1200
1227
match events[ 0 ] {
1201
1228
$crate:: util:: events:: Event :: PendingHTLCsForwardable { .. } => { } ,
1202
1229
_ => panic!( "Unexpected event" ) ,
1203
1230
} ;
1231
+
1232
+ if let Some ( count) = $conditions. expected_payment_forwarding_failed {
1233
+ assert_eq!( events. len( ) as u32 , count + 1u32 ) ;
1234
+ match events[ 1 ] {
1235
+ $crate:: util:: events:: Event :: PaymentForwardedFailed { .. } => { } ,
1236
+ _ => panic!( "Unexpected event" ) ,
1237
+ }
1238
+ } else {
1239
+ assert_eq!( events. len( ) , 1 ) ;
1240
+ }
1241
+ } }
1242
+ }
1243
+
1244
+ #[ macro_export]
1245
+ /// Clears (and ignores) a PendingHTLCsForwardable event
1246
+ macro_rules! expect_pending_htlcs_forwardable_ignore {
1247
+ ( $node: expr) => { {
1248
+ expect_pending_htlcs_forwardable_conditions!( $node, $crate:: ln:: functional_test_utils:: PaymentForwardedFailedConditions :: new( ) ) ;
1249
+ } } ;
1250
+
1251
+ ( $node: expr, $conditions: expr) => { {
1252
+ expect_pending_htlcs_forwardable_conditions!( $node, $conditions) ;
1204
1253
} }
1205
1254
}
1206
1255
1207
1256
#[ macro_export]
1208
1257
/// Handles a PendingHTLCsForwardable event
1209
1258
macro_rules! expect_pending_htlcs_forwardable {
1210
1259
( $node: expr) => { {
1211
- $crate:: expect_pending_htlcs_forwardable_ignore!( $node) ;
1260
+ expect_pending_htlcs_forwardable_ignore!( $node) ;
1261
+ $node. node. process_pending_htlc_forwards( ) ;
1262
+
1263
+ // Ensure process_pending_htlc_forwards is idempotent.
1264
+ $node. node. process_pending_htlc_forwards( ) ;
1265
+ } } ;
1266
+
1267
+ ( $node: expr, $conditions: expr) => { {
1268
+ expect_pending_htlcs_forwardable_ignore!( $node, $conditions) ;
1212
1269
$node. node. process_pending_htlc_forwards( ) ;
1213
1270
1214
1271
// Ensure process_pending_htlc_forwards is idempotent.
@@ -1219,6 +1276,8 @@ macro_rules! expect_pending_htlcs_forwardable {
1219
1276
#[ cfg( test) ]
1220
1277
macro_rules! expect_pending_htlcs_forwardable_from_events {
1221
1278
( $node: expr, $events: expr, $ignore: expr) => { {
1279
+ // We need to clear pending events since there may possibly be `PaymentForwardingFailed` events here
1280
+ $node. node. get_and_clear_pending_events( ) ;
1222
1281
assert_eq!( $events. len( ) , 1 ) ;
1223
1282
match $events[ 0 ] {
1224
1283
Event :: PendingHTLCsForwardable { .. } => { } ,
@@ -1692,7 +1751,8 @@ pub fn fail_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expe
1692
1751
assert_eq ! ( path. last( ) . unwrap( ) . node. get_our_node_id( ) , expected_paths[ 0 ] . last( ) . unwrap( ) . node. get_our_node_id( ) ) ;
1693
1752
}
1694
1753
assert ! ( expected_paths[ 0 ] . last( ) . unwrap( ) . node. fail_htlc_backwards( & our_payment_hash) ) ;
1695
- expect_pending_htlcs_forwardable ! ( expected_paths[ 0 ] . last( ) . unwrap( ) ) ;
1754
+
1755
+ expect_pending_htlcs_forwardable ! ( expected_paths[ 0 ] . last( ) . unwrap( ) , PaymentForwardedFailedConditions :: new( ) . payment_forwarding_failed_with_count( expected_paths. len( ) as u32 ) ) ;
1696
1756
check_added_monitors ! ( expected_paths[ 0 ] . last( ) . unwrap( ) , expected_paths. len( ) ) ;
1697
1757
1698
1758
let mut per_path_msgs: Vec < ( ( msgs:: UpdateFailHTLC , msgs:: CommitmentSigned ) , PublicKey ) > = Vec :: with_capacity ( expected_paths. len ( ) ) ;
@@ -1727,7 +1787,7 @@ pub fn fail_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expe
1727
1787
node. node . handle_update_fail_htlc ( & prev_node. node . get_our_node_id ( ) , & next_msgs. as_ref ( ) . unwrap ( ) . 0 ) ;
1728
1788
commitment_signed_dance ! ( node, prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , update_next_node) ;
1729
1789
if !update_next_node {
1730
- expect_pending_htlcs_forwardable ! ( node) ;
1790
+ expect_pending_htlcs_forwardable ! ( node, PaymentForwardedFailedConditions :: new ( ) . payment_forwarding_failed ( ) ) ;
1731
1791
}
1732
1792
}
1733
1793
let events = node. node . get_and_clear_pending_msg_events ( ) ;
0 commit comments