@@ -61,6 +61,8 @@ use crate::sync::{Arc, Mutex};
6161use crate::ln::functional_test_utils::*;
6262use crate::ln::chan_utils::CommitmentTransaction;
6363
64+ use super::channel::UNFUNDED_CHANNEL_AGE_LIMIT_TICKS;
65+
6466#[test]
6567fn test_insane_channel_opens() {
6668 // Stand up a network of 2 nodes
@@ -10017,3 +10019,89 @@ fn test_disconnects_peer_awaiting_response_ticks() {
1001710019 }
1001810020 }
1001910021}
10022+
10023+ #[test]
10024+ fn test_remove_expired_outbound_unfunded_channels() {
10025+ let chanmon_cfgs = create_chanmon_cfgs(2);
10026+ let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
10027+ let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
10028+ let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
10029+
10030+ let temp_channel_id = nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100_000, 0, 42, None).unwrap();
10031+ let open_channel_message = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
10032+ nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), &open_channel_message);
10033+ let accept_channel_message = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
10034+ nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), &accept_channel_message);
10035+
10036+ let events = nodes[0].node.get_and_clear_pending_events();
10037+ assert_eq!(events.len(), 1);
10038+ match events[0] {
10039+ Event::FundingGenerationReady { .. } => (),
10040+ _ => panic!("Unexpected event"),
10041+ };
10042+
10043+ // Asserts the outbound channel has been removed from a nodes[0]'s peer state map.
10044+ let check_outbound_channel_existence = |should_exist: bool| {
10045+ let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
10046+ let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
10047+ assert_eq!(chan_lock.outbound_v1_channel_by_id.contains_key(&temp_channel_id), should_exist);
10048+ };
10049+
10050+ // Channel should exist without any timer ticks.
10051+ check_outbound_channel_existence(true);
10052+
10053+ // Channel should exist with 1 timer tick less than required.
10054+ for _ in 0..UNFUNDED_CHANNEL_AGE_LIMIT_TICKS - 1 {
10055+ nodes[0].node.timer_tick_occurred();
10056+ check_outbound_channel_existence(true)
10057+ }
10058+
10059+ // Remove channel after reaching the required ticks.
10060+ nodes[0].node.timer_tick_occurred();
10061+ check_outbound_channel_existence(false);
10062+
10063+ check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed);
10064+ }
10065+
10066+ #[test]
10067+ fn test_remove_expired_inbound_unfunded_channels() {
10068+ let chanmon_cfgs = create_chanmon_cfgs(2);
10069+ let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
10070+ let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
10071+ let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
10072+
10073+ let temp_channel_id = nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100_000, 0, 42, None).unwrap();
10074+ let open_channel_message = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
10075+ nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), &open_channel_message);
10076+ let accept_channel_message = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
10077+ nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), &accept_channel_message);
10078+
10079+ let events = nodes[0].node.get_and_clear_pending_events();
10080+ assert_eq!(events.len(), 1);
10081+ match events[0] {
10082+ Event::FundingGenerationReady { .. } => (),
10083+ _ => panic!("Unexpected event"),
10084+ };
10085+
10086+ // Asserts the inbound channel has been removed from a nodes[1]'s peer state map.
10087+ let check_inbound_channel_existence = |should_exist: bool| {
10088+ let per_peer_state = nodes[1].node.per_peer_state.read().unwrap();
10089+ let chan_lock = per_peer_state.get(&nodes[0].node.get_our_node_id()).unwrap().lock().unwrap();
10090+ assert_eq!(chan_lock.inbound_v1_channel_by_id.contains_key(&temp_channel_id), should_exist);
10091+ };
10092+
10093+ // Channel should exist without any timer ticks.
10094+ check_inbound_channel_existence(true);
10095+
10096+ // Channel should exist with 1 timer tick less than required.
10097+ for _ in 0..UNFUNDED_CHANNEL_AGE_LIMIT_TICKS - 1 {
10098+ nodes[1].node.timer_tick_occurred();
10099+ check_inbound_channel_existence(true)
10100+ }
10101+
10102+ // Remove channel after reaching the required ticks.
10103+ nodes[1].node.timer_tick_occurred();
10104+ check_inbound_channel_existence(false);
10105+
10106+ check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
10107+ }
0 commit comments