Skip to content

Commit 742bcb7

Browse files
committed
Add tests for handling htlc fail channel updates
1 parent 93528c9 commit 742bcb7

File tree

1 file changed

+82
-1
lines changed

1 file changed

+82
-1
lines changed

lightning/src/ln/router.rs

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,7 @@ mod tests {
10581058
use ln::router::{Router,NodeInfo,NetworkMap,ChannelInfo,DirectionalChannelInfo,RouteHint};
10591059
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
10601060
use ln::msgs::{ErrorAction, LightningError, RoutingMessageHandler, UnsignedNodeAnnouncement, NodeAnnouncement,
1061-
UnsignedChannelAnnouncement, ChannelAnnouncement, UnsignedChannelUpdate, ChannelUpdate};
1061+
UnsignedChannelAnnouncement, ChannelAnnouncement, UnsignedChannelUpdate, ChannelUpdate, HTLCFailChannelUpdate};
10621062
use util::test_utils;
10631063
use util::test_utils::TestVecWriter;
10641064
use util::logger::Logger;
@@ -2297,4 +2297,85 @@ mod tests {
22972297
};
22982298

22992299
}
2300+
2301+
#[test]
2302+
fn handling_htlc_fail_channel_update() {
2303+
let (secp_ctx, _, router) = create_router();
2304+
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
2305+
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
2306+
let node_id_1 = PublicKey::from_secret_key(&secp_ctx, node_1_privkey);
2307+
let node_id_2 = PublicKey::from_secret_key(&secp_ctx, node_2_privkey);
2308+
let node_1_btckey = &SecretKey::from_slice(&[40; 32]).unwrap();
2309+
let node_2_btckey = &SecretKey::from_slice(&[39; 32]).unwrap();
2310+
2311+
let short_channel_id = 0;
2312+
let chain_hash = genesis_block(Network::Testnet).header.bitcoin_hash();
2313+
let channel_key = NetworkMap::get_key(short_channel_id, chain_hash);
2314+
2315+
{
2316+
// Announce a channel we will update
2317+
let unsigned_announcement = UnsignedChannelAnnouncement {
2318+
features: ChannelFeatures::empty(),
2319+
chain_hash,
2320+
short_channel_id,
2321+
node_id_1,
2322+
node_id_2,
2323+
bitcoin_key_1: PublicKey::from_secret_key(&secp_ctx, node_1_btckey),
2324+
bitcoin_key_2: PublicKey::from_secret_key(&secp_ctx, node_2_btckey),
2325+
excess_data: Vec::new(),
2326+
};
2327+
2328+
let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2329+
let valid_channel_announcement = ChannelAnnouncement {
2330+
node_signature_1: secp_ctx.sign(&msghash, node_1_privkey),
2331+
node_signature_2: secp_ctx.sign(&msghash, node_2_privkey),
2332+
bitcoin_signature_1: secp_ctx.sign(&msghash, node_1_btckey),
2333+
bitcoin_signature_2: secp_ctx.sign(&msghash, node_2_btckey),
2334+
contents: unsigned_announcement.clone(),
2335+
};
2336+
match router.handle_channel_announcement(&valid_channel_announcement) {
2337+
Ok(_) => (),
2338+
Err(_) => panic!()
2339+
};
2340+
2341+
}
2342+
2343+
let channel_close_msg = HTLCFailChannelUpdate::ChannelClosed {
2344+
short_channel_id,
2345+
is_permanent: false
2346+
};
2347+
2348+
router.handle_htlc_fail_channel_update(&channel_close_msg);
2349+
2350+
{
2351+
// Non-permanent closing just disables a channel
2352+
let network = router.network_map.write().unwrap();
2353+
match network.channels.get(&channel_key) {
2354+
None => panic!(),
2355+
Some(channel_info) => {
2356+
assert!(!channel_info.one_to_two.enabled);
2357+
assert!(!channel_info.two_to_one.enabled);
2358+
}
2359+
}
2360+
}
2361+
2362+
let channel_close_msg = HTLCFailChannelUpdate::ChannelClosed {
2363+
short_channel_id,
2364+
is_permanent: true
2365+
};
2366+
2367+
router.handle_htlc_fail_channel_update(&channel_close_msg);
2368+
2369+
{
2370+
// Permanent closing deletes a channel
2371+
let network = router.network_map.write().unwrap();
2372+
assert_eq!(network.channels.len(), 0);
2373+
// Nodes are also deleted because there are no associated channels anymore
2374+
assert_eq!(network.nodes.len(), 1);
2375+
}
2376+
2377+
// TODO: Test HTLCFailChannelUpdate::NodeFailure, which is not implemented yet.
2378+
}
2379+
2380+
23002381
}

0 commit comments

Comments
 (0)