@@ -2742,7 +2742,7 @@ mod tests {
2742
2742
( our_payment_preimage, our_payment_hash)
2743
2743
}
2744
2744
2745
- fn claim_payment ( origin_node : & Node , expected_route : & [ & Node ] , our_payment_preimage : [ u8 ; 32 ] ) {
2745
+ fn claim_payment_along_route ( origin_node : & Node , expected_route : & [ & Node ] , skip_last : bool , our_payment_preimage : [ u8 ; 32 ] ) {
2746
2746
assert ! ( expected_route. last( ) . unwrap( ) . node. claim_funds( our_payment_preimage) ) ;
2747
2747
{
2748
2748
let mut added_monitors = expected_route. last ( ) . unwrap ( ) . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
@@ -2771,40 +2771,51 @@ mod tests {
2771
2771
2772
2772
let mut expected_next_node = expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) ;
2773
2773
let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
2774
- for node in expected_route. iter ( ) . rev ( ) {
2774
+ for ( idx , node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) {
2775
2775
assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
2776
2776
if next_msgs. is_some ( ) {
2777
2777
update_fulfill_dance ! ( node, prev_node, false ) ;
2778
2778
}
2779
2779
2780
2780
let events = node. node . get_and_clear_pending_events ( ) ;
2781
+ if !skip_last || idx != expected_route. len ( ) - 1 {
2782
+ assert_eq ! ( events. len( ) , 1 ) ;
2783
+ match events[ 0 ] {
2784
+ Event :: UpdateHTLCs { ref node_id, updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref commitment_signed } } => {
2785
+ assert ! ( update_add_htlcs. is_empty( ) ) ;
2786
+ assert_eq ! ( update_fulfill_htlcs. len( ) , 1 ) ;
2787
+ assert ! ( update_fail_htlcs. is_empty( ) ) ;
2788
+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
2789
+ expected_next_node = node_id. clone ( ) ;
2790
+ next_msgs = Some ( ( update_fulfill_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
2791
+ } ,
2792
+ _ => panic ! ( "Unexpected event" ) ,
2793
+ }
2794
+ } else {
2795
+ assert ! ( events. is_empty( ) ) ;
2796
+ }
2797
+ if !skip_last && idx == expected_route. len ( ) - 1 {
2798
+ assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
2799
+ }
2800
+
2801
+ prev_node = node;
2802
+ }
2803
+
2804
+ if !skip_last {
2805
+ update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
2806
+ let events = origin_node. node . get_and_clear_pending_events ( ) ;
2781
2807
assert_eq ! ( events. len( ) , 1 ) ;
2782
2808
match events[ 0 ] {
2783
- Event :: UpdateHTLCs { ref node_id, updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref commitment_signed } } => {
2784
- assert ! ( update_add_htlcs. is_empty( ) ) ;
2785
- assert_eq ! ( update_fulfill_htlcs. len( ) , 1 ) ;
2786
- assert ! ( update_fail_htlcs. is_empty( ) ) ;
2787
- assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
2788
- expected_next_node = node_id. clone ( ) ;
2789
- next_msgs = Some ( ( update_fulfill_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
2809
+ Event :: PaymentSent { payment_preimage } => {
2810
+ assert_eq ! ( payment_preimage, our_payment_preimage) ;
2790
2811
} ,
2791
2812
_ => panic ! ( "Unexpected event" ) ,
2792
- } ;
2793
-
2794
- prev_node = node;
2813
+ }
2795
2814
}
2815
+ }
2796
2816
2797
- assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
2798
- update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
2799
-
2800
- let events = origin_node. node . get_and_clear_pending_events ( ) ;
2801
- assert_eq ! ( events. len( ) , 1 ) ;
2802
- match events[ 0 ] {
2803
- Event :: PaymentSent { payment_preimage } => {
2804
- assert_eq ! ( payment_preimage, our_payment_preimage) ;
2805
- } ,
2806
- _ => panic ! ( "Unexpected event" ) ,
2807
- }
2817
+ fn claim_payment ( origin_node : & Node , expected_route : & [ & Node ] , our_payment_preimage : [ u8 ; 32 ] ) {
2818
+ claim_payment_along_route ( origin_node, expected_route, false , our_payment_preimage) ;
2808
2819
}
2809
2820
2810
2821
const TEST_FINAL_CLTV : u32 = 32 ;
@@ -2848,7 +2859,7 @@ mod tests {
2848
2859
claim_payment ( & origin, expected_route, our_payment_preimage) ;
2849
2860
}
2850
2861
2851
- fn fail_payment ( origin_node : & Node , expected_route : & [ & Node ] , our_payment_hash : [ u8 ; 32 ] ) {
2862
+ fn fail_payment_along_route ( origin_node : & Node , expected_route : & [ & Node ] , skip_last : bool , our_payment_hash : [ u8 ; 32 ] ) {
2852
2863
assert ! ( expected_route. last( ) . unwrap( ) . node. fail_htlc_backwards( & our_payment_hash) ) ;
2853
2864
{
2854
2865
let mut added_monitors = expected_route. last ( ) . unwrap ( ) . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
@@ -2868,42 +2879,57 @@ mod tests {
2868
2879
2869
2880
let mut expected_next_node = expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) ;
2870
2881
let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
2871
- for node in expected_route. iter ( ) . rev ( ) {
2882
+ for ( idx , node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) {
2872
2883
assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
2873
2884
if next_msgs. is_some ( ) {
2874
- update_fail_dance ! ( node, prev_node, false ) ;
2885
+ // We may be the "last node" for the purpose of the commitment dance if we're
2886
+ // skipping the last node (implying it is disconnected) and we're the
2887
+ // second-to-last node!
2888
+ update_fail_dance ! ( node, prev_node, skip_last && idx == expected_route. len( ) - 1 ) ;
2875
2889
}
2876
2890
2877
2891
let events = node. node . get_and_clear_pending_events ( ) ;
2878
- assert_eq ! ( events. len( ) , 1 ) ;
2879
- match events[ 0 ] {
2880
- Event :: UpdateHTLCs { ref node_id, updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref commitment_signed } } => {
2881
- assert ! ( update_add_htlcs. is_empty( ) ) ;
2882
- assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
2883
- assert_eq ! ( update_fail_htlcs. len( ) , 1 ) ;
2884
- assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
2885
- expected_next_node = node_id. clone ( ) ;
2886
- next_msgs = Some ( ( update_fail_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
2887
- } ,
2888
- _ => panic ! ( "Unexpected event" ) ,
2889
- } ;
2892
+ if !skip_last || idx != expected_route. len ( ) - 1 {
2893
+ assert_eq ! ( events. len( ) , 1 ) ;
2894
+ match events[ 0 ] {
2895
+ Event :: UpdateHTLCs { ref node_id, updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref commitment_signed } } => {
2896
+ assert ! ( update_add_htlcs. is_empty( ) ) ;
2897
+ assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
2898
+ assert_eq ! ( update_fail_htlcs. len( ) , 1 ) ;
2899
+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
2900
+ expected_next_node = node_id. clone ( ) ;
2901
+ next_msgs = Some ( ( update_fail_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
2902
+ } ,
2903
+ _ => panic ! ( "Unexpected event" ) ,
2904
+ }
2905
+ } else {
2906
+ assert ! ( events. is_empty( ) ) ;
2907
+ }
2908
+ if !skip_last && idx == expected_route. len ( ) - 1 {
2909
+ assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
2910
+ }
2890
2911
2891
2912
prev_node = node;
2892
2913
}
2893
2914
2894
- assert_eq ! ( expected_next_node , origin_node . node . get_our_node_id ( ) ) ;
2895
- update_fail_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
2915
+ if !skip_last {
2916
+ update_fail_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
2896
2917
2897
- let events = origin_node. node . get_and_clear_pending_events ( ) ;
2898
- assert_eq ! ( events. len( ) , 1 ) ;
2899
- match events[ 0 ] {
2900
- Event :: PaymentFailed { payment_hash } => {
2901
- assert_eq ! ( payment_hash, our_payment_hash) ;
2902
- } ,
2903
- _ => panic ! ( "Unexpected event" ) ,
2918
+ let events = origin_node. node . get_and_clear_pending_events ( ) ;
2919
+ assert_eq ! ( events. len( ) , 1 ) ;
2920
+ match events[ 0 ] {
2921
+ Event :: PaymentFailed { payment_hash } => {
2922
+ assert_eq ! ( payment_hash, our_payment_hash) ;
2923
+ } ,
2924
+ _ => panic ! ( "Unexpected event" ) ,
2925
+ }
2904
2926
}
2905
2927
}
2906
2928
2929
+ fn fail_payment ( origin_node : & Node , expected_route : & [ & Node ] , our_payment_hash : [ u8 ; 32 ] ) {
2930
+ fail_payment_along_route ( origin_node, expected_route, false , our_payment_hash) ;
2931
+ }
2932
+
2907
2933
fn create_network ( node_count : usize ) -> Vec < Node > {
2908
2934
let mut nodes = Vec :: new ( ) ;
2909
2935
let mut rng = thread_rng ( ) ;
0 commit comments