Skip to content

Commit c117dd6

Browse files
fixup: check that service incoming channel is not force closed when client does not claim
1 parent 46b22d0 commit c117dd6

File tree

1 file changed

+55
-8
lines changed

1 file changed

+55
-8
lines changed

lightning-liquidity/tests/lsps2_integration_tests.rs

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ use common::{
88
};
99

1010
use lightning::check_added_monitors;
11-
use lightning::events::Event;
11+
use lightning::events::{ClosureReason, Event};
1212
use lightning::get_event_msg;
1313
use lightning::ln::channelmanager::PaymentId;
1414
use lightning::ln::channelmanager::Retry;
15-
use lightning::ln::functional_test_utils::create_chan_between_nodes_with_value;
1615
use lightning::ln::functional_test_utils::create_funding_transaction;
1716
use lightning::ln::functional_test_utils::do_commitment_signed_dance;
1817
use lightning::ln::functional_test_utils::expect_channel_pending_event;
1918
use lightning::ln::functional_test_utils::expect_channel_ready_event;
2019
use lightning::ln::functional_test_utils::expect_payment_sent;
2120
use lightning::ln::functional_test_utils::test_default_channel_config;
2221
use lightning::ln::functional_test_utils::SendEvent;
22+
use lightning::ln::functional_test_utils::{connect_blocks, create_chan_between_nodes_with_value};
2323
use lightning::ln::msgs::BaseMessageHandler;
2424
use lightning::ln::msgs::ChannelMessageHandler;
2525
use lightning::ln::msgs::MessageSendEvent;
@@ -1115,8 +1115,9 @@ fn client_trusts_lsp_end_to_end_test() {
11151115
};
11161116

11171117
// Check that before the client claims, the service node has not broadcasted anything
1118-
let events = service_node.liquidity_manager.get_and_clear_pending_events();
1119-
assert!(events.is_empty(), "Expected no events from service node, got: {:?}", events);
1118+
let broadcasted = service_node.inner.tx_broadcaster.txn_broadcasted.lock().unwrap();
1119+
assert!(broadcasted.is_empty(), "There should be no broadcasted txs yet");
1120+
drop(broadcasted);
11201121

11211122
client_node.inner.node.claim_funds(preimage.unwrap());
11221123

@@ -1728,10 +1729,56 @@ fn client_trusts_lsp_partial_fee_does_not_trigger_broadcast() {
17281729
let partial_skim_msat = fee_base_msat - 1; // less than promised fee
17291730
service_handler.payment_forwarded(channel_id, partial_skim_msat).unwrap();
17301731

1731-
let events_after_partial = service_node.liquidity_manager.get_and_clear_pending_events();
1732+
let broadcasted = service_node.inner.tx_broadcaster.txn_broadcasted.lock().unwrap();
1733+
assert!(broadcasted.is_empty(), "There should be no broadcasted txs yet");
1734+
drop(broadcasted);
1735+
1736+
// before mining blocks, service node should have 2 channels
1737+
{
1738+
let chans = service_node.inner.node.list_channels();
1739+
assert_eq!(chans.len(), 2);
1740+
assert!(chans.iter().any(|cd| cd.counterparty.node_id == payer_node_id));
1741+
assert!(chans.iter().any(|cd| cd.counterparty.node_id == client_node_id));
1742+
}
1743+
1744+
const SOME_EXTRA_BLOCKS: u32 = 3;
1745+
let client_htlc_cltv_expiry = pay_event.msgs[0].cltv_expiry;
1746+
let target_height = client_htlc_cltv_expiry.saturating_add(SOME_EXTRA_BLOCKS);
1747+
let cur_height = service_node.inner.best_block_info().1;
1748+
let d = target_height - cur_height;
1749+
connect_blocks(&service_node.inner, d);
1750+
connect_blocks(&client_node.inner, d);
1751+
connect_blocks(&payer_node, d);
1752+
1753+
service_node.inner.node.process_pending_htlc_forwards();
1754+
client_node.inner.node.process_pending_htlc_forwards();
1755+
1756+
let svc_events = service_node.inner.node.get_and_clear_pending_events();
1757+
let _ = client_node.inner.node.get_and_clear_pending_events();
1758+
let closed_on_service = svc_events.iter().any(|ev| {
1759+
matches!(ev, Event::ChannelClosed { reason: ClosureReason::HTLCsTimedOut { .. }, .. })
1760+
});
17321761
assert!(
1733-
events_after_partial.is_empty(),
1734-
"Funding tx broadcast event emitted prematurely: {:?}",
1735-
events_after_partial
1762+
closed_on_service,
1763+
"Expected service->client channel to be force-closed due to HTLC timeout. svc_events = {:?}",
1764+
svc_events
17361765
);
1766+
1767+
// now check the service->payer channel
1768+
{
1769+
let chans = service_node.inner.node.list_channels();
1770+
assert!(chans.len() == 1);
1771+
assert!(
1772+
chans.iter().any(|cd| cd.counterparty.node_id == payer_node_id && cd.is_channel_ready),
1773+
"Expected payer->service channel to remain open. channels: {:?}",
1774+
chans
1775+
);
1776+
}
1777+
1778+
service_node.inner.node.get_and_clear_pending_msg_events();
1779+
client_node.inner.node.get_and_clear_pending_msg_events();
1780+
payer_node.node.get_and_clear_pending_msg_events();
1781+
service_node.inner.chain_monitor.added_monitors.lock().unwrap().clear();
1782+
client_node.inner.chain_monitor.added_monitors.lock().unwrap().clear();
1783+
payer_node.chain_monitor.added_monitors.lock().unwrap().clear();
17371784
}

0 commit comments

Comments
 (0)