@@ -1218,7 +1218,7 @@ impl ChannelManager {
1218
1218
} ;
1219
1219
match channel_state. claimable_htlcs . entry ( forward_info. payment_hash ) {
1220
1220
hash_map:: Entry :: Occupied ( mut entry) => entry. get_mut ( ) . push ( prev_hop_data) ,
1221
- hash_map:: Entry :: Vacant ( mut entry) => { entry. insert ( vec ! [ prev_hop_data] ) ; } ,
1221
+ hash_map:: Entry :: Vacant ( entry) => { entry. insert ( vec ! [ prev_hop_data] ) ; } ,
1222
1222
} ;
1223
1223
new_events. push ( ( None , events:: Event :: PaymentReceived {
1224
1224
payment_hash : forward_info. payment_hash ,
@@ -2198,7 +2198,6 @@ mod tests {
2198
2198
use bitcoin:: util:: hash:: Sha256dHash ;
2199
2199
use bitcoin:: blockdata:: block:: { Block , BlockHeader } ;
2200
2200
use bitcoin:: blockdata:: transaction:: { Transaction , TxOut } ;
2201
- use bitcoin:: blockdata:: transaction:: OutPoint as BitcoinOutPoint ;
2202
2201
use bitcoin:: blockdata:: constants:: genesis_block;
2203
2202
use bitcoin:: network:: constants:: Network ;
2204
2203
use bitcoin:: network:: serialize:: serialize;
@@ -2391,6 +2390,13 @@ mod tests {
2391
2390
network_payment_count : Rc < RefCell < u8 > > ,
2392
2391
network_chan_count : Rc < RefCell < u32 > > ,
2393
2392
}
2393
+ impl Drop for Node {
2394
+ fn drop ( & mut self ) {
2395
+ // Check that we processed all pending events
2396
+ assert_eq ! ( self . node. get_and_clear_pending_events( ) . len( ) , 0 ) ;
2397
+ assert_eq ! ( self . chan_monitor. added_monitors. lock( ) . unwrap( ) . len( ) , 0 ) ;
2398
+ }
2399
+ }
2394
2400
2395
2401
fn create_chan_between_nodes ( node_a : & Node , node_b : & Node ) -> ( msgs:: ChannelAnnouncement , msgs:: ChannelUpdate , msgs:: ChannelUpdate , [ u8 ; 32 ] , Transaction ) {
2396
2402
node_a. node . create_channel ( node_b. node . get_our_node_id ( ) , 100000 , 10001 , 42 ) . unwrap ( ) ;
@@ -2735,7 +2741,7 @@ mod tests {
2735
2741
( our_payment_preimage, our_payment_hash)
2736
2742
}
2737
2743
2738
- fn claim_payment ( origin_node : & Node , expected_route : & [ & Node ] , our_payment_preimage : [ u8 ; 32 ] ) {
2744
+ fn claim_payment_along_route ( origin_node : & Node , expected_route : & [ & Node ] , skip_last : bool , our_payment_preimage : [ u8 ; 32 ] ) {
2739
2745
assert ! ( expected_route. last( ) . unwrap( ) . node. claim_funds( our_payment_preimage) ) ;
2740
2746
{
2741
2747
let mut added_monitors = expected_route. last ( ) . unwrap ( ) . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
@@ -2764,40 +2770,51 @@ mod tests {
2764
2770
2765
2771
let mut expected_next_node = expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) ;
2766
2772
let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
2767
- for node in expected_route. iter ( ) . rev ( ) {
2773
+ for ( idx , node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) {
2768
2774
assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
2769
2775
if next_msgs. is_some ( ) {
2770
2776
update_fulfill_dance ! ( node, prev_node, false ) ;
2771
2777
}
2772
2778
2773
2779
let events = node. node . get_and_clear_pending_events ( ) ;
2780
+ if !skip_last || idx != expected_route. len ( ) - 1 {
2781
+ assert_eq ! ( events. len( ) , 1 ) ;
2782
+ 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 ( ) ) ) ;
2790
+ } ,
2791
+ _ => panic ! ( "Unexpected event" ) ,
2792
+ }
2793
+ } else {
2794
+ assert ! ( events. is_empty( ) ) ;
2795
+ }
2796
+ if !skip_last && idx == expected_route. len ( ) - 1 {
2797
+ assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
2798
+ }
2799
+
2800
+ prev_node = node;
2801
+ }
2802
+
2803
+ if !skip_last {
2804
+ update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
2805
+ let events = origin_node. node . get_and_clear_pending_events ( ) ;
2774
2806
assert_eq ! ( events. len( ) , 1 ) ;
2775
2807
match events[ 0 ] {
2776
- 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 } } => {
2777
- assert ! ( update_add_htlcs. is_empty( ) ) ;
2778
- assert_eq ! ( update_fulfill_htlcs. len( ) , 1 ) ;
2779
- assert ! ( update_fail_htlcs. is_empty( ) ) ;
2780
- assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
2781
- expected_next_node = node_id. clone ( ) ;
2782
- next_msgs = Some ( ( update_fulfill_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
2808
+ Event :: PaymentSent { payment_preimage } => {
2809
+ assert_eq ! ( payment_preimage, our_payment_preimage) ;
2783
2810
} ,
2784
2811
_ => panic ! ( "Unexpected event" ) ,
2785
- } ;
2786
-
2787
- prev_node = node;
2812
+ }
2788
2813
}
2814
+ }
2789
2815
2790
- assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
2791
- update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
2792
-
2793
- let events = origin_node. node . get_and_clear_pending_events ( ) ;
2794
- assert_eq ! ( events. len( ) , 1 ) ;
2795
- match events[ 0 ] {
2796
- Event :: PaymentSent { payment_preimage } => {
2797
- assert_eq ! ( payment_preimage, our_payment_preimage) ;
2798
- } ,
2799
- _ => panic ! ( "Unexpected event" ) ,
2800
- }
2816
+ fn claim_payment ( origin_node : & Node , expected_route : & [ & Node ] , our_payment_preimage : [ u8 ; 32 ] ) {
2817
+ claim_payment_along_route ( origin_node, expected_route, false , our_payment_preimage) ;
2801
2818
}
2802
2819
2803
2820
const TEST_FINAL_CLTV : u32 = 32 ;
@@ -2841,7 +2858,7 @@ mod tests {
2841
2858
claim_payment ( & origin, expected_route, our_payment_preimage) ;
2842
2859
}
2843
2860
2844
- fn fail_payment ( origin_node : & Node , expected_route : & [ & Node ] , our_payment_hash : [ u8 ; 32 ] ) {
2861
+ fn fail_payment_along_route ( origin_node : & Node , expected_route : & [ & Node ] , skip_last : bool , our_payment_hash : [ u8 ; 32 ] ) {
2845
2862
assert ! ( expected_route. last( ) . unwrap( ) . node. fail_htlc_backwards( & our_payment_hash) ) ;
2846
2863
{
2847
2864
let mut added_monitors = expected_route. last ( ) . unwrap ( ) . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
@@ -2861,42 +2878,57 @@ mod tests {
2861
2878
2862
2879
let mut expected_next_node = expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) ;
2863
2880
let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
2864
- for node in expected_route. iter ( ) . rev ( ) {
2881
+ for ( idx , node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) {
2865
2882
assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
2866
2883
if next_msgs. is_some ( ) {
2867
- update_fail_dance ! ( node, prev_node, false ) ;
2884
+ // We may be the "last node" for the purpose of the commitment dance if we're
2885
+ // skipping the last node (implying it is disconnected) and we're the
2886
+ // second-to-last node!
2887
+ update_fail_dance ! ( node, prev_node, skip_last && idx == expected_route. len( ) - 1 ) ;
2868
2888
}
2869
2889
2870
2890
let events = node. node . get_and_clear_pending_events ( ) ;
2871
- assert_eq ! ( events. len( ) , 1 ) ;
2872
- match events[ 0 ] {
2873
- 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 } } => {
2874
- assert ! ( update_add_htlcs. is_empty( ) ) ;
2875
- assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
2876
- assert_eq ! ( update_fail_htlcs. len( ) , 1 ) ;
2877
- assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
2878
- expected_next_node = node_id. clone ( ) ;
2879
- next_msgs = Some ( ( update_fail_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
2880
- } ,
2881
- _ => panic ! ( "Unexpected event" ) ,
2882
- } ;
2891
+ if !skip_last || idx != expected_route. len ( ) - 1 {
2892
+ assert_eq ! ( events. len( ) , 1 ) ;
2893
+ match events[ 0 ] {
2894
+ 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 } } => {
2895
+ assert ! ( update_add_htlcs. is_empty( ) ) ;
2896
+ assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
2897
+ assert_eq ! ( update_fail_htlcs. len( ) , 1 ) ;
2898
+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
2899
+ expected_next_node = node_id. clone ( ) ;
2900
+ next_msgs = Some ( ( update_fail_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
2901
+ } ,
2902
+ _ => panic ! ( "Unexpected event" ) ,
2903
+ }
2904
+ } else {
2905
+ assert ! ( events. is_empty( ) ) ;
2906
+ }
2907
+ if !skip_last && idx == expected_route. len ( ) - 1 {
2908
+ assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
2909
+ }
2883
2910
2884
2911
prev_node = node;
2885
2912
}
2886
2913
2887
- assert_eq ! ( expected_next_node , origin_node . node . get_our_node_id ( ) ) ;
2888
- update_fail_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
2914
+ if !skip_last {
2915
+ update_fail_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
2889
2916
2890
- let events = origin_node. node . get_and_clear_pending_events ( ) ;
2891
- assert_eq ! ( events. len( ) , 1 ) ;
2892
- match events[ 0 ] {
2893
- Event :: PaymentFailed { payment_hash } => {
2894
- assert_eq ! ( payment_hash, our_payment_hash) ;
2895
- } ,
2896
- _ => panic ! ( "Unexpected event" ) ,
2917
+ let events = origin_node. node . get_and_clear_pending_events ( ) ;
2918
+ assert_eq ! ( events. len( ) , 1 ) ;
2919
+ match events[ 0 ] {
2920
+ Event :: PaymentFailed { payment_hash } => {
2921
+ assert_eq ! ( payment_hash, our_payment_hash) ;
2922
+ } ,
2923
+ _ => panic ! ( "Unexpected event" ) ,
2924
+ }
2897
2925
}
2898
2926
}
2899
2927
2928
+ fn fail_payment ( origin_node : & Node , expected_route : & [ & Node ] , our_payment_hash : [ u8 ; 32 ] ) {
2929
+ fail_payment_along_route ( origin_node, expected_route, false , our_payment_hash) ;
2930
+ }
2931
+
2900
2932
fn create_network ( node_count : usize ) -> Vec < Node > {
2901
2933
let mut nodes = Vec :: new ( ) ;
2902
2934
let mut rng = thread_rng ( ) ;
@@ -3037,12 +3069,6 @@ mod tests {
3037
3069
close_channel ( & nodes[ 2 ] , & nodes[ 3 ] , & chan_3. 2 , chan_3. 3 , true ) ;
3038
3070
close_channel ( & nodes[ 1 ] , & nodes[ 3 ] , & chan_4. 2 , chan_4. 3 , false ) ;
3039
3071
close_channel ( & nodes[ 1 ] , & nodes[ 3 ] , & chan_5. 2 , chan_5. 3 , false ) ;
3040
-
3041
- // Check that we processed all pending events
3042
- for node in nodes {
3043
- assert_eq ! ( node. node. get_and_clear_pending_events( ) . len( ) , 0 ) ;
3044
- assert_eq ! ( node. chan_monitor. added_monitors. lock( ) . unwrap( ) . len( ) , 0 ) ;
3045
- }
3046
3072
}
3047
3073
3048
3074
#[ test]
@@ -3352,12 +3378,6 @@ mod tests {
3352
3378
get_announce_close_broadcast_events ( & nodes, 0 , 1 ) ;
3353
3379
assert_eq ! ( nodes[ 0 ] . node. list_channels( ) . len( ) , 0 ) ;
3354
3380
assert_eq ! ( nodes[ 1 ] . node. list_channels( ) . len( ) , 0 ) ;
3355
-
3356
- // Check that we processed all pending events
3357
- for node in nodes {
3358
- assert_eq ! ( node. node. get_and_clear_pending_events( ) . len( ) , 0 ) ;
3359
- assert_eq ! ( node. chan_monitor. added_monitors. lock( ) . unwrap( ) . len( ) , 0 ) ;
3360
- }
3361
3381
}
3362
3382
3363
3383
#[ test]
@@ -3542,6 +3562,16 @@ mod tests {
3542
3562
while !headers. is_empty ( ) {
3543
3563
nodes[ 0 ] . node . block_disconnected ( & headers. pop ( ) . unwrap ( ) ) ;
3544
3564
}
3565
+ {
3566
+ let events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
3567
+ assert_eq ! ( events. len( ) , 1 ) ;
3568
+ match events[ 0 ] {
3569
+ Event :: BroadcastChannelUpdate { msg : msgs:: ChannelUpdate { contents : msgs:: UnsignedChannelUpdate { flags, .. } , .. } } => {
3570
+ assert_eq ! ( flags & 0b10 , 0b10 ) ;
3571
+ } ,
3572
+ _ => panic ! ( "Unexpected event" ) ,
3573
+ }
3574
+ }
3545
3575
let channel_state = nodes[ 0 ] . node . channel_state . lock ( ) . unwrap ( ) ;
3546
3576
assert_eq ! ( channel_state. by_id. len( ) , 0 ) ;
3547
3577
assert_eq ! ( channel_state. short_to_id. len( ) , 0 ) ;
0 commit comments