@@ -7926,6 +7926,76 @@ fn test_can_not_accept_unknown_inbound_channel() {
7926
7926
}
7927
7927
}
7928
7928
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
+
7929
7999
#[ test]
7930
8000
fn test_simple_mpp ( ) {
7931
8001
// Simple test of sending a multi-path payment.
0 commit comments