@@ -7926,6 +7926,76 @@ fn test_can_not_accept_unknown_inbound_channel() {
79267926 }
79277927}
79287928
7929+ fn do_test_overshoot_mpp ( msat_amounts : & [ u64 ] , total_msat : u64 ) {
7930+
7931+ let routing_node_count = msat_amounts. len ( ) ;
7932+ let node_count = routing_node_count + 2 ;
7933+
7934+ let chanmon_cfgs = create_chanmon_cfgs ( node_count) ;
7935+ let node_cfgs = create_node_cfgs ( node_count, & chanmon_cfgs) ;
7936+ let node_chanmgrs = create_node_chanmgrs ( node_count, & node_cfgs, & vec ! [ None ; node_count] ) ;
7937+ let nodes = create_network ( node_count, & node_cfgs, & node_chanmgrs) ;
7938+
7939+ let src_idx = 0 ;
7940+ let dst_idx = 1 ;
7941+
7942+ // Create channels for each amount
7943+ let mut expected_paths = Vec :: with_capacity ( routing_node_count) ;
7944+ let mut src_chan_ids = Vec :: with_capacity ( routing_node_count) ;
7945+ let mut dst_chan_ids = Vec :: with_capacity ( routing_node_count) ;
7946+ for i in 0 ..routing_node_count {
7947+ let routing_node = 2 + i;
7948+ let src_chan_id = create_announced_chan_between_nodes ( & nodes, src_idx, routing_node) . 0 . contents . short_channel_id ;
7949+ src_chan_ids. push ( src_chan_id) ;
7950+ let dst_chan_id = create_announced_chan_between_nodes ( & nodes, routing_node, dst_idx) . 0 . contents . short_channel_id ;
7951+ dst_chan_ids. push ( dst_chan_id) ;
7952+ let path = vec ! [ & nodes[ routing_node] , & nodes[ dst_idx] ] ;
7953+ expected_paths. push ( path) ;
7954+ }
7955+ let expected_paths: Vec < & [ & Node ] > = expected_paths. iter ( ) . map ( |route| route. as_slice ( ) ) . collect ( ) ;
7956+
7957+ // Create a route for each amount
7958+ let example_amount = 100000 ;
7959+ let ( mut route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash ! ( & nodes[ src_idx] , nodes[ dst_idx] , example_amount) ;
7960+ let sample_path = route. paths . pop ( ) . unwrap ( ) ;
7961+ for i in 0 ..routing_node_count {
7962+ let routing_node = 2 + i;
7963+ let mut path = sample_path. clone ( ) ;
7964+ path[ 0 ] . pubkey = nodes[ routing_node] . node . get_our_node_id ( ) ;
7965+ path[ 0 ] . short_channel_id = src_chan_ids[ i] ;
7966+ path[ 1 ] . pubkey = nodes[ dst_idx] . node . get_our_node_id ( ) ;
7967+ path[ 1 ] . short_channel_id = dst_chan_ids[ i] ;
7968+ path[ 1 ] . fee_msat = msat_amounts[ i] ;
7969+ route. paths . push ( path) ;
7970+ }
7971+
7972+ // Send payment with manually set total_msat
7973+ let payment_id = PaymentId ( nodes[ src_idx] . keys_manager . backing . get_secure_random_bytes ( ) ) ;
7974+ let onion_session_privs = nodes[ src_idx] . node . test_add_new_pending_payment ( our_payment_hash, Some ( our_payment_secret) , payment_id, & route) . unwrap ( ) ;
7975+ nodes[ src_idx] . node . test_send_payment_internal ( & route, our_payment_hash, & Some ( our_payment_secret) , None , payment_id, Some ( total_msat) , onion_session_privs) . unwrap ( ) ;
7976+ check_added_monitors ! ( nodes[ src_idx] , expected_paths. len( ) ) ;
7977+
7978+ let mut events = nodes[ src_idx] . node . get_and_clear_pending_msg_events ( ) ;
7979+ assert_eq ! ( events. len( ) , expected_paths. len( ) ) ;
7980+ let mut amount_received = 0 ;
7981+ for ( path_idx, expected_path) in expected_paths. iter ( ) . enumerate ( ) {
7982+ let ev = remove_first_msg_event_to_node ( & expected_path[ 0 ] . node . get_our_node_id ( ) , & mut events) ;
7983+
7984+ let current_path_amount = msat_amounts[ path_idx] ;
7985+ amount_received += current_path_amount;
7986+ let became_claimable_now = amount_received >= total_msat && amount_received - current_path_amount < total_msat;
7987+ pass_along_path ( & nodes[ src_idx] , expected_path, amount_received, our_payment_hash. clone ( ) , Some ( our_payment_secret) , ev, became_claimable_now, None ) ;
7988+ }
7989+
7990+ claim_payment_along_route ( & nodes[ src_idx] , & expected_paths, false , our_payment_preimage) ;
7991+ }
7992+
7993+ #[ test]
7994+ fn test_overshoot_mpp ( ) {
7995+ do_test_overshoot_mpp ( & [ 100_000 , 101_000 ] , 200_000 ) ;
7996+ do_test_overshoot_mpp ( & [ 100_000 , 10_000 , 100_000 ] , 200_000 ) ;
7997+ }
7998+
79297999#[ test]
79308000fn test_simple_mpp ( ) {
79318001 // Simple test of sending a multi-path payment.
0 commit comments