@@ -2078,6 +2078,25 @@ pub fn expect_channel_ready_event<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, ex
2078
2078
}
2079
2079
}
2080
2080
2081
+ #[ cfg( any( test, feature = "_test_utils" ) ) ]
2082
+ pub fn expect_probe_successful_events ( node : & Node , probe_results : Vec < ( PaymentHash , PaymentId ) > ) {
2083
+ let mut events = node. node . get_and_clear_pending_events ( ) ;
2084
+
2085
+ assert_eq ! ( events. len( ) , probe_results. len( ) ) ;
2086
+ for ( idx, event) in events. drain ( ..) . enumerate ( ) {
2087
+ let ( payment_hash, payment_id) = probe_results[ idx] ;
2088
+ match event {
2089
+ Event :: ProbeSuccessful { payment_id : ev_pid, payment_hash : ev_ph, ..} => {
2090
+ assert_eq ! ( payment_id, ev_pid) ;
2091
+ assert_eq ! ( payment_hash, ev_ph) ;
2092
+ } ,
2093
+ _ => panic ! ( ) ,
2094
+ }
2095
+ } ;
2096
+
2097
+ assert ! ( !node. node. has_pending_payments( ) ) ;
2098
+ }
2099
+
2081
2100
pub struct PaymentFailedConditions < ' a > {
2082
2101
pub ( crate ) expected_htlc_error_data : Option < ( u16 , & ' a [ u8 ] ) > ,
2083
2102
pub ( crate ) expected_blamed_scid : Option < u64 > ,
@@ -2215,6 +2234,67 @@ pub fn send_along_route_with_secret<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>,
2215
2234
payment_id
2216
2235
}
2217
2236
2237
+ pub fn fail_payment_along_path < ' a , ' b , ' c > ( expected_path : & [ & Node < ' a , ' b , ' c > ] ) {
2238
+ let origin_node_id = expected_path[ 0 ] . node . get_our_node_id ( ) ;
2239
+
2240
+ // iterate from the receiving node to the origin node and handle update fail htlc.
2241
+ for ( & node, & prev_node) in expected_path. iter ( ) . rev ( ) . zip ( expected_path. iter ( ) . rev ( ) . skip ( 1 ) ) {
2242
+ let updates = get_htlc_update_msgs ! ( node, prev_node. node. get_our_node_id( ) ) ;
2243
+ prev_node. node . handle_update_fail_htlc ( & node. node . get_our_node_id ( ) , & updates. update_fail_htlcs [ 0 ] ) ;
2244
+ check_added_monitors ! ( prev_node, 0 ) ;
2245
+
2246
+ if origin_node_id == prev_node. node . get_our_node_id ( ) {
2247
+ commitment_signed_dance ! ( prev_node, node, updates. commitment_signed, false ) ;
2248
+ } else {
2249
+ commitment_signed_dance ! ( prev_node, node, updates. commitment_signed, true ) ;
2250
+ }
2251
+ }
2252
+ }
2253
+
2254
+ pub fn pass_probe_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & [ & Node < ' a , ' b , ' c > ] ] ) {
2255
+ let mut events = origin_node. node . get_and_clear_pending_msg_events ( ) ;
2256
+ assert_eq ! ( events. len( ) , expected_route. len( ) ) ;
2257
+
2258
+ check_added_monitors ! ( origin_node, expected_route. len( ) ) ;
2259
+ for path in expected_route. iter ( ) {
2260
+ let ev = remove_first_msg_event_to_node ( & path[ 0 ] . node . get_our_node_id ( ) , & mut events) ;
2261
+
2262
+ pass_probe_along_path ( origin_node, path, ev) ;
2263
+ let nodes_to_fail_payment: Vec < _ > = vec ! [ origin_node] . into_iter ( ) . chain ( path. iter ( ) . cloned ( ) ) . collect ( ) ;
2264
+
2265
+ fail_payment_along_path ( nodes_to_fail_payment. as_slice ( ) ) ;
2266
+ }
2267
+ }
2268
+
2269
+
2270
+ pub fn pass_probe_along_path < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_path : & [ & Node < ' a , ' b , ' c > ] , ev : MessageSendEvent ) {
2271
+ let mut payment_event = SendEvent :: from_event ( ev) ;
2272
+ let mut prev_node = origin_node;
2273
+
2274
+ for ( idx, & node) in expected_path. iter ( ) . enumerate ( ) {
2275
+ assert_eq ! ( node. node. get_our_node_id( ) , payment_event. node_id) ;
2276
+
2277
+ node. node . handle_update_add_htlc ( & prev_node. node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
2278
+ check_added_monitors ! ( node, 0 ) ;
2279
+
2280
+ if idx != expected_path. len ( ) - 1 {
2281
+ commitment_signed_dance ! ( node, prev_node, payment_event. commitment_msg, false ) ;
2282
+ expect_pending_htlcs_forwardable ! ( node) ;
2283
+
2284
+ let mut events = node. node . get_and_clear_pending_msg_events ( ) ;
2285
+ assert_eq ! ( events. len( ) , 1 ) ;
2286
+ payment_event = SendEvent :: from_event ( events. remove ( 0 ) ) ;
2287
+ assert_eq ! ( payment_event. msgs. len( ) , 1 ) ;
2288
+ check_added_monitors ! ( node, 1 ) ;
2289
+ } else {
2290
+ commitment_signed_dance ! ( node, prev_node, payment_event. commitment_msg, true , true ) ;
2291
+ }
2292
+
2293
+
2294
+ prev_node = node;
2295
+ }
2296
+ }
2297
+
2218
2298
pub fn do_pass_along_path < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_path : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 , our_payment_hash : PaymentHash , our_payment_secret : Option < PaymentSecret > , ev : MessageSendEvent , payment_claimable_expected : bool , clear_recipient_events : bool , expected_preimage : Option < PaymentPreimage > ) -> Option < Event > {
2219
2299
let mut payment_event = SendEvent :: from_event ( ev) ;
2220
2300
let mut prev_node = origin_node;
0 commit comments