@@ -4084,6 +4084,34 @@ fn test_no_txn_manager_serialize_deserialize() {
4084
4084
send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 1000000 ) ;
4085
4085
}
4086
4086
4087
+ #[ test]
4088
+ fn mpp_failure ( ) {
4089
+ let chanmon_cfgs = create_chanmon_cfgs ( 4 ) ;
4090
+ let node_cfgs = create_node_cfgs ( 4 , & chanmon_cfgs) ;
4091
+ let node_chanmgrs = create_node_chanmgrs ( 4 , & node_cfgs, & [ None , None , None , None ] ) ;
4092
+ let nodes = create_network ( 4 , & node_cfgs, & node_chanmgrs) ;
4093
+
4094
+ let chan_1_id = create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 0 . contents . short_channel_id ;
4095
+ let chan_2_id = create_announced_chan_between_nodes ( & nodes, 0 , 2 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 0 . contents . short_channel_id ;
4096
+ let chan_3_id = create_announced_chan_between_nodes ( & nodes, 1 , 3 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 0 . contents . short_channel_id ;
4097
+ let chan_4_id = create_announced_chan_between_nodes ( & nodes, 2 , 3 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 0 . contents . short_channel_id ;
4098
+ let logger = test_utils:: TestLogger :: new ( ) ;
4099
+
4100
+ let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ! ( & nodes[ 3 ] ) ;
4101
+ let net_graph_msg_handler = & nodes[ 0 ] . net_graph_msg_handler ;
4102
+ let mut route = get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , & net_graph_msg_handler. network_graph , & nodes[ 3 ] . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None , & [ ] , 100000 , TEST_FINAL_CLTV , & logger) . unwrap ( ) ;
4103
+ let path = route. paths [ 0 ] . clone ( ) ;
4104
+ route. paths . push ( path) ;
4105
+ route. paths [ 0 ] [ 0 ] . pubkey = nodes[ 1 ] . node . get_our_node_id ( ) ;
4106
+ route. paths [ 0 ] [ 0 ] . short_channel_id = chan_1_id;
4107
+ route. paths [ 0 ] [ 1 ] . short_channel_id = chan_3_id;
4108
+ route. paths [ 1 ] [ 0 ] . pubkey = nodes[ 2 ] . node . get_our_node_id ( ) ;
4109
+ route. paths [ 1 ] [ 0 ] . short_channel_id = chan_2_id;
4110
+ route. paths [ 1 ] [ 1 ] . short_channel_id = chan_4_id;
4111
+ send_along_route_with_secret ( & nodes[ 0 ] , route, & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] , 200_000 , payment_hash, payment_secret) ;
4112
+ fail_payment_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] , false , payment_hash) ;
4113
+ }
4114
+
4087
4115
#[ test]
4088
4116
fn test_dup_htlc_onchain_fails_on_reload ( ) {
4089
4117
// When a Channel is closed, any outbound HTLCs which were relayed through it are simply
@@ -5914,9 +5942,10 @@ fn test_fail_holding_cell_htlc_upon_free() {
5914
5942
let events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
5915
5943
assert_eq ! ( events. len( ) , 1 ) ;
5916
5944
match & events[ 0 ] {
5917
- & Event :: PaymentFailed { ref payment_hash, ref rejected_by_dest, ref network_update, ref error_code, ref error_data } => {
5945
+ & Event :: PaymentFailed { ref payment_hash, ref rejected_by_dest, ref network_update, ref error_code, ref error_data, ref all_paths_failed } => {
5918
5946
assert_eq ! ( our_payment_hash. clone( ) , * payment_hash) ;
5919
5947
assert_eq ! ( * rejected_by_dest, false ) ;
5948
+ assert_eq ! ( * all_paths_failed, true ) ;
5920
5949
assert_eq ! ( * network_update, None ) ;
5921
5950
assert_eq ! ( * error_code, None ) ;
5922
5951
assert_eq ! ( * error_data, None ) ;
@@ -6000,9 +6029,10 @@ fn test_free_and_fail_holding_cell_htlcs() {
6000
6029
let events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
6001
6030
assert_eq ! ( events. len( ) , 1 ) ;
6002
6031
match & events[ 0 ] {
6003
- & Event :: PaymentFailed { ref payment_hash, ref rejected_by_dest, ref network_update, ref error_code, ref error_data } => {
6032
+ & Event :: PaymentFailed { ref payment_hash, ref rejected_by_dest, ref network_update, ref error_code, ref error_data, ref all_paths_failed } => {
6004
6033
assert_eq ! ( payment_hash_2. clone( ) , * payment_hash) ;
6005
6034
assert_eq ! ( * rejected_by_dest, false ) ;
6035
+ assert_eq ! ( * all_paths_failed, true ) ;
6006
6036
assert_eq ! ( * network_update, None ) ;
6007
6037
assert_eq ! ( * error_code, None ) ;
6008
6038
assert_eq ! ( * error_data, None ) ;
0 commit comments