@@ -11,8 +11,9 @@ use common::{
1111 do_channel_full_cycle, expect_channel_pending_event, expect_channel_ready_event, expect_event,
1212 expect_payment_received_event, expect_payment_successful_event, generate_blocks_and_wait,
1313 logging:: { init_log_logger, validate_log_entry, TestLogWriter } ,
14- open_channel, premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd,
15- setup_builder, setup_node, setup_two_nodes, wait_for_tx, TestChainSource , TestSyncStore ,
14+ open_channel, premine_and_distribute_funds, random_config, random_listening_addresses,
15+ setup_bitcoind_and_electrsd, setup_builder, setup_node, setup_two_nodes, wait_for_tx,
16+ TestChainSource , TestSyncStore ,
1617} ;
1718
1819use ldk_node:: config:: EsploraSyncConfig ;
@@ -24,6 +25,7 @@ use ldk_node::payment::{
2425use ldk_node:: { Builder , Event , NodeError } ;
2526
2627use lightning:: ln:: channelmanager:: PaymentId ;
28+ use lightning:: routing:: gossip:: { NodeAlias , NodeId } ;
2729use lightning:: util:: persist:: KVStore ;
2830
2931use bitcoincore_rpc:: RpcApi ;
@@ -885,6 +887,97 @@ fn simple_bolt12_send_receive() {
885887 assert_eq ! ( node_a_payments. first( ) . unwrap( ) . amount_msat, Some ( overpaid_amount) ) ;
886888}
887889
890+ #[ test]
891+ fn test_node_announcement_propagation ( ) {
892+ let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
893+ let chain_source = TestChainSource :: Esplora ( & electrsd) ;
894+
895+ // Node A will use both listening and announcement addresses
896+ let mut config_a = random_config ( true ) ;
897+ let node_a_alias_string = "ldk-node-a" . to_string ( ) ;
898+ let mut node_a_alias_bytes = [ 0u8 ; 32 ] ;
899+ node_a_alias_bytes[ ..node_a_alias_string. as_bytes ( ) . len ( ) ]
900+ . copy_from_slice ( node_a_alias_string. as_bytes ( ) ) ;
901+ let node_a_node_alias = Some ( NodeAlias ( node_a_alias_bytes) ) ;
902+ let node_a_announcement_addresses = random_listening_addresses ( ) ;
903+ config_a. node_config . node_alias = node_a_node_alias. clone ( ) ;
904+ config_a. node_config . listening_addresses = Some ( random_listening_addresses ( ) ) ;
905+ config_a. node_config . announcement_addresses = Some ( node_a_announcement_addresses. clone ( ) ) ;
906+
907+ // Node B will only use listening addresses
908+ let mut config_b = random_config ( true ) ;
909+ let node_b_alias_string = "ldk-node-b" . to_string ( ) ;
910+ let mut node_b_alias_bytes = [ 0u8 ; 32 ] ;
911+ node_b_alias_bytes[ ..node_b_alias_string. as_bytes ( ) . len ( ) ]
912+ . copy_from_slice ( node_b_alias_string. as_bytes ( ) ) ;
913+ let node_b_node_alias = Some ( NodeAlias ( node_b_alias_bytes) ) ;
914+ let node_b_listening_addresses = random_listening_addresses ( ) ;
915+ config_b. node_config . node_alias = node_b_node_alias. clone ( ) ;
916+ config_b. node_config . listening_addresses = Some ( node_b_listening_addresses. clone ( ) ) ;
917+ config_b. node_config . announcement_addresses = None ;
918+
919+ let node_a = setup_node ( & chain_source, config_a, None ) ;
920+ let node_b = setup_node ( & chain_source, config_b, None ) ;
921+
922+ let address_a = node_a. onchain_payment ( ) . new_address ( ) . unwrap ( ) ;
923+ let premine_amount_sat = 5_000_000 ;
924+ premine_and_distribute_funds (
925+ & bitcoind. client ,
926+ & electrsd. client ,
927+ vec ! [ address_a] ,
928+ Amount :: from_sat ( premine_amount_sat) ,
929+ ) ;
930+
931+ node_a. sync_wallets ( ) . unwrap ( ) ;
932+
933+ // Open an announced channel from node_a to node_b
934+ open_channel ( & node_a, & node_b, 4_000_000 , true , & electrsd) ;
935+
936+ generate_blocks_and_wait ( & bitcoind. client , & electrsd. client , 6 ) ;
937+
938+ node_a. sync_wallets ( ) . unwrap ( ) ;
939+ node_b. sync_wallets ( ) . unwrap ( ) ;
940+
941+ expect_channel_ready_event ! ( node_a, node_b. node_id( ) ) ;
942+ expect_channel_ready_event ! ( node_b, node_a. node_id( ) ) ;
943+
944+ // Wait until node_b broadcasts a node announcement
945+ while node_b. status ( ) . latest_node_announcement_broadcast_timestamp . is_none ( ) {
946+ std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 10 ) ) ;
947+ }
948+
949+ // Sleep to make sure the node announcement propagates
950+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) ;
951+
952+ // Get node info from the other node's perspective
953+ let node_a_info = node_b. network_graph ( ) . node ( & NodeId :: from_pubkey ( & node_a. node_id ( ) ) ) . unwrap ( ) ;
954+ let node_a_announcement_info = node_a_info. announcement_info . as_ref ( ) . unwrap ( ) ;
955+
956+ let node_b_info = node_a. network_graph ( ) . node ( & NodeId :: from_pubkey ( & node_b. node_id ( ) ) ) . unwrap ( ) ;
957+ let node_b_announcement_info = node_b_info. announcement_info . as_ref ( ) . unwrap ( ) ;
958+
959+ // Assert that the aliases and addresses match the expected values
960+ #[ cfg( not( feature = "uniffi" ) ) ]
961+ assert_eq ! ( node_a_announcement_info. alias( ) , & node_a_node_alias. unwrap( ) ) ;
962+ #[ cfg( feature = "uniffi" ) ]
963+ assert_eq ! ( node_a_announcement_info. alias, node_a_alias_string) ;
964+
965+ #[ cfg( not( feature = "uniffi" ) ) ]
966+ assert_eq ! ( node_a_announcement_info. addresses( ) , & node_a_announcement_addresses) ;
967+ #[ cfg( feature = "uniffi" ) ]
968+ assert_eq ! ( node_a_announcement_info. addresses, node_a_announcement_addresses) ;
969+
970+ #[ cfg( not( feature = "uniffi" ) ) ]
971+ assert_eq ! ( node_b_announcement_info. alias( ) , & node_b_node_alias. unwrap( ) ) ;
972+ #[ cfg( feature = "uniffi" ) ]
973+ assert_eq ! ( node_b_announcement_info. alias, node_b_alias_string) ;
974+
975+ #[ cfg( not( feature = "uniffi" ) ) ]
976+ assert_eq ! ( node_b_announcement_info. addresses( ) , & node_b_listening_addresses) ;
977+ #[ cfg( feature = "uniffi" ) ]
978+ assert_eq ! ( node_b_announcement_info. addresses, node_b_listening_addresses) ;
979+ }
980+
888981#[ test]
889982fn generate_bip21_uri ( ) {
890983 let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
0 commit comments