Skip to content

Commit 4258750

Browse files
committed
Add tests for getting next channel announcements
1 parent c8a1460 commit 4258750

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed

lightning/src/ln/router.rs

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2384,5 +2384,136 @@ mod tests {
23842384
// TODO: Test HTLCFailChannelUpdate::NodeFailure, which is not implemented yet.
23852385
}
23862386

2387+
#[test]
2388+
fn getting_next_channel_announcements() {
2389+
let (secp_ctx, _, router) = create_router();
2390+
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
2391+
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
2392+
let node_id_1 = PublicKey::from_secret_key(&secp_ctx, node_1_privkey);
2393+
let node_id_2 = PublicKey::from_secret_key(&secp_ctx, node_2_privkey);
2394+
let node_1_btckey = &SecretKey::from_slice(&[40; 32]).unwrap();
2395+
let node_2_btckey = &SecretKey::from_slice(&[39; 32]).unwrap();
2396+
2397+
let short_channel_id = 1;
2398+
let chain_hash = genesis_block(Network::Testnet).header.bitcoin_hash();
2399+
let channel_key = NetworkMap::get_key(short_channel_id, chain_hash);
2400+
2401+
// Channels were not announced yet.
2402+
let channels_with_announcements = router.get_next_channel_announcements(0, 1);
2403+
assert_eq!(channels_with_announcements.len(), 0);
2404+
2405+
{
2406+
// Announce a channel we will update
2407+
let unsigned_announcement = UnsignedChannelAnnouncement {
2408+
features: ChannelFeatures::empty(),
2409+
chain_hash,
2410+
short_channel_id,
2411+
node_id_1,
2412+
node_id_2,
2413+
bitcoin_key_1: PublicKey::from_secret_key(&secp_ctx, node_1_btckey),
2414+
bitcoin_key_2: PublicKey::from_secret_key(&secp_ctx, node_2_btckey),
2415+
excess_data: Vec::new(),
2416+
};
23872417

2418+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2419+
let valid_channel_announcement = ChannelAnnouncement {
2420+
node_signature_1: secp_ctx.sign(&msghash, node_1_privkey),
2421+
node_signature_2: secp_ctx.sign(&msghash, node_2_privkey),
2422+
bitcoin_signature_1: secp_ctx.sign(&msghash, node_1_btckey),
2423+
bitcoin_signature_2: secp_ctx.sign(&msghash, node_2_btckey),
2424+
contents: unsigned_announcement.clone(),
2425+
};
2426+
match router.handle_channel_announcement(&valid_channel_announcement) {
2427+
Ok(_) => (),
2428+
Err(_) => panic!()
2429+
};
2430+
}
2431+
2432+
// Contains initial channel announcement now.
2433+
let channels_with_announcements = router.get_next_channel_announcements(channel_key, 1);
2434+
assert_eq!(channels_with_announcements.len(), 1);
2435+
if let Some(channel_announcements) = channels_with_announcements.first() {
2436+
let &(_, ref update_1, ref update_2) = channel_announcements;
2437+
assert_eq!(update_1, &None);
2438+
assert_eq!(update_2, &None);
2439+
} else {
2440+
panic!();
2441+
}
2442+
2443+
2444+
{
2445+
// Valid channel update
2446+
let unsigned_channel_update = UnsignedChannelUpdate {
2447+
chain_hash,
2448+
short_channel_id,
2449+
timestamp: 101,
2450+
flags: 0,
2451+
cltv_expiry_delta: 144,
2452+
htlc_minimum_msat: 1000000,
2453+
fee_base_msat: 10000,
2454+
fee_proportional_millionths: 20,
2455+
excess_data: Vec::new()
2456+
};
2457+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2458+
let valid_channel_update = ChannelUpdate {
2459+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2460+
contents: unsigned_channel_update.clone()
2461+
};
2462+
match router.handle_channel_update(&valid_channel_update) {
2463+
Ok(_) => (),
2464+
Err(_) => panic!()
2465+
};
2466+
}
2467+
2468+
// Now contains an initial announcement and an update.
2469+
let channels_with_announcements = router.get_next_channel_announcements(channel_key, 1);
2470+
assert_eq!(channels_with_announcements.len(), 1);
2471+
if let Some(channel_announcements) = channels_with_announcements.first() {
2472+
let &(_, ref update_1, ref update_2) = channel_announcements;
2473+
assert_ne!(update_1, &None);
2474+
assert_eq!(update_2, &None);
2475+
} else {
2476+
panic!();
2477+
}
2478+
2479+
2480+
{
2481+
// Channel update with excess data.
2482+
let unsigned_channel_update = UnsignedChannelUpdate {
2483+
chain_hash,
2484+
short_channel_id,
2485+
timestamp: 102,
2486+
flags: 0,
2487+
cltv_expiry_delta: 144,
2488+
htlc_minimum_msat: 1000000,
2489+
fee_base_msat: 10000,
2490+
fee_proportional_millionths: 20,
2491+
excess_data: [1; 3].to_vec()
2492+
};
2493+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_channel_update.encode()[..])[..]);
2494+
let valid_channel_update = ChannelUpdate {
2495+
signature: secp_ctx.sign(&msghash, node_1_privkey),
2496+
contents: unsigned_channel_update.clone()
2497+
};
2498+
match router.handle_channel_update(&valid_channel_update) {
2499+
Ok(_) => (),
2500+
Err(_) => panic!()
2501+
};
2502+
}
2503+
2504+
// Test that announcements with excess data won't be returned
2505+
let channels_with_announcements = router.get_next_channel_announcements(channel_key, 1);
2506+
assert_eq!(channels_with_announcements.len(), 1);
2507+
if let Some(channel_announcements) = channels_with_announcements.first() {
2508+
let &(_, ref update_1, ref update_2) = channel_announcements;
2509+
assert_eq!(update_1, &None);
2510+
assert_eq!(update_2, &None);
2511+
} else {
2512+
panic!();
2513+
}
2514+
2515+
// Further starting point have no channels after it
2516+
let channels_with_announcements = router.get_next_channel_announcements(channel_key + 1000, 1);
2517+
assert_eq!(channels_with_announcements.len(), 0);
2518+
}
23882519
}

0 commit comments

Comments
 (0)