Skip to content

Commit 312fd73

Browse files
fixup: simplify LSPS2 test setup and consolidate duplicate tests
1 parent 2bc54ec commit 312fd73

File tree

2 files changed

+61
-158
lines changed

2 files changed

+61
-158
lines changed

lightning-liquidity/tests/common/mod.rs

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use lightning::sign::EntropySource;
99

1010
use bitcoin::blockdata::constants::{genesis_block, ChainHash};
1111
use bitcoin::blockdata::transaction::Transaction;
12-
use bitcoin::secp256k1::SecretKey;
1312
use bitcoin::Network;
1413
use lightning::chain::channelmonitor::ANTI_REORG_DELAY;
1514
use lightning::chain::{chainmonitor, BestBlock, Confirm};
@@ -35,8 +34,6 @@ use lightning::util::persist::{
3534
SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
3635
};
3736
use lightning::util::test_utils;
38-
use lightning_liquidity::lsps2::client::{LSPS2ClientConfig, LSPS2ClientHandler};
39-
use lightning_liquidity::lsps2::service::{LSPS2ServiceConfig, LSPS2ServiceHandler};
4037
use lightning_liquidity::{LiquidityClientConfig, LiquidityManager, LiquidityServiceConfig};
4138
use lightning_persister::fs_store::FilesystemStore;
4239

@@ -70,7 +67,7 @@ type LockingWrapper<T> = lightning::routing::scoring::MultiThreadedLockableScore
7067
#[cfg(not(c_bindings))]
7168
type LockingWrapper<T> = std::sync::Mutex<T>;
7269

73-
type ChannelManager = channelmanager::ChannelManager<
70+
pub(crate) type ChannelManager = channelmanager::ChannelManager<
7471
Arc<ChainMonitor>,
7572
Arc<test_utils::TestBroadcaster>,
7673
Arc<KeysManager>,
@@ -490,7 +487,7 @@ pub(crate) fn create_liquidity_node(
490487
}
491488
}
492489

493-
fn create_service_and_client_nodes(
490+
pub(crate) fn create_service_and_client_nodes(
494491
persist_dir: &str, service_config: LiquidityServiceConfig, client_config: LiquidityClientConfig,
495492
) -> (Node, Node) {
496493
let persist_temp_path = env::temp_dir().join(persist_dir);
@@ -674,53 +671,3 @@ fn advance_chain(node: &mut Node, num_blocks: u32) {
674671
}
675672
}
676673
}
677-
678-
pub(crate) fn setup_test_lsps2() -> (
679-
&'static LSPS2ClientHandler<Arc<KeysManager>>,
680-
&'static LSPS2ServiceHandler<Arc<ChannelManager>>,
681-
bitcoin::secp256k1::PublicKey,
682-
bitcoin::secp256k1::PublicKey,
683-
&'static Node,
684-
&'static Node,
685-
[u8; 32],
686-
) {
687-
let promise_secret = [42; 32];
688-
let signing_key = SecretKey::from_slice(&promise_secret).unwrap();
689-
let lsps2_service_config = LSPS2ServiceConfig { promise_secret };
690-
let service_config = LiquidityServiceConfig {
691-
#[cfg(lsps1_service)]
692-
lsps1_service_config: None,
693-
lsps2_service_config: Some(lsps2_service_config),
694-
advertise_service: true,
695-
};
696-
697-
let lsps2_client_config = LSPS2ClientConfig::default();
698-
let client_config = LiquidityClientConfig {
699-
lsps1_client_config: None,
700-
lsps2_client_config: Some(lsps2_client_config),
701-
};
702-
703-
let (service_node, client_node) =
704-
create_service_and_client_nodes("webhook_registration_flow", service_config, client_config);
705-
706-
// Leak the nodes to extend their lifetime to 'static since this is test code
707-
let service_node = Box::leak(Box::new(service_node));
708-
let client_node = Box::leak(Box::new(client_node));
709-
710-
let client_handler = client_node.liquidity_manager.lsps2_client_handler().unwrap();
711-
let service_handler = service_node.liquidity_manager.lsps2_service_handler().unwrap();
712-
713-
let secp = bitcoin::secp256k1::Secp256k1::new();
714-
let service_node_id = bitcoin::secp256k1::PublicKey::from_secret_key(&secp, &signing_key);
715-
let client_node_id = client_node.channel_manager.get_our_node_id();
716-
717-
(
718-
client_handler,
719-
service_handler,
720-
service_node_id,
721-
client_node_id,
722-
service_node,
723-
client_node,
724-
promise_secret,
725-
)
726-
}

lightning-liquidity/tests/lsps2_integration_tests.rs

Lines changed: 59 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
mod common;
44

5-
use common::{get_lsps_message, setup_test_lsps2, Node};
5+
use common::{create_service_and_client_nodes, get_lsps_message, Node};
66

77
use lightning_liquidity::events::LiquidityEvent;
88
use lightning_liquidity::lsps0::ser::LSPSDateTime;
9+
use lightning_liquidity::lsps2::client::LSPS2ClientConfig;
910
use lightning_liquidity::lsps2::event::{LSPS2ClientEvent, LSPS2ServiceEvent};
1011
use lightning_liquidity::lsps2::msgs::LSPS2RawOpeningFeeParams;
12+
use lightning_liquidity::lsps2::service::LSPS2ServiceConfig;
1113
use lightning_liquidity::lsps2::utils::is_valid_opening_fee_params;
1214

1315
use lightning::ln::channelmanager::{InterceptId, MIN_FINAL_CLTV_EXPIRY_DELTA};
@@ -19,15 +21,44 @@ use lightning::util::logger::Logger;
1921

2022
use lightning_invoice::{Bolt11Invoice, InvoiceBuilder, RoutingFees};
2123

24+
use lightning_liquidity::{LiquidityClientConfig, LiquidityServiceConfig};
2225
use lightning_types::payment::PaymentHash;
2326

2427
use bitcoin::hashes::{sha256, Hash};
25-
use bitcoin::secp256k1::{PublicKey, Secp256k1};
28+
use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
2629
use bitcoin::Network;
2730

2831
use std::str::FromStr;
2932
use std::time::Duration;
3033

34+
fn setup_test_lsps2(
35+
) -> (bitcoin::secp256k1::PublicKey, bitcoin::secp256k1::PublicKey, Node, Node, [u8; 32]) {
36+
let promise_secret = [42; 32];
37+
let signing_key = SecretKey::from_slice(&promise_secret).unwrap();
38+
let lsps2_service_config = LSPS2ServiceConfig { promise_secret };
39+
let service_config = LiquidityServiceConfig {
40+
#[cfg(lsps1_service)]
41+
lsps1_service_config: None,
42+
lsps2_service_config: Some(lsps2_service_config),
43+
advertise_service: true,
44+
};
45+
46+
let lsps2_client_config = LSPS2ClientConfig::default();
47+
let client_config = LiquidityClientConfig {
48+
lsps1_client_config: None,
49+
lsps2_client_config: Some(lsps2_client_config),
50+
};
51+
52+
let (service_node, client_node) =
53+
create_service_and_client_nodes("webhook_registration_flow", service_config, client_config);
54+
55+
let secp = bitcoin::secp256k1::Secp256k1::new();
56+
let service_node_id = bitcoin::secp256k1::PublicKey::from_secret_key(&secp, &signing_key);
57+
let client_node_id = client_node.channel_manager.get_our_node_id();
58+
59+
(service_node_id, client_node_id, service_node, client_node, promise_secret)
60+
}
61+
3162
fn create_jit_invoice(
3263
node: &Node, service_node_id: PublicKey, intercept_scid: u64, cltv_expiry_delta: u32,
3364
payment_size_msat: Option<u64>, description: &str, expiry_secs: u32,
@@ -82,15 +113,11 @@ fn create_jit_invoice(
82113

83114
#[test]
84115
fn invoice_generation_flow() {
85-
let (
86-
client_handler,
87-
service_handler,
88-
service_node_id,
89-
client_node_id,
90-
service_node,
91-
client_node,
92-
promise_secret,
93-
) = setup_test_lsps2();
116+
let (service_node_id, client_node_id, service_node, client_node, promise_secret) =
117+
setup_test_lsps2();
118+
119+
let client_handler = client_node.liquidity_manager.lsps2_client_handler().unwrap();
120+
let service_handler = service_node.liquidity_manager.lsps2_service_handler().unwrap();
94121

95122
let get_info_request_id = client_handler.request_opening_params(service_node_id, None);
96123
let get_info_request = get_lsps_message!(client_node, service_node_id);
@@ -228,8 +255,9 @@ fn invoice_generation_flow() {
228255

229256
#[test]
230257
fn channel_open_failed() {
231-
let (_, service_handler, service_node_id, client_node_id, service_node, client_node, _) =
232-
setup_test_lsps2();
258+
let (service_node_id, client_node_id, service_node, client_node, _) = setup_test_lsps2();
259+
260+
let service_handler = service_node.liquidity_manager.lsps2_service_handler().unwrap();
233261

234262
let get_info_request_id = client_node
235263
.liquidity_manager
@@ -303,6 +331,16 @@ fn channel_open_failed() {
303331
client_node.liquidity_manager.handle_custom_message(buy_response, service_node_id).unwrap();
304332
let _invoice_params_event = client_node.liquidity_manager.next_event().unwrap();
305333

334+
// Test calling channel_open_failed in invalid state (before HTLC interception)
335+
let result = service_handler.channel_open_failed(&client_node_id, user_channel_id);
336+
assert!(result.is_err());
337+
match result.unwrap_err() {
338+
APIError::APIMisuseError { err } => {
339+
assert!(err.contains("Channel is not in the PendingChannelOpen state."));
340+
},
341+
other => panic!("Unexpected error type: {:?}", other),
342+
}
343+
306344
let htlc_amount_msat = 1_000_000;
307345
let intercept_id = InterceptId([0; 32]);
308346
let payment_hash = PaymentHash([1; 32]);
@@ -348,95 +386,11 @@ fn channel_open_failed() {
348386
};
349387
}
350388

351-
#[test]
352-
fn channel_open_failed_invalid_state() {
353-
let (_, service_handler, service_node_id, client_node_id, service_node, client_node, _) =
354-
setup_test_lsps2();
355-
356-
let get_info_request_id = client_node
357-
.liquidity_manager
358-
.lsps2_client_handler()
359-
.unwrap()
360-
.request_opening_params(service_node_id, None);
361-
let get_info_request = get_lsps_message!(client_node, service_node_id);
362-
service_node.liquidity_manager.handle_custom_message(get_info_request, client_node_id).unwrap();
363-
let _get_info_event = service_node.liquidity_manager.next_event().unwrap();
364-
365-
let raw_opening_params = LSPS2RawOpeningFeeParams {
366-
min_fee_msat: 100,
367-
proportional: 21,
368-
valid_until: LSPSDateTime::from_str("2035-05-20T08:30:45Z").unwrap(),
369-
min_lifetime: 144,
370-
max_client_to_self_delay: 128,
371-
min_payment_size_msat: 1,
372-
max_payment_size_msat: 100_000_000,
373-
};
374-
service_handler
375-
.opening_fee_params_generated(
376-
&client_node_id,
377-
get_info_request_id.clone(),
378-
vec![raw_opening_params],
379-
)
380-
.unwrap();
381-
382-
let get_info_response = get_lsps_message!(service_node, client_node_id);
383-
client_node
384-
.liquidity_manager
385-
.handle_custom_message(get_info_response, service_node_id)
386-
.unwrap();
387-
388-
let opening_fee_params = match client_node.liquidity_manager.next_event().unwrap() {
389-
LiquidityEvent::LSPS2Client(LSPS2ClientEvent::OpeningParametersReady {
390-
opening_fee_params_menu,
391-
..
392-
}) => opening_fee_params_menu.first().unwrap().clone(),
393-
_ => panic!("Unexpected event"),
394-
};
395-
396-
let payment_size_msat = Some(1_000_000);
397-
let buy_request_id = client_node
398-
.liquidity_manager
399-
.lsps2_client_handler()
400-
.unwrap()
401-
.select_opening_params(service_node_id, payment_size_msat, opening_fee_params.clone())
402-
.unwrap();
403-
let buy_request = get_lsps_message!(client_node, service_node_id);
404-
service_node.liquidity_manager.handle_custom_message(buy_request, client_node_id).unwrap();
405-
406-
let _buy_event = service_node.liquidity_manager.next_event().unwrap();
407-
let user_channel_id = 42;
408-
let cltv_expiry_delta = 144;
409-
let intercept_scid = service_node.channel_manager.get_intercept_scid();
410-
let client_trusts_lsp = true;
411-
412-
service_handler
413-
.invoice_parameters_generated(
414-
&client_node_id,
415-
buy_request_id.clone(),
416-
intercept_scid,
417-
cltv_expiry_delta,
418-
client_trusts_lsp,
419-
user_channel_id,
420-
)
421-
.unwrap();
422-
423-
// We're purposely not intercepting an HTLC, so the state remains PendingInitialPayment
424-
425-
// Try to call channel_open_failed, which should fail because the channel is not in PendingChannelOpen state
426-
let result = service_handler.channel_open_failed(&client_node_id, user_channel_id);
427-
428-
assert!(result.is_err());
429-
match result.unwrap_err() {
430-
APIError::APIMisuseError { err } => {
431-
assert!(err.contains("Channel is not in the PendingChannelOpen state."));
432-
},
433-
other => panic!("Unexpected error type: {:?}", other),
434-
}
435-
}
436-
437389
#[test]
438390
fn channel_open_failed_nonexistent_channel() {
439-
let (_, service_handler, _, client_node_id, _, _, _) = setup_test_lsps2();
391+
let (_, client_node_id, service_node, _, _) = setup_test_lsps2();
392+
393+
let service_handler = service_node.liquidity_manager.lsps2_service_handler().unwrap();
440394

441395
// Call channel_open_failed with a nonexistent user_channel_id
442396
let nonexistent_user_channel_id = 999;
@@ -453,8 +407,9 @@ fn channel_open_failed_nonexistent_channel() {
453407

454408
#[test]
455409
fn channel_open_abandoned() {
456-
let (_, service_handler, service_node_id, client_node_id, service_node, client_node, _) =
457-
setup_test_lsps2();
410+
let (service_node_id, client_node_id, service_node, client_node, _) = setup_test_lsps2();
411+
412+
let service_handler = service_node.liquidity_manager.lsps2_service_handler().unwrap();
458413

459414
// Set up a JIT channel
460415
let get_info_request_id = client_node
@@ -534,7 +489,8 @@ fn channel_open_abandoned() {
534489

535490
#[test]
536491
fn channel_open_abandoned_nonexistent_channel() {
537-
let (_, service_handler, _, client_node_id, _, _, _) = setup_test_lsps2();
492+
let (_, client_node_id, service_node, _, _) = setup_test_lsps2();
493+
let service_handler = service_node.liquidity_manager.lsps2_service_handler().unwrap();
538494

539495
// Call channel_open_abandoned with a nonexistent user_channel_id
540496
let nonexistent_user_channel_id = 999;

0 commit comments

Comments
 (0)