@@ -2616,6 +2616,8 @@ where
26162616					// it does not exist for this peer. Either way, we can attempt to force-close it.
26172617					//
26182618					// An appropriate error will be returned for non-existence of the channel if that's the case.
2619+ 					mem::drop(peer_state_lock);
2620+ 					mem::drop(per_peer_state);
26192621					return self.force_close_channel_with_peer(&channel_id, counterparty_node_id, None, false).map(|_| ())
26202622				},
26212623			}
@@ -4001,7 +4003,7 @@ where
40014003		for channel_id in channel_ids {
40024004			if !peer_state.has_channel(channel_id) {
40034005				return Err(APIError::ChannelUnavailable {
4004- 					err: format!("Channel with ID  {} was  not found for the passed counterparty_node_id  {}", channel_id, counterparty_node_id),
4006+ 					err: format!("Channel with id  {} not found for the passed counterparty node_id  {}", channel_id, counterparty_node_id),
40054007				});
40064008			};
40074009		}
@@ -4112,7 +4114,7 @@ where
41124114						next_hop_channel_id, next_node_id)
41134115				}),
41144116				None => return Err(APIError::ChannelUnavailable {
4115- 					err: format!("Channel with id {} not found for the passed counterparty node_id {}. ",
4117+ 					err: format!("Channel with id {} not found for the passed counterparty node_id {}",
41164118						next_hop_channel_id, next_node_id)
41174119				})
41184120			}
@@ -10750,6 +10752,16 @@ mod tests {
1075010752		check_api_error_message(expected_message, res_err)
1075110753	}
1075210754
10755+ 	fn check_channel_unavailable_error<T>(res_err: Result<T, APIError>, expected_channel_id: ChannelId, peer_node_id: PublicKey) {
10756+ 		let expected_message = format!("Channel with id {} not found for the passed counterparty node_id {}", expected_channel_id, peer_node_id);
10757+ 		check_api_error_message(expected_message, res_err)
10758+ 	}
10759+ 
10760+ 	fn check_api_misuse_error<T>(res_err: Result<T, APIError>) {
10761+ 		let expected_message = "No such channel awaiting to be accepted.".to_string();
10762+ 		check_api_error_message(expected_message, res_err)
10763+ 	}
10764+ 
1075310765	fn check_api_error_message<T>(expected_err_message: String, res_err: Result<T, APIError>) {
1075410766		match res_err {
1075510767			Err(APIError::APIMisuseError { err }) => {
@@ -10794,6 +10806,36 @@ mod tests {
1079410806		check_unkown_peer_error(nodes[0].node.update_channel_config(&unkown_public_key, &[channel_id], &ChannelConfig::default()), unkown_public_key);
1079510807	}
1079610808
10809+ 	#[test]
10810+ 	fn test_api_calls_with_unavailable_channel() {
10811+ 		// Tests that our API functions that expects a `counterparty_node_id` and a `channel_id`
10812+ 		// as input, behaves as expected if the `counterparty_node_id` is a known peer in the
10813+ 		// `ChannelManager::per_peer_state` map, but the peer state doesn't contain a channel with
10814+ 		// the given `channel_id`.
10815+ 		let chanmon_cfg = create_chanmon_cfgs(2);
10816+ 		let node_cfg = create_node_cfgs(2, &chanmon_cfg);
10817+ 		let node_chanmgr = create_node_chanmgrs(2, &node_cfg, &[None, None]);
10818+ 		let nodes = create_network(2, &node_cfg, &node_chanmgr);
10819+ 
10820+ 		let counterparty_node_id = nodes[1].node.get_our_node_id();
10821+ 
10822+ 		// Dummy values
10823+ 		let channel_id = ChannelId::from_bytes([4; 32]);
10824+ 
10825+ 		// Test the API functions.
10826+ 		check_api_misuse_error(nodes[0].node.accept_inbound_channel(&channel_id, &counterparty_node_id, 42));
10827+ 
10828+ 		check_channel_unavailable_error(nodes[0].node.close_channel(&channel_id, &counterparty_node_id), channel_id, counterparty_node_id);
10829+ 
10830+ 		check_channel_unavailable_error(nodes[0].node.force_close_broadcasting_latest_txn(&channel_id, &counterparty_node_id), channel_id, counterparty_node_id);
10831+ 
10832+ 		check_channel_unavailable_error(nodes[0].node.force_close_without_broadcasting_txn(&channel_id, &counterparty_node_id), channel_id, counterparty_node_id);
10833+ 
10834+ 		check_channel_unavailable_error(nodes[0].node.forward_intercepted_htlc(InterceptId([0; 32]), &channel_id, counterparty_node_id, 1_000_000), channel_id, counterparty_node_id);
10835+ 
10836+ 		check_channel_unavailable_error(nodes[0].node.update_channel_config(&counterparty_node_id, &[channel_id], &ChannelConfig::default()), channel_id, counterparty_node_id);
10837+ 	}
10838+ 
1079710839	#[test]
1079810840	fn test_connection_limiting() {
1079910841		// Test that we limit un-channel'd peers and un-funded channels properly.
0 commit comments