@@ -2519,4 +2519,122 @@ mod tests {
2519
2519
let next_announcements = router. get_next_channel_announcements ( channel_key, 2 ) ;
2520
2520
assert_eq ! ( next_announcements. len( ) , 0 ) ;
2521
2521
}
2522
+
2523
+ #[ test]
2524
+ fn getting_next_node_announcements ( ) {
2525
+ let ( secp_ctx, _, router) = create_router ( ) ;
2526
+ let node_1_privkey = & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ;
2527
+ let node_2_privkey = & SecretKey :: from_slice ( & [ 41 ; 32 ] ) . unwrap ( ) ;
2528
+ let node_id_1 = PublicKey :: from_secret_key ( & secp_ctx, node_1_privkey) ;
2529
+ let node_id_2 = PublicKey :: from_secret_key ( & secp_ctx, node_2_privkey) ;
2530
+ let node_1_btckey = & SecretKey :: from_slice ( & [ 40 ; 32 ] ) . unwrap ( ) ;
2531
+ let node_2_btckey = & SecretKey :: from_slice ( & [ 39 ; 32 ] ) . unwrap ( ) ;
2532
+
2533
+ let short_channel_id = 1 ;
2534
+ let chain_hash = genesis_block ( Network :: Testnet ) . header . bitcoin_hash ( ) ;
2535
+
2536
+ // No nodes yet.
2537
+ let next_announcements = router. get_next_node_announcements ( None , 10 ) ;
2538
+ assert_eq ! ( next_announcements. len( ) , 0 ) ;
2539
+
2540
+ {
2541
+ // Announce a channel to add 2 nodes
2542
+ let unsigned_announcement = UnsignedChannelAnnouncement {
2543
+ features : ChannelFeatures :: empty ( ) ,
2544
+ chain_hash,
2545
+ short_channel_id,
2546
+ node_id_1,
2547
+ node_id_2,
2548
+ bitcoin_key_1 : PublicKey :: from_secret_key ( & secp_ctx, node_1_btckey) ,
2549
+ bitcoin_key_2 : PublicKey :: from_secret_key ( & secp_ctx, node_2_btckey) ,
2550
+ excess_data : Vec :: new ( ) ,
2551
+ } ;
2552
+
2553
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2554
+ let valid_channel_announcement = ChannelAnnouncement {
2555
+ node_signature_1 : secp_ctx. sign ( & msghash, node_1_privkey) ,
2556
+ node_signature_2 : secp_ctx. sign ( & msghash, node_2_privkey) ,
2557
+ bitcoin_signature_1 : secp_ctx. sign ( & msghash, node_1_btckey) ,
2558
+ bitcoin_signature_2 : secp_ctx. sign ( & msghash, node_2_btckey) ,
2559
+ contents : unsigned_announcement. clone ( ) ,
2560
+ } ;
2561
+ match router. handle_channel_announcement ( & valid_channel_announcement) {
2562
+ Ok ( _) => ( ) ,
2563
+ Err ( _) => panic ! ( )
2564
+ } ;
2565
+ }
2566
+
2567
+
2568
+ // Nodes were never announced
2569
+ let next_announcements = router. get_next_node_announcements ( None , 3 ) ;
2570
+ assert_eq ! ( next_announcements. len( ) , 0 ) ;
2571
+
2572
+ {
2573
+ let mut unsigned_announcement = UnsignedNodeAnnouncement {
2574
+ features : NodeFeatures :: supported ( ) ,
2575
+ timestamp : 1000 ,
2576
+ node_id : node_id_1,
2577
+ rgb : [ 0 ; 3 ] ,
2578
+ alias : [ 0 ; 32 ] ,
2579
+ addresses : Vec :: new ( ) ,
2580
+ excess_address_data : Vec :: new ( ) ,
2581
+ excess_data : Vec :: new ( ) ,
2582
+ } ;
2583
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2584
+ let valid_announcement = NodeAnnouncement {
2585
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2586
+ contents : unsigned_announcement. clone ( )
2587
+ } ;
2588
+ match router. handle_node_announcement ( & valid_announcement) {
2589
+ Ok ( _) => ( ) ,
2590
+ Err ( _) => panic ! ( )
2591
+ } ;
2592
+
2593
+ unsigned_announcement. node_id = node_id_2;
2594
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2595
+ let valid_announcement = NodeAnnouncement {
2596
+ signature : secp_ctx. sign ( & msghash, node_2_privkey) ,
2597
+ contents : unsigned_announcement. clone ( )
2598
+ } ;
2599
+
2600
+ match router. handle_node_announcement ( & valid_announcement) {
2601
+ Ok ( _) => ( ) ,
2602
+ Err ( _) => panic ! ( )
2603
+ } ;
2604
+ }
2605
+
2606
+ let next_announcements = router. get_next_node_announcements ( None , 3 ) ;
2607
+ assert_eq ! ( next_announcements. len( ) , 2 ) ;
2608
+
2609
+ // Skip the first node.
2610
+ let next_announcements = router. get_next_node_announcements ( Some ( & node_id_1) , 2 ) ;
2611
+ assert_eq ! ( next_announcements. len( ) , 1 ) ;
2612
+
2613
+ {
2614
+ // Later announcement which should not be relayed (excess data) prevent us from sharing a node
2615
+ let unsigned_announcement = UnsignedNodeAnnouncement {
2616
+ features : NodeFeatures :: supported ( ) ,
2617
+ timestamp : 1010 ,
2618
+ node_id : node_id_2,
2619
+ rgb : [ 0 ; 3 ] ,
2620
+ alias : [ 0 ; 32 ] ,
2621
+ addresses : Vec :: new ( ) ,
2622
+ excess_address_data : Vec :: new ( ) ,
2623
+ excess_data : [ 1 ; 3 ] . to_vec ( ) ,
2624
+ } ;
2625
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2626
+ let valid_announcement = NodeAnnouncement {
2627
+ signature : secp_ctx. sign ( & msghash, node_2_privkey) ,
2628
+ contents : unsigned_announcement. clone ( )
2629
+ } ;
2630
+ match router. handle_node_announcement ( & valid_announcement) {
2631
+ Ok ( res) => assert ! ( !res) ,
2632
+ Err ( _) => panic ! ( )
2633
+ } ;
2634
+ }
2635
+
2636
+ let next_announcements = router. get_next_node_announcements ( Some ( & node_id_1) , 2 ) ;
2637
+ assert_eq ! ( next_announcements. len( ) , 0 ) ;
2638
+
2639
+ }
2522
2640
}
0 commit comments