@@ -3153,6 +3153,65 @@ mod tests {
3153
3153
check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
3154
3154
}
3155
3155
3156
+ #[ test]
3157
+ fn test_update_fee_unordered_raa ( ) {
3158
+ // Just the intro to the previous test followed by an out-of-order RAA (which caused a
3159
+ // crash in an earlier version of the update_fee patch)
3160
+ let mut nodes = create_network ( 2 ) ;
3161
+ let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
3162
+ let channel_id = chan. 2 ;
3163
+
3164
+ macro_rules! get_feerate {
3165
+ ( $node: expr) => { {
3166
+ let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
3167
+ let chan = chan_lock. by_id. get( & channel_id) . unwrap( ) ;
3168
+ chan. get_feerate( )
3169
+ } }
3170
+ }
3171
+
3172
+ // balancing
3173
+ send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 8000000 ) ;
3174
+
3175
+ // First nodes[0] generates an update_fee
3176
+ nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] ) + 20 ) . unwrap ( ) ;
3177
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
3178
+
3179
+ let events_0 = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
3180
+ assert_eq ! ( events_0. len( ) , 1 ) ;
3181
+ let update_msg = match events_0[ 0 ] { // (1)
3182
+ Event :: UpdateHTLCs { updates : msgs:: CommitmentUpdate { ref update_fee, .. } , .. } => {
3183
+ update_fee. as_ref ( )
3184
+ } ,
3185
+ _ => panic ! ( "Unexpected event" ) ,
3186
+ } ;
3187
+
3188
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msg. unwrap ( ) ) . unwrap ( ) ;
3189
+
3190
+ // ...but before it's delivered, nodes[1] starts to send a payment back to nodes[0]...
3191
+ let ( _, our_payment_hash) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
3192
+ nodes[ 1 ] . node . send_payment ( nodes[ 1 ] . router . get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 40000 , TEST_FINAL_CLTV ) . unwrap ( ) , our_payment_hash) . unwrap ( ) ;
3193
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
3194
+
3195
+ let payment_event = {
3196
+ let mut events_1 = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
3197
+ assert_eq ! ( events_1. len( ) , 1 ) ;
3198
+ SendEvent :: from_event ( events_1. remove ( 0 ) )
3199
+ } ;
3200
+ assert_eq ! ( payment_event. node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
3201
+ assert_eq ! ( payment_event. msgs. len( ) , 1 ) ;
3202
+
3203
+ // ...now when the messages get delivered everyone should be happy
3204
+ nodes[ 0 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) . unwrap ( ) ;
3205
+ let ( as_revoke_msg, as_commitment_signed) = nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event. commitment_msg ) . unwrap ( ) ; // (2)
3206
+ assert ! ( as_commitment_signed. is_none( ) ) ; // nodes[0] is awaiting nodes[1] revoke_and_ack
3207
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
3208
+
3209
+ assert ! ( nodes[ 1 ] . node. handle_revoke_and_ack( & nodes[ 0 ] . node. get_our_node_id( ) , & as_revoke_msg) . unwrap( ) . is_none( ) ) ; // deliver (2)
3210
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
3211
+
3212
+ // We can't continue, sadly, because our (1) now has a bogus signature
3213
+ }
3214
+
3156
3215
#[ test]
3157
3216
fn test_update_fee_vanilla ( ) {
3158
3217
let nodes = create_network ( 2 ) ;
0 commit comments