Skip to content

Commit 850ed07

Browse files
Add tests for LSPS5 client and service.
1 parent 74b2859 commit 850ed07

File tree

6 files changed

+1216
-38
lines changed

6 files changed

+1216
-38
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: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
648648
/// # use std::sync::atomic::{AtomicBool, Ordering};
649649
/// # use std::time::SystemTime;
650650
/// # use lightning_background_processor::{process_events_async, GossipSync};
651+
/// # use lightning_liquidity::lsps5::service::TimeProvider;
651652
/// # struct Logger {}
652653
/// # impl lightning::util::logger::Logger for Logger {
653654
/// # fn log(&self, _record: lightning::util::logger::Record) {}
@@ -659,6 +660,16 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
659660
/// # fn remove(&self, primary_namespace: &str, secondary_namespace: &str, key: &str, lazy: bool) -> io::Result<()> { Ok(()) }
660661
/// # fn list(&self, primary_namespace: &str, secondary_namespace: &str) -> io::Result<Vec<String>> { Ok(Vec::new()) }
661662
/// # }
663+
/// #
664+
/// # use core::time::Duration;
665+
/// # struct DefaultTimeProvider;
666+
/// #
667+
/// # impl TimeProvider for DefaultTimeProvider {
668+
/// # fn duration_since_epoch(&self) -> Duration {
669+
/// # use std::time::{SystemTime, UNIX_EPOCH};
670+
/// # SystemTime::now().duration_since(UNIX_EPOCH).expect("system time before Unix epoch")
671+
/// # }
672+
/// # }
662673
/// # struct EventHandler {}
663674
/// # impl EventHandler {
664675
/// # async fn handle_event(&self, _: lightning::events::Event) -> Result<(), ReplayEvent> { Ok(()) }
@@ -674,7 +685,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
674685
/// # type P2PGossipSync<UL> = lightning::routing::gossip::P2PGossipSync<Arc<NetworkGraph>, Arc<UL>, Arc<Logger>>;
675686
/// # type ChannelManager<B, F, FE> = lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor<B, F, FE>, B, FE, Logger>;
676687
/// # 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>;
677-
/// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>>;
688+
/// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>, Arc<DefaultTimeProvider>>;
678689
/// # type Scorer = RwLock<lightning::routing::scoring::ProbabilisticScorer<Arc<NetworkGraph>, Arc<Logger>>>;
679690
/// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger, F, Store>;
680691
/// #
@@ -1151,7 +1162,7 @@ impl Drop for BackgroundProcessor {
11511162
}
11521163
}
11531164

1154-
#[cfg(all(feature = "std", test))]
1165+
#[cfg(all(feature = "std", feature = "time", test))]
11551166
mod tests {
11561167
use super::{BackgroundProcessor, GossipSync, FRESHNESS_TIMER};
11571168
use bitcoin::constants::{genesis_block, ChainHash};
@@ -1196,7 +1207,8 @@ mod tests {
11961207
use lightning::util::sweep::{OutputSpendStatus, OutputSweeperSync, PRUNE_DELAY_BLOCKS};
11971208
use lightning::util::test_utils;
11981209
use lightning::{get_event, get_event_msg};
1199-
use lightning_liquidity::lsps5::service::TimeProvider;
1210+
#[cfg(feature = "time")]
1211+
use lightning_liquidity::lsps5::service::DefaultTimeProvider;
12001212
use lightning_liquidity::LiquidityManager;
12011213
use lightning_persister::fs_store::FilesystemStore;
12021214
use lightning_rapid_gossip_sync::RapidGossipSync;
@@ -1293,8 +1305,12 @@ mod tests {
12931305
IgnoringMessageHandler,
12941306
>;
12951307

1296-
type LM =
1297-
LiquidityManager<Arc<KeysManager>, Arc<ChannelManager>, Arc<dyn Filter + Sync + Send>>;
1308+
type LM = LiquidityManager<
1309+
Arc<KeysManager>,
1310+
Arc<ChannelManager>,
1311+
Arc<dyn Filter + Sync + Send>,
1312+
Arc<DefaultTimeProvider>,
1313+
>;
12981314

12991315
struct Node {
13001316
node: Arc<ChannelManager>,
@@ -1635,16 +1651,6 @@ mod tests {
16351651
path.to_str().unwrap().to_string()
16361652
}
16371653

1638-
pub struct DefaultTimeProvider;
1639-
1640-
#[cfg(feature = "std")]
1641-
impl TimeProvider for DefaultTimeProvider {
1642-
fn duration_since_epoch(&self) -> Duration {
1643-
use std::time::{SystemTime, UNIX_EPOCH};
1644-
SystemTime::now().duration_since(UNIX_EPOCH).expect("system time before Unix epoch")
1645-
}
1646-
}
1647-
16481654
fn create_nodes(num_nodes: usize, persist_dir: &str) -> (String, Vec<Node>) {
16491655
let persist_temp_path = env::temp_dir().join(persist_dir);
16501656
let persist_dir = persist_temp_path.to_string_lossy().to_string();
@@ -1746,15 +1752,13 @@ mod tests {
17461752
Arc::clone(&logger),
17471753
Arc::clone(&keys_manager),
17481754
));
1749-
let time_provider = Arc::new(DefaultTimeProvider);
1750-
let liquidity_manager = Arc::new(LiquidityManager::new_with_custom_time_provider(
1755+
let liquidity_manager = Arc::new(LiquidityManager::new(
17511756
Arc::clone(&keys_manager),
17521757
Arc::clone(&manager),
17531758
None,
17541759
None,
17551760
None,
17561761
None,
1757-
time_provider,
17581762
));
17591763
let node = Node {
17601764
node: manager,

lightning-liquidity/tests/common/mod.rs

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
#![cfg(test)]
1+
#![cfg(all(test, feature = "time"))]
22
// TODO: remove these flags and unused code once we know what we'll need.
33
#![allow(dead_code)]
44
#![allow(unused_imports)]
55
#![allow(unused_macros)]
66

7-
use lightning::chain::Filter;
8-
use lightning::sign::{EntropySource, NodeSigner};
9-
107
use bitcoin::blockdata::constants::{genesis_block, ChainHash};
118
use bitcoin::blockdata::transaction::Transaction;
9+
use bitcoin::secp256k1::SecretKey;
1210
use bitcoin::Network;
11+
1312
use lightning::chain::channelmonitor::ANTI_REORG_DELAY;
13+
use lightning::chain::Filter;
1414
use lightning::chain::{chainmonitor, BestBlock, Confirm};
1515
use lightning::ln::channelmanager;
1616
use lightning::ln::channelmanager::ChainParameters;
@@ -19,6 +19,7 @@ use lightning::ln::msgs::{BaseMessageHandler, ChannelMessageHandler, Init};
1919
use lightning::ln::peer_handler::{
2020
IgnoringMessageHandler, MessageHandler, PeerManager, SocketDescriptor,
2121
};
22+
use lightning::sign::{EntropySource, NodeSigner};
2223

2324
use lightning::onion_message::messenger::DefaultMessageRouter;
2425
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
@@ -34,10 +35,13 @@ use lightning::util::persist::{
3435
SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
3536
};
3637
use lightning::util::test_utils;
38+
39+
use lightning_liquidity::lsps5::service::TimeProvider;
3740
use lightning_liquidity::{LiquidityClientConfig, LiquidityManager, LiquidityServiceConfig};
3841
use lightning_persister::fs_store::FilesystemStore;
3942

4043
use std::collections::{HashMap, VecDeque};
44+
use std::ops::Deref;
4145
use std::path::PathBuf;
4246
use std::sync::atomic::AtomicBool;
4347
use std::sync::mpsc::SyncSender;
@@ -128,14 +132,21 @@ pub(crate) struct Node {
128132
Arc<KeysManager>,
129133
Arc<ChannelManager>,
130134
Arc<dyn Filter + Send + Sync>,
135+
Arc<dyn TimeProvider + Send + Sync>,
131136
>,
132137
>,
133138
Arc<KeysManager>,
134139
Arc<ChainMonitor>,
135140
>,
136141
>,
137-
pub(crate) liquidity_manager:
138-
Arc<LiquidityManager<Arc<KeysManager>, Arc<ChannelManager>, Arc<dyn Filter + Send + Sync>>>,
142+
pub(crate) liquidity_manager: Arc<
143+
LiquidityManager<
144+
Arc<KeysManager>,
145+
Arc<ChannelManager>,
146+
Arc<dyn Filter + Send + Sync>,
147+
Arc<dyn TimeProvider + Send + Sync>,
148+
>,
149+
>,
139150
pub(crate) chain_monitor: Arc<ChainMonitor>,
140151
pub(crate) kv_store: Arc<FilesystemStore>,
141152
pub(crate) tx_broadcaster: Arc<test_utils::TestBroadcaster>,
@@ -403,6 +414,7 @@ fn get_full_filepath(filepath: String, filename: String) -> String {
403414
pub(crate) fn create_liquidity_node(
404415
i: usize, persist_dir: &str, network: Network, service_config: Option<LiquidityServiceConfig>,
405416
client_config: Option<LiquidityClientConfig>,
417+
time_provider: Arc<dyn TimeProvider + Send + Sync>,
406418
) -> Node {
407419
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster::new(network));
408420
let fee_estimator = Arc::new(test_utils::TestFeeEstimator::new(253));
@@ -455,16 +467,16 @@ pub(crate) fn create_liquidity_node(
455467
Some(Arc::clone(&chain_source)),
456468
Arc::clone(&logger),
457469
));
458-
459-
let liquidity_manager = Arc::new(LiquidityManager::new(
470+
let liquidity_manager = Arc::new(LiquidityManager::new_with_custom_time_provider(
460471
Arc::clone(&keys_manager),
461472
Arc::clone(&channel_manager),
462473
None::<Arc<dyn Filter + Send + Sync>>,
463-
Some(chain_params),
474+
Some(chain_params.clone()),
464475
service_config,
465476
client_config,
466-
None,
477+
time_provider,
467478
));
479+
468480
let msg_handler = MessageHandler {
469481
chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new(
470482
ChainHash::using_genesis_block(Network::Testnet),
@@ -494,14 +506,29 @@ pub(crate) fn create_liquidity_node(
494506
}
495507

496508
pub(crate) fn create_service_and_client_nodes(
497-
persist_dir: &str, service_config: LiquidityServiceConfig, client_config: LiquidityClientConfig,
509+
persist_dir: &str, service_config: LiquidityServiceConfig,
510+
client_config: LiquidityClientConfig, time_provider: Arc<dyn TimeProvider + Send + Sync>,
498511
) -> (Node, Node) {
499512
let persist_temp_path = env::temp_dir().join(persist_dir);
500513
let persist_dir = persist_temp_path.to_string_lossy().to_string();
501514
let network = Network::Bitcoin;
502515

503-
let service_node = create_liquidity_node(1, &persist_dir, network, Some(service_config), None);
504-
let client_node = create_liquidity_node(2, &persist_dir, network, None, Some(client_config));
516+
let service_node = create_liquidity_node(
517+
1,
518+
&persist_dir,
519+
network,
520+
Some(service_config),
521+
None,
522+
Arc::clone(&time_provider),
523+
);
524+
let client_node = create_liquidity_node(
525+
2,
526+
&persist_dir,
527+
network,
528+
None,
529+
Some(client_config),
530+
Arc::clone(&time_provider),
531+
);
505532

506533
service_node
507534
.channel_manager

lightning-liquidity/tests/lsps0_integration_tests.rs

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

33
mod common;
44

5+
use std::sync::Arc;
6+
use std::time::Duration;
7+
8+
use bitcoin::secp256k1::SecretKey;
59
use common::{create_service_and_client_nodes, get_lsps_message};
610

711
use lightning_liquidity::events::LiquidityEvent;
@@ -12,6 +16,8 @@ use lightning_liquidity::lsps1::client::LSPS1ClientConfig;
1216
use lightning_liquidity::lsps1::service::LSPS1ServiceConfig;
1317
use lightning_liquidity::lsps2::client::LSPS2ClientConfig;
1418
use lightning_liquidity::lsps2::service::LSPS2ServiceConfig;
19+
use lightning_liquidity::lsps5::client::LSPS5ClientConfig;
20+
use lightning_liquidity::lsps5::service::{DefaultTimeProvider, LSPS5ServiceConfig};
1521
use lightning_liquidity::{LiquidityClientConfig, LiquidityServiceConfig};
1622

1723
use lightning::ln::peer_handler::CustomMessageHandler;
@@ -22,28 +28,39 @@ fn list_protocols_integration_test() {
2228
let lsps2_service_config = LSPS2ServiceConfig { promise_secret };
2329
#[cfg(lsps1_service)]
2430
let lsps1_service_config = LSPS1ServiceConfig { supported_options: None, token: None };
31+
let signing_key = SecretKey::from_slice(&[42; 32]).unwrap();
32+
let mut lsps5_service_config = LSPS5ServiceConfig {
33+
max_webhooks_per_client: 10,
34+
signing_key,
35+
notification_cooldown_hours: Duration::from_secs(3600),
36+
};
37+
lsps5_service_config.signing_key = signing_key;
2538
let service_config = LiquidityServiceConfig {
2639
#[cfg(lsps1_service)]
2740
lsps1_service_config: Some(lsps1_service_config),
2841
lsps2_service_config: Some(lsps2_service_config),
42+
lsps5_service_config: Some(lsps5_service_config),
2943
advertise_service: true,
3044
};
3145

3246
let lsps2_client_config = LSPS2ClientConfig::default();
3347
#[cfg(lsps1_service)]
3448
let lsps1_client_config: LSPS1ClientConfig = LSPS1ClientConfig { max_channel_fees_msat: None };
49+
let lsps5_client_config = LSPS5ClientConfig::default();
3550
let client_config = LiquidityClientConfig {
3651
#[cfg(lsps1_service)]
3752
lsps1_client_config: Some(lsps1_client_config),
3853
#[cfg(not(lsps1_service))]
3954
lsps1_client_config: None,
4055
lsps2_client_config: Some(lsps2_client_config),
56+
lsps5_client_config: Some(lsps5_client_config),
4157
};
4258

4359
let (service_node, client_node) = create_service_and_client_nodes(
4460
"list_protocols_integration_test",
4561
service_config,
4662
client_config,
63+
Arc::new(DefaultTimeProvider),
4764
);
4865

4966
let service_node_id = service_node.channel_manager.get_our_node_id();
@@ -77,11 +94,12 @@ fn list_protocols_integration_test() {
7794
{
7895
assert!(protocols.contains(&1));
7996
assert!(protocols.contains(&2));
80-
assert_eq!(protocols.len(), 2);
97+
assert!(protocols.contains(&5));
98+
assert_eq!(protocols.len(), 3);
8199
}
82100

83101
#[cfg(not(lsps1_service))]
84-
assert_eq!(protocols, vec![2]);
102+
assert_eq!(protocols, vec![2, 5]);
85103
},
86104
_ => panic!("Unexpected event"),
87105
}

lightning-liquidity/tests/lsps2_integration_tests.rs

Lines changed: 11 additions & 3 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

@@ -23,6 +23,7 @@ use lightning::util::logger::Logger;
2323

2424
use lightning_invoice::{Bolt11Invoice, InvoiceBuilder, RoutingFees};
2525

26+
use lightning_liquidity::lsps5::service::DefaultTimeProvider;
2627
use lightning_liquidity::{LiquidityClientConfig, LiquidityServiceConfig};
2728
use lightning_types::payment::PaymentHash;
2829

@@ -31,6 +32,7 @@ use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
3132
use bitcoin::Network;
3233

3334
use std::str::FromStr;
35+
use std::sync::Arc;
3436
use std::time::Duration;
3537

3638
const MAX_PENDING_REQUESTS_PER_PEER: usize = 10;
@@ -46,17 +48,23 @@ fn setup_test_lsps2(
4648
#[cfg(lsps1_service)]
4749
lsps1_service_config: None,
4850
lsps2_service_config: Some(lsps2_service_config),
51+
lsps5_service_config: None,
4952
advertise_service: true,
5053
};
5154

5255
let lsps2_client_config = LSPS2ClientConfig::default();
5356
let client_config = LiquidityClientConfig {
5457
lsps1_client_config: None,
5558
lsps2_client_config: Some(lsps2_client_config),
59+
lsps5_client_config: None,
5660
};
5761

58-
let (service_node, client_node) =
59-
create_service_and_client_nodes(persist_dir, service_config, client_config);
62+
let (service_node, client_node) = create_service_and_client_nodes(
63+
persist_dir,
64+
service_config,
65+
client_config,
66+
Arc::new(DefaultTimeProvider),
67+
);
6068

6169
let secp = bitcoin::secp256k1::Secp256k1::new();
6270
let service_node_id = bitcoin::secp256k1::PublicKey::from_secret_key(&secp, &signing_key);

0 commit comments

Comments
 (0)