@@ -1058,7 +1058,7 @@ mod tests {
1058
1058
use ln:: router:: { Router , NodeInfo , NetworkMap , ChannelInfo , DirectionalChannelInfo , RouteHint } ;
1059
1059
use ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
1060
1060
use ln:: msgs:: { ErrorAction , LightningError , RoutingMessageHandler , UnsignedNodeAnnouncement , NodeAnnouncement ,
1061
- UnsignedChannelAnnouncement , ChannelAnnouncement , UnsignedChannelUpdate , ChannelUpdate } ;
1061
+ UnsignedChannelAnnouncement , ChannelAnnouncement , UnsignedChannelUpdate , ChannelUpdate , HTLCFailChannelUpdate } ;
1062
1062
use util:: test_utils;
1063
1063
use util:: test_utils:: TestVecWriter ;
1064
1064
use util:: logger:: Logger ;
@@ -2294,4 +2294,90 @@ mod tests {
2294
2294
} ;
2295
2295
2296
2296
}
2297
+
2298
+ #[ test]
2299
+ fn handling_htlc_fail_channel_update ( ) {
2300
+ let ( secp_ctx, _, router) = create_router ( ) ;
2301
+ let node_1_privkey = & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ;
2302
+ let node_2_privkey = & SecretKey :: from_slice ( & [ 41 ; 32 ] ) . unwrap ( ) ;
2303
+ let node_id_1 = PublicKey :: from_secret_key ( & secp_ctx, node_1_privkey) ;
2304
+ let node_id_2 = PublicKey :: from_secret_key ( & secp_ctx, node_2_privkey) ;
2305
+ let node_1_btckey = & SecretKey :: from_slice ( & [ 40 ; 32 ] ) . unwrap ( ) ;
2306
+ let node_2_btckey = & SecretKey :: from_slice ( & [ 39 ; 32 ] ) . unwrap ( ) ;
2307
+
2308
+ let short_channel_id = 0 ;
2309
+ let chain_hash = genesis_block ( Network :: Testnet ) . header . bitcoin_hash ( ) ;
2310
+ let channel_key = NetworkMap :: get_key ( short_channel_id, chain_hash) ;
2311
+
2312
+ {
2313
+ // Announce a channel we will update
2314
+ let unsigned_announcement = UnsignedChannelAnnouncement {
2315
+ features : ChannelFeatures :: empty ( ) ,
2316
+ chain_hash,
2317
+ short_channel_id,
2318
+ node_id_1,
2319
+ node_id_2,
2320
+ bitcoin_key_1 : PublicKey :: from_secret_key ( & secp_ctx, node_1_btckey) ,
2321
+ bitcoin_key_2 : PublicKey :: from_secret_key ( & secp_ctx, node_2_btckey) ,
2322
+ excess_data : Vec :: new ( ) ,
2323
+ } ;
2324
+
2325
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2326
+ let valid_channel_announcement = ChannelAnnouncement {
2327
+ node_signature_1 : secp_ctx. sign ( & msghash, node_1_privkey) ,
2328
+ node_signature_2 : secp_ctx. sign ( & msghash, node_2_privkey) ,
2329
+ bitcoin_signature_1 : secp_ctx. sign ( & msghash, node_1_btckey) ,
2330
+ bitcoin_signature_2 : secp_ctx. sign ( & msghash, node_2_btckey) ,
2331
+ contents : unsigned_announcement. clone ( ) ,
2332
+ } ;
2333
+ match router. handle_channel_announcement ( & valid_channel_announcement) {
2334
+ Ok ( _) => ( ) ,
2335
+ Err ( _) => panic ! ( )
2336
+ } ;
2337
+
2338
+ }
2339
+
2340
+ let channel_close_msg = HTLCFailChannelUpdate :: ChannelClosed {
2341
+ short_channel_id,
2342
+ is_permanent : false
2343
+ } ;
2344
+
2345
+ router. handle_htlc_fail_channel_update ( & channel_close_msg) ;
2346
+
2347
+ {
2348
+ // Non-permanent closing just disables a channel
2349
+ let network = router. network_map . write ( ) . unwrap ( ) ;
2350
+ match network. channels . get ( & channel_key) {
2351
+ None => panic ! ( ) ,
2352
+ Some ( channel_info) => {
2353
+ assert ! ( !channel_info. one_to_two. enabled) ;
2354
+ assert ! ( !channel_info. two_to_one. enabled) ;
2355
+ }
2356
+ }
2357
+ }
2358
+
2359
+ let channel_close_msg = HTLCFailChannelUpdate :: ChannelClosed {
2360
+ short_channel_id,
2361
+ is_permanent : true
2362
+ } ;
2363
+
2364
+ router. handle_htlc_fail_channel_update ( & channel_close_msg) ;
2365
+
2366
+ {
2367
+ // Permanent closing deletes a channel
2368
+ let network = router. network_map . write ( ) . unwrap ( ) ;
2369
+ assert_eq ! ( network. channels. len( ) , 0 ) ;
2370
+ // Nodes are also deleted because there are no associated channels anymore
2371
+ assert_eq ! ( network. nodes. len( ) , 1 ) ;
2372
+ }
2373
+
2374
+ // TODO: This message is not implemented yet: causes panic.
2375
+ // let node_failure_msg = HTLCFailChannelUpdate::NodeFailure {
2376
+ // node_id: public_key,
2377
+ // is_permanent: false
2378
+ // };
2379
+ // router.handle_htlc_fail_channel_update(&node_failure_msg);
2380
+ }
2381
+
2382
+
2297
2383
}
0 commit comments