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