Skip to content

Commit 2ed836b

Browse files
committed
Add tests for handling htlc fail channel updates
1 parent b6036e1 commit 2ed836b

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;
@@ -2294,4 +2294,85 @@ mod tests {
22942294
};
22952295

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

0 commit comments

Comments
 (0)