@@ -2384,5 +2384,136 @@ mod tests {
2384
2384
// TODO: Test HTLCFailChannelUpdate::NodeFailure, which is not implemented yet.
2385
2385
}
2386
2386
2387
+ #[ test]
2388
+ fn getting_next_channel_announcements ( ) {
2389
+ let ( secp_ctx, _, router) = create_router ( ) ;
2390
+ let node_1_privkey = & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ;
2391
+ let node_2_privkey = & SecretKey :: from_slice ( & [ 41 ; 32 ] ) . unwrap ( ) ;
2392
+ let node_id_1 = PublicKey :: from_secret_key ( & secp_ctx, node_1_privkey) ;
2393
+ let node_id_2 = PublicKey :: from_secret_key ( & secp_ctx, node_2_privkey) ;
2394
+ let node_1_btckey = & SecretKey :: from_slice ( & [ 40 ; 32 ] ) . unwrap ( ) ;
2395
+ let node_2_btckey = & SecretKey :: from_slice ( & [ 39 ; 32 ] ) . unwrap ( ) ;
2396
+
2397
+ let short_channel_id = 1 ;
2398
+ let chain_hash = genesis_block ( Network :: Testnet ) . header . bitcoin_hash ( ) ;
2399
+ let channel_key = NetworkMap :: get_key ( short_channel_id, chain_hash) ;
2400
+
2401
+ // Channels were not announced yet.
2402
+ let channels_with_announcements = router. get_next_channel_announcements ( 0 , 1 ) ;
2403
+ assert_eq ! ( channels_with_announcements. len( ) , 0 ) ;
2404
+
2405
+ {
2406
+ // Announce a channel we will update
2407
+ let unsigned_announcement = UnsignedChannelAnnouncement {
2408
+ features : ChannelFeatures :: empty ( ) ,
2409
+ chain_hash,
2410
+ short_channel_id,
2411
+ node_id_1,
2412
+ node_id_2,
2413
+ bitcoin_key_1 : PublicKey :: from_secret_key ( & secp_ctx, node_1_btckey) ,
2414
+ bitcoin_key_2 : PublicKey :: from_secret_key ( & secp_ctx, node_2_btckey) ,
2415
+ excess_data : Vec :: new ( ) ,
2416
+ } ;
2387
2417
2418
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2419
+ let valid_channel_announcement = ChannelAnnouncement {
2420
+ node_signature_1 : secp_ctx. sign ( & msghash, node_1_privkey) ,
2421
+ node_signature_2 : secp_ctx. sign ( & msghash, node_2_privkey) ,
2422
+ bitcoin_signature_1 : secp_ctx. sign ( & msghash, node_1_btckey) ,
2423
+ bitcoin_signature_2 : secp_ctx. sign ( & msghash, node_2_btckey) ,
2424
+ contents : unsigned_announcement. clone ( ) ,
2425
+ } ;
2426
+ match router. handle_channel_announcement ( & valid_channel_announcement) {
2427
+ Ok ( _) => ( ) ,
2428
+ Err ( _) => panic ! ( )
2429
+ } ;
2430
+ }
2431
+
2432
+ // Contains initial channel announcement now.
2433
+ let channels_with_announcements = router. get_next_channel_announcements ( channel_key, 1 ) ;
2434
+ assert_eq ! ( channels_with_announcements. len( ) , 1 ) ;
2435
+ if let Some ( channel_announcements) = channels_with_announcements. first ( ) {
2436
+ let & ( _, ref update_1, ref update_2) = channel_announcements;
2437
+ assert_eq ! ( update_1, & None ) ;
2438
+ assert_eq ! ( update_2, & None ) ;
2439
+ } else {
2440
+ panic ! ( ) ;
2441
+ }
2442
+
2443
+
2444
+ {
2445
+ // Valid channel update
2446
+ let unsigned_channel_update = UnsignedChannelUpdate {
2447
+ chain_hash,
2448
+ short_channel_id,
2449
+ timestamp : 101 ,
2450
+ flags : 0 ,
2451
+ cltv_expiry_delta : 144 ,
2452
+ htlc_minimum_msat : 1000000 ,
2453
+ fee_base_msat : 10000 ,
2454
+ fee_proportional_millionths : 20 ,
2455
+ excess_data : Vec :: new ( )
2456
+ } ;
2457
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2458
+ let valid_channel_update = ChannelUpdate {
2459
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2460
+ contents : unsigned_channel_update. clone ( )
2461
+ } ;
2462
+ match router. handle_channel_update ( & valid_channel_update) {
2463
+ Ok ( _) => ( ) ,
2464
+ Err ( _) => panic ! ( )
2465
+ } ;
2466
+ }
2467
+
2468
+ // Now contains an initial announcement and an update.
2469
+ let channels_with_announcements = router. get_next_channel_announcements ( channel_key, 1 ) ;
2470
+ assert_eq ! ( channels_with_announcements. len( ) , 1 ) ;
2471
+ if let Some ( channel_announcements) = channels_with_announcements. first ( ) {
2472
+ let & ( _, ref update_1, ref update_2) = channel_announcements;
2473
+ assert_ne ! ( update_1, & None ) ;
2474
+ assert_eq ! ( update_2, & None ) ;
2475
+ } else {
2476
+ panic ! ( ) ;
2477
+ }
2478
+
2479
+
2480
+ {
2481
+ // Channel update with excess data.
2482
+ let unsigned_channel_update = UnsignedChannelUpdate {
2483
+ chain_hash,
2484
+ short_channel_id,
2485
+ timestamp : 102 ,
2486
+ flags : 0 ,
2487
+ cltv_expiry_delta : 144 ,
2488
+ htlc_minimum_msat : 1000000 ,
2489
+ fee_base_msat : 10000 ,
2490
+ fee_proportional_millionths : 20 ,
2491
+ excess_data : [ 1 ; 3 ] . to_vec ( )
2492
+ } ;
2493
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2494
+ let valid_channel_update = ChannelUpdate {
2495
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2496
+ contents : unsigned_channel_update. clone ( )
2497
+ } ;
2498
+ match router. handle_channel_update ( & valid_channel_update) {
2499
+ Ok ( _) => ( ) ,
2500
+ Err ( _) => panic ! ( )
2501
+ } ;
2502
+ }
2503
+
2504
+ // Test that announcements with excess data won't be returned
2505
+ let channels_with_announcements = router. get_next_channel_announcements ( channel_key, 1 ) ;
2506
+ assert_eq ! ( channels_with_announcements. len( ) , 1 ) ;
2507
+ if let Some ( channel_announcements) = channels_with_announcements. first ( ) {
2508
+ let & ( _, ref update_1, ref update_2) = channel_announcements;
2509
+ assert_eq ! ( update_1, & None ) ;
2510
+ assert_eq ! ( update_2, & None ) ;
2511
+ } else {
2512
+ panic ! ( ) ;
2513
+ }
2514
+
2515
+ // Further starting point have no channels after it
2516
+ let channels_with_announcements = router. get_next_channel_announcements ( channel_key + 1000 , 1 ) ;
2517
+ assert_eq ! ( channels_with_announcements. len( ) , 0 ) ;
2518
+ }
2388
2519
}
0 commit comments