Skip to content

Commit f89a913

Browse files
Add tests for LSPS5 client and service.
1 parent 1be8081 commit f89a913

File tree

6 files changed

+1240
-27
lines changed

6 files changed

+1240
-27
lines changed

lightning-background-processor/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ all-features = true
1414
rustdoc-args = ["--cfg", "docsrs"]
1515

1616
[features]
17+
default = ["std", "time"]
1718
std = ["lightning/std", "lightning-liquidity/std", "bitcoin-io/std", "bitcoin_hashes/std"]
19+
time = ["std", "lightning-liquidity/time"]
1820

19-
default = ["std"]
2021

2122
[dependencies]
2223
bitcoin = { version = "0.32.2", default-features = false }

lightning-background-processor/src/lib.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
650650
/// # use std::sync::atomic::{AtomicBool, Ordering};
651651
/// # use std::time::SystemTime;
652652
/// # use lightning_background_processor::{process_events_async, GossipSync};
653+
/// # use lightning_liquidity::lsps5::service::TimeProvider;
653654
/// # struct Logger {}
654655
/// # impl lightning::util::logger::Logger for Logger {
655656
/// # fn log(&self, _record: lightning::util::logger::Record) {}
@@ -661,6 +662,16 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
661662
/// # fn remove(&self, primary_namespace: &str, secondary_namespace: &str, key: &str, lazy: bool) -> io::Result<()> { Ok(()) }
662663
/// # fn list(&self, primary_namespace: &str, secondary_namespace: &str) -> io::Result<Vec<String>> { Ok(Vec::new()) }
663664
/// # }
665+
/// #
666+
/// # use core::time::Duration;
667+
/// # struct DefaultTimeProvider;
668+
/// #
669+
/// # impl TimeProvider for DefaultTimeProvider {
670+
/// # fn duration_since_epoch(&self) -> Duration {
671+
/// # use std::time::{SystemTime, UNIX_EPOCH};
672+
/// # SystemTime::now().duration_since(UNIX_EPOCH).expect("system time before Unix epoch")
673+
/// # }
674+
/// # }
664675
/// # struct EventHandler {}
665676
/// # impl EventHandler {
666677
/// # async fn handle_event(&self, _: lightning::events::Event) -> Result<(), ReplayEvent> { Ok(()) }
@@ -676,7 +687,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
676687
/// # type P2PGossipSync<UL> = lightning::routing::gossip::P2PGossipSync<Arc<NetworkGraph>, Arc<UL>, Arc<Logger>>;
677688
/// # type ChannelManager<B, F, FE> = lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor<B, F, FE>, B, FE, Logger>;
678689
/// # type OnionMessenger<B, F, FE> = lightning::onion_message::messenger::OnionMessenger<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<Logger>, Arc<ChannelManager<B, F, FE>>, Arc<lightning::onion_message::messenger::DefaultMessageRouter<Arc<NetworkGraph>, Arc<Logger>, Arc<lightning::sign::KeysManager>>>, Arc<ChannelManager<B, F, FE>>, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler>;
679-
/// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>>;
690+
/// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>, Arc<DefaultTimeProvider>>;
680691
/// # type Scorer = RwLock<lightning::routing::scoring::ProbabilisticScorer<Arc<NetworkGraph>, Arc<Logger>>>;
681692
/// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger, F, Store>;
682693
/// #
@@ -1153,7 +1164,7 @@ impl Drop for BackgroundProcessor {
11531164
}
11541165
}
11551166

1156-
#[cfg(all(feature = "std", test))]
1167+
#[cfg(all(feature = "std", feature = "time", test))]
11571168
mod tests {
11581169
use super::{BackgroundProcessor, GossipSync, FRESHNESS_TIMER};
11591170
use bitcoin::constants::{genesis_block, ChainHash};
@@ -1198,7 +1209,8 @@ mod tests {
11981209
use lightning::util::sweep::{OutputSpendStatus, OutputSweeperSync, PRUNE_DELAY_BLOCKS};
11991210
use lightning::util::test_utils;
12001211
use lightning::{get_event, get_event_msg};
1201-
use lightning_liquidity::lsps5::service::TimeProvider;
1212+
#[cfg(feature = "time")]
1213+
use lightning_liquidity::lsps5::service::DefaultTimeProvider;
12021214
use lightning_liquidity::LiquidityManager;
12031215
use lightning_persister::fs_store::FilesystemStore;
12041216
use lightning_rapid_gossip_sync::RapidGossipSync;
@@ -1642,16 +1654,6 @@ mod tests {
16421654
path.to_str().unwrap().to_string()
16431655
}
16441656

1645-
pub struct DefaultTimeProvider;
1646-
1647-
#[cfg(feature = "std")]
1648-
impl TimeProvider for DefaultTimeProvider {
1649-
fn duration_since_epoch(&self) -> Duration {
1650-
use std::time::{SystemTime, UNIX_EPOCH};
1651-
SystemTime::now().duration_since(UNIX_EPOCH).expect("system time before Unix epoch")
1652-
}
1653-
}
1654-
16551657
fn create_nodes(num_nodes: usize, persist_dir: &str) -> (String, Vec<Node>) {
16561658
let persist_temp_path = env::temp_dir().join(persist_dir);
16571659
let persist_dir = persist_temp_path.to_string_lossy().to_string();
@@ -1753,16 +1755,14 @@ mod tests {
17531755
Arc::clone(&logger),
17541756
Arc::clone(&keys_manager),
17551757
));
1756-
let time_provider = Arc::new(DefaultTimeProvider);
1757-
let liquidity_manager = Arc::new(LiquidityManager::new_with_custom_time_provider(
1758+
let liquidity_manager = Arc::new(LiquidityManager::new(
17581759
Arc::clone(&keys_manager),
17591760
Arc::clone(&keys_manager),
17601761
Arc::clone(&manager),
17611762
None,
17621763
None,
17631764
None,
17641765
None,
1765-
time_provider,
17661766
));
17671767
let node = Node {
17681768
node: manager,

lightning-liquidity/tests/common/mod.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use bitcoin::Network;
44
use lightning::ln::channelmanager::ChainParameters;
5+
use lightning_liquidity::lsps5::service::TimeProvider;
56
use lightning_liquidity::{LiquidityClientConfig, LiquidityManager, LiquidityServiceConfig};
67

78
use lightning::chain::{BestBlock, Filter};
@@ -19,28 +20,32 @@ pub(crate) struct LSPSNodes<'a, 'b, 'c> {
1920

2021
pub(crate) fn create_service_and_client_nodes<'a, 'b, 'c>(
2122
nodes: Vec<Node<'a, 'b, 'c>>, service_config: LiquidityServiceConfig,
22-
client_config: LiquidityClientConfig,
23+
client_config: LiquidityClientConfig, time_provider: Arc<dyn TimeProvider + Send + Sync>,
2324
) -> LSPSNodes<'a, 'b, 'c> {
2425
let chain_params = ChainParameters {
2526
network: Network::Testnet,
2627
best_block: BestBlock::from_network(Network::Testnet),
2728
};
28-
let service_lm = LiquidityManager::new(
29+
let service_lm = LiquidityManager::new_with_custom_time_provider(
30+
nodes[0].keys_manager,
2931
nodes[0].keys_manager,
3032
nodes[0].node,
3133
None::<Arc<dyn Filter + Send + Sync>>,
3234
Some(chain_params.clone()),
3335
Some(service_config),
3436
None,
37+
Arc::clone(&time_provider),
3538
);
3639

37-
let client_lm = LiquidityManager::new(
40+
let client_lm = LiquidityManager::new_with_custom_time_provider(
41+
nodes[1].keys_manager,
3842
nodes[1].keys_manager,
3943
nodes[1].node,
4044
None::<Arc<dyn Filter + Send + Sync>>,
4145
Some(chain_params),
4246
None,
4347
Some(client_config),
48+
time_provider,
4449
);
4550

4651
let mut iter = nodes.into_iter();
@@ -53,19 +58,23 @@ pub(crate) fn create_service_and_client_nodes<'a, 'b, 'c>(
5358
pub(crate) struct LiquidityNode<'a, 'b, 'c> {
5459
pub inner: Node<'a, 'b, 'c>,
5560
pub liquidity_manager: LiquidityManager<
61+
&'c TestKeysInterface,
5662
&'c TestKeysInterface,
5763
&'a TestChannelManager<'b, 'c>,
5864
Arc<dyn Filter + Send + Sync>,
65+
Arc<dyn TimeProvider + Send + Sync>,
5966
>,
6067
}
6168

6269
impl<'a, 'b, 'c> LiquidityNode<'a, 'b, 'c> {
6370
pub fn new(
6471
node: Node<'a, 'b, 'c>,
6572
liquidity_manager: LiquidityManager<
73+
&'c TestKeysInterface,
6674
&'c TestKeysInterface,
6775
&'a TestChannelManager<'b, 'c>,
6876
Arc<dyn Filter + Send + Sync>,
77+
Arc<dyn TimeProvider + Send + Sync>,
6978
>,
7079
) -> Self {
7180
Self { inner: node, liquidity_manager }

lightning-liquidity/tests/lsps0_integration_tests.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![cfg(all(test, feature = "std"))]
1+
#![cfg(all(test, feature = "time"))]
22

33
mod common;
44

@@ -12,13 +12,18 @@ use lightning_liquidity::lsps1::client::LSPS1ClientConfig;
1212
use lightning_liquidity::lsps1::service::LSPS1ServiceConfig;
1313
use lightning_liquidity::lsps2::client::LSPS2ClientConfig;
1414
use lightning_liquidity::lsps2::service::LSPS2ServiceConfig;
15+
use lightning_liquidity::lsps5::client::LSPS5ClientConfig;
16+
use lightning_liquidity::lsps5::service::{DefaultTimeProvider, LSPS5ServiceConfig};
1517
use lightning_liquidity::{LiquidityClientConfig, LiquidityServiceConfig};
1618

1719
use lightning::ln::functional_test_utils::{
1820
create_chanmon_cfgs, create_network, create_node_cfgs, create_node_chanmgrs,
1921
};
2022
use lightning::ln::peer_handler::CustomMessageHandler;
2123

24+
use std::sync::Arc;
25+
use std::time::Duration;
26+
2227
#[test]
2328
fn list_protocols_integration_test() {
2429
let chanmon_cfgs = create_chanmon_cfgs(2);
@@ -30,29 +35,40 @@ fn list_protocols_integration_test() {
3035
let lsps2_service_config = LSPS2ServiceConfig { promise_secret };
3136
#[cfg(lsps1_service)]
3237
let lsps1_service_config = LSPS1ServiceConfig { supported_options: None, token: None };
38+
let lsps5_service_config = LSPS5ServiceConfig {
39+
max_webhooks_per_client: 10,
40+
notification_cooldown_hours: Duration::from_secs(3600),
41+
};
3342
let service_config = LiquidityServiceConfig {
3443
#[cfg(lsps1_service)]
3544
lsps1_service_config: Some(lsps1_service_config),
3645
lsps2_service_config: Some(lsps2_service_config),
46+
lsps5_service_config: Some(lsps5_service_config),
3747
advertise_service: true,
3848
};
3949

4050
let lsps2_client_config = LSPS2ClientConfig::default();
4151
#[cfg(lsps1_service)]
4252
let lsps1_client_config: LSPS1ClientConfig = LSPS1ClientConfig { max_channel_fees_msat: None };
53+
let lsps5_client_config = LSPS5ClientConfig::default();
4354
let client_config = LiquidityClientConfig {
4455
#[cfg(lsps1_service)]
4556
lsps1_client_config: Some(lsps1_client_config),
4657
#[cfg(not(lsps1_service))]
4758
lsps1_client_config: None,
4859
lsps2_client_config: Some(lsps2_client_config),
60+
lsps5_client_config: Some(lsps5_client_config),
4961
};
5062

5163
let service_node_id = nodes[0].node.get_our_node_id();
5264
let client_node_id = nodes[1].node.get_our_node_id();
5365

54-
let LSPSNodes { service_node, client_node } =
55-
create_service_and_client_nodes(nodes, service_config, client_config);
66+
let LSPSNodes { service_node, client_node } = create_service_and_client_nodes(
67+
nodes,
68+
service_config,
69+
client_config,
70+
Arc::new(DefaultTimeProvider),
71+
);
5672

5773
let client_handler = client_node.liquidity_manager.lsps0_client_handler();
5874

@@ -82,11 +98,12 @@ fn list_protocols_integration_test() {
8298
{
8399
assert!(protocols.contains(&1));
84100
assert!(protocols.contains(&2));
85-
assert_eq!(protocols.len(), 2);
101+
assert!(protocols.contains(&5));
102+
assert_eq!(protocols.len(), 3);
86103
}
87104

88105
#[cfg(not(lsps1_service))]
89-
assert_eq!(protocols, vec![2]);
106+
assert_eq!(protocols, vec![2, 5]);
90107
},
91108
_ => panic!("Unexpected event"),
92109
}

lightning-liquidity/tests/lsps2_integration_tests.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![cfg(all(test, feature = "std"))]
1+
#![cfg(all(test, feature = "std", feature = "time"))]
22

33
mod common;
44

@@ -12,6 +12,7 @@ use lightning_liquidity::lsps2::event::LSPS2ServiceEvent;
1212
use lightning_liquidity::lsps2::msgs::LSPS2RawOpeningFeeParams;
1313
use lightning_liquidity::lsps2::service::LSPS2ServiceConfig;
1414
use lightning_liquidity::lsps2::utils::is_valid_opening_fee_params;
15+
use lightning_liquidity::lsps5::service::DefaultTimeProvider;
1516
use lightning_liquidity::{LiquidityClientConfig, LiquidityServiceConfig};
1617

1718
use lightning::ln::channelmanager::{InterceptId, MIN_FINAL_CLTV_EXPIRY_DELTA};
@@ -35,6 +36,7 @@ use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
3536
use bitcoin::Network;
3637

3738
use std::str::FromStr;
39+
use std::sync::Arc;
3840
use std::time::Duration;
3941

4042
const MAX_PENDING_REQUESTS_PER_PEER: usize = 10;
@@ -49,15 +51,22 @@ fn setup_test_lsps2_nodes<'a, 'b, 'c>(
4951
#[cfg(lsps1_service)]
5052
lsps1_service_config: None,
5153
lsps2_service_config: Some(lsps2_service_config),
54+
lsps5_service_config: None,
5255
advertise_service: true,
5356
};
5457

5558
let lsps2_client_config = LSPS2ClientConfig::default();
5659
let client_config = LiquidityClientConfig {
5760
lsps1_client_config: None,
5861
lsps2_client_config: Some(lsps2_client_config),
62+
lsps5_client_config: None,
5963
};
60-
let lsps_nodes = create_service_and_client_nodes(nodes, service_config, client_config);
64+
let lsps_nodes = create_service_and_client_nodes(
65+
nodes,
66+
service_config,
67+
client_config,
68+
Arc::new(DefaultTimeProvider),
69+
);
6170

6271
(lsps_nodes, promise_secret)
6372
}

0 commit comments

Comments
 (0)