Skip to content

Commit 5432ed8

Browse files
committed
Add test for announcement address propagation
A new integration test that configures nodes using the new announcement addresses configuration. Ensures that both nodes receive the correct alias and address for nodes using and not using this new feature.
1 parent e260744 commit 5432ed8

File tree

1 file changed

+95
-2
lines changed

1 file changed

+95
-2
lines changed

tests/integration_tests_rust.rs

+95-2
Original file line numberDiff line numberDiff line change
@@ -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

1819
use ldk_node::config::EsploraSyncConfig;
@@ -24,6 +25,7 @@ use ldk_node::payment::{
2425
use ldk_node::{Builder, Event, NodeError};
2526

2627
use lightning::ln::channelmanager::PaymentId;
28+
use lightning::routing::gossip::{NodeAlias, NodeId};
2729
use lightning::util::persist::KVStore;
2830

2931
use 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]
889982
fn generate_bip21_uri() {
890983
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();

0 commit comments

Comments
 (0)