Skip to content

Commit fb6a925

Browse files
Add tests for LSPS5 client and service.
1 parent bc97c9b commit fb6a925

File tree

5 files changed

+1210
-22
lines changed

5 files changed

+1210
-22
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 18 additions & 3 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
/// #
@@ -1293,8 +1304,12 @@ mod tests {
12931304
IgnoringMessageHandler,
12941305
>;
12951306

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

12991314
struct Node {
13001315
node: Arc<ChannelManager>,

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)