@@ -61,6 +61,8 @@ use crate::sync::{Arc, Mutex};
61
61
use crate::ln::functional_test_utils::*;
62
62
use crate::ln::chan_utils::CommitmentTransaction;
63
63
64
+ use super::channel::PENDING_CHANNEL_AGE_LIMIT_TICKS;
65
+
64
66
#[test]
65
67
fn test_insane_channel_opens() {
66
68
// Stand up a network of 2 nodes
@@ -10017,3 +10019,89 @@ fn test_disconnects_peer_awaiting_response_ticks() {
10017
10019
}
10018
10020
}
10019
10021
}
10022
+
10023
+ #[test]
10024
+ fn test_remove_expired_outbound_pending_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..PENDING_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_pending_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..PENDING_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