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