Skip to content

Commit 345fdec

Browse files
committed
test(logwriter): forward logs to mock in-memory log logger
1 parent 82ffcbf commit 345fdec

File tree

4 files changed

+109
-27
lines changed

4 files changed

+109
-27
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ libc = "0.2"
7575
uniffi = { version = "0.27.3", features = ["build"], optional = true }
7676
serde = { version = "1.0.210", default-features = false, features = ["std", "derive"] }
7777
serde_json = { version = "1.0.128", default-features = false, features = ["std"] }
78-
log = { version = "0.4.22" }
78+
log = { version = "0.4.22", features = ["std"]}
7979

8080
vss-client = "0.3"
8181
prost = { version = "0.11.6", default-features = false}

src/config.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ impl From<MaxDustHTLCExposure> for LdkMaxDustHTLCExposure {
430430
}
431431

432432
/// Configuration options for logging to the filesystem.
433-
#[derive(Debug)]
433+
#[derive(Debug, Clone)]
434434
pub struct FilesystemLoggerConfig {
435435
/// The log file path.
436436
///
@@ -442,7 +442,7 @@ pub struct FilesystemLoggerConfig {
442442
}
443443

444444
/// Configuration options for logging to the `log` facade.
445-
#[derive(Debug)]
445+
#[derive(Debug, Clone)]
446446
pub struct LogFacadeLoggerConfig {
447447
/// This specifies the log level.
448448
pub level: LdkLevel,

tests/common/mod.rs

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
use ldk_node::config::{Config, EsploraSyncConfig};
1212
use ldk_node::io::sqlite_store::SqliteStore;
1313
use ldk_node::payment::{PaymentDirection, PaymentKind, PaymentStatus};
14-
use ldk_node::{Builder, Event, LightningBalance, Node, NodeError, PendingSweepBalance};
14+
use ldk_node::{
15+
Builder, Event, FilesystemLoggerConfig, LightningBalance, LogFacadeLoggerConfig, Node,
16+
NodeError, PendingSweepBalance,
17+
};
1518

1619
use lightning::ln::msgs::SocketAddress;
1720
use lightning::ln::{PaymentHash, PaymentPreimage};
@@ -34,9 +37,11 @@ use electrum_client::ElectrumApi;
3437
use rand::distributions::Alphanumeric;
3538
use rand::{thread_rng, Rng};
3639

40+
use log::{LevelFilter, Log};
41+
3742
use std::env;
3843
use std::path::PathBuf;
39-
use std::sync::{Arc, RwLock};
44+
use std::sync::{Arc, Mutex, RwLock};
4045
use std::time::Duration;
4146

4247
macro_rules! expect_event {
@@ -245,6 +250,47 @@ pub(crate) enum TestChainSource<'a> {
245250
BitcoindRpc(&'a BitcoinD),
246251
}
247252

253+
#[derive(Clone)]
254+
pub(crate) enum TestLogWriter {
255+
File(FilesystemLoggerConfig),
256+
LogFacade(LogFacadeLoggerConfig),
257+
}
258+
259+
/// Simple in-memory mock `log` logger for tests.
260+
pub(crate) struct MockLogger {
261+
logs: Arc<Mutex<Vec<String>>>,
262+
}
263+
264+
impl MockLogger {
265+
pub fn new() -> Self {
266+
Self { logs: Arc::new(Mutex::new(Vec::new())) }
267+
}
268+
269+
pub fn retrieve_logs(&self) -> Vec<String> {
270+
self.logs.lock().unwrap().clone()
271+
}
272+
}
273+
274+
impl Log for MockLogger {
275+
fn log(&self, record: &log::Record) {
276+
let message = format!("[{}] {}", record.level(), record.args());
277+
self.logs.lock().unwrap().push(message);
278+
}
279+
280+
fn enabled(&self, _metadata: &log::Metadata) -> bool {
281+
true
282+
}
283+
284+
fn flush(&self) {}
285+
}
286+
287+
pub(crate) fn init_mock_logger(level: LevelFilter) -> Arc<MockLogger> {
288+
let logger = Arc::new(MockLogger::new());
289+
log::set_boxed_logger(Box::new(logger.clone())).unwrap();
290+
log::set_max_level(level);
291+
logger
292+
}
293+
248294
macro_rules! setup_builder {
249295
($builder: ident, $config: expr) => {
250296
#[cfg(feature = "uniffi")]
@@ -258,11 +304,11 @@ pub(crate) use setup_builder;
258304

259305
pub(crate) fn setup_two_nodes(
260306
chain_source: &TestChainSource, allow_0conf: bool, anchor_channels: bool,
261-
anchors_trusted_no_reserve: bool,
307+
anchors_trusted_no_reserve: bool, log_writer: TestLogWriter,
262308
) -> (TestNode, TestNode) {
263309
println!("== Node A ==");
264310
let config_a = random_config(anchor_channels);
265-
let node_a = setup_node(chain_source, config_a, None);
311+
let node_a = setup_node(chain_source, config_a, None, log_writer.clone());
266312

267313
println!("\n== Node B ==");
268314
let mut config_b = random_config(anchor_channels);
@@ -277,12 +323,13 @@ pub(crate) fn setup_two_nodes(
277323
.trusted_peers_no_reserve
278324
.push(node_a.node_id());
279325
}
280-
let node_b = setup_node(chain_source, config_b, None);
326+
let node_b = setup_node(chain_source, config_b, None, log_writer);
281327
(node_a, node_b)
282328
}
283329

284330
pub(crate) fn setup_node(
285331
chain_source: &TestChainSource, config: Config, seed_bytes: Option<Vec<u8>>,
332+
log_writer: TestLogWriter,
286333
) -> TestNode {
287334
setup_builder!(builder, config);
288335
match chain_source {
@@ -303,6 +350,15 @@ pub(crate) fn setup_node(
303350
},
304351
}
305352

353+
match log_writer {
354+
TestLogWriter::File(fs_config) => {
355+
builder.set_filesystem_logger(fs_config);
356+
},
357+
TestLogWriter::LogFacade(lf_config) => {
358+
builder.set_log_facade_logger(lf_config);
359+
},
360+
}
361+
306362
if let Some(seed) = seed_bytes {
307363
builder.set_entropy_seed_bytes(seed).unwrap();
308364
}

tests/integration_tests_rust.rs

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ mod common;
99

1010
use common::{
1111
do_channel_full_cycle, expect_channel_ready_event, expect_event, expect_payment_received_event,
12-
expect_payment_successful_event, generate_blocks_and_wait, open_channel,
12+
expect_payment_successful_event, generate_blocks_and_wait, init_mock_logger, open_channel,
1313
premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd, setup_builder,
14-
setup_node, setup_two_nodes, wait_for_tx, TestChainSource, TestSyncStore,
14+
setup_node, setup_two_nodes, wait_for_tx, TestChainSource, TestLogWriter, TestSyncStore,
1515
};
1616

1717
use ldk_node::config::{EsploraSyncConfig, FilesystemLoggerConfig};
1818
use ldk_node::payment::{PaymentKind, QrPaymentResult, SendingParameters};
19-
use ldk_node::{Builder, Event, NodeError};
19+
use ldk_node::LdkLevel;
20+
use ldk_node::{Builder, Event, LogFacadeLoggerConfig, NodeError};
2021

2122
use lightning::ln::channelmanager::PaymentId;
2223
use lightning::util::logger::Level;
@@ -32,55 +33,62 @@ use std::sync::Arc;
3233
fn channel_full_cycle() {
3334
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
3435
let chain_source = TestChainSource::Esplora(&electrsd);
35-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
36+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
37+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
3638
do_channel_full_cycle(node_a, node_b, &bitcoind.client, &electrsd.client, false, true, false);
3739
}
3840

3941
#[test]
4042
fn channel_full_cycle_bitcoind() {
4143
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
4244
let chain_source = TestChainSource::BitcoindRpc(&bitcoind);
43-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
45+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
46+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
4447
do_channel_full_cycle(node_a, node_b, &bitcoind.client, &electrsd.client, false, true, false);
4548
}
4649

4750
#[test]
4851
fn channel_full_cycle_force_close() {
4952
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
5053
let chain_source = TestChainSource::Esplora(&electrsd);
51-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
54+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
55+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
5256
do_channel_full_cycle(node_a, node_b, &bitcoind.client, &electrsd.client, false, true, true);
5357
}
5458

5559
#[test]
5660
fn channel_full_cycle_force_close_trusted_no_reserve() {
5761
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
5862
let chain_source = TestChainSource::Esplora(&electrsd);
59-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, true);
63+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
64+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, true, log_writer);
6065
do_channel_full_cycle(node_a, node_b, &bitcoind.client, &electrsd.client, false, true, true);
6166
}
6267

6368
#[test]
6469
fn channel_full_cycle_0conf() {
6570
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
6671
let chain_source = TestChainSource::Esplora(&electrsd);
67-
let (node_a, node_b) = setup_two_nodes(&chain_source, true, true, false);
72+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
73+
let (node_a, node_b) = setup_two_nodes(&chain_source, true, true, false, log_writer);
6874
do_channel_full_cycle(node_a, node_b, &bitcoind.client, &electrsd.client, true, true, false)
6975
}
7076

7177
#[test]
7278
fn channel_full_cycle_legacy_staticremotekey() {
7379
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
7480
let chain_source = TestChainSource::Esplora(&electrsd);
75-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, false, false);
81+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
82+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, false, false, log_writer);
7683
do_channel_full_cycle(node_a, node_b, &bitcoind.client, &electrsd.client, false, false, false);
7784
}
7885

7986
#[test]
8087
fn channel_open_fails_when_funds_insufficient() {
8188
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
8289
let chain_source = TestChainSource::Esplora(&electrsd);
83-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
90+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
91+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
8492

8593
let addr_a = node_a.onchain_payment().new_address().unwrap();
8694
let addr_b = node_b.onchain_payment().new_address().unwrap();
@@ -277,7 +285,8 @@ fn start_stop_reinit() {
277285
fn onchain_spend_receive() {
278286
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
279287
let chain_source = TestChainSource::Esplora(&electrsd);
280-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
288+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
289+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
281290

282291
let addr_a = node_a.onchain_payment().new_address().unwrap();
283292
let addr_b = node_b.onchain_payment().new_address().unwrap();
@@ -378,7 +387,9 @@ fn onchain_wallet_recovery() {
378387
let seed_bytes = vec![42u8; 64];
379388

380389
let original_config = random_config(true);
381-
let original_node = setup_node(&chain_source, original_config, Some(seed_bytes.clone()));
390+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
391+
let original_node =
392+
setup_node(&chain_source, original_config, Some(seed_bytes.clone()), log_writer);
382393

383394
let premine_amount_sat = 100_000;
384395

@@ -423,7 +434,8 @@ fn onchain_wallet_recovery() {
423434

424435
// Now we start from scratch, only the seed remains the same.
425436
let recovered_config = random_config(true);
426-
let recovered_node = setup_node(&chain_source, recovered_config, Some(seed_bytes));
437+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
438+
let recovered_node = setup_node(&chain_source, recovered_config, Some(seed_bytes), log_writer);
427439

428440
recovered_node.sync_wallets().unwrap();
429441
assert_eq!(
@@ -466,7 +478,8 @@ fn sign_verify_msg() {
466478
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
467479
let config = random_config(true);
468480
let chain_source = TestChainSource::Esplora(&electrsd);
469-
let node = setup_node(&chain_source, config, None);
481+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
482+
let node = setup_node(&chain_source, config, None, log_writer);
470483

471484
// Tests arbitrary message signing and later verification
472485
let msg = "OK computer".as_bytes();
@@ -484,7 +497,8 @@ fn connection_restart_behavior() {
484497
fn do_connection_restart_behavior(persist: bool) {
485498
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
486499
let chain_source = TestChainSource::Esplora(&electrsd);
487-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, false, false);
500+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
501+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, false, false, log_writer);
488502

489503
let node_id_a = node_a.node_id();
490504
let node_id_b = node_b.node_id();
@@ -536,7 +550,8 @@ fn do_connection_restart_behavior(persist: bool) {
536550
fn concurrent_connections_succeed() {
537551
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
538552
let chain_source = TestChainSource::Esplora(&electrsd);
539-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
553+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
554+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
540555

541556
let node_a = Arc::new(node_a);
542557
let node_b = Arc::new(node_b);
@@ -567,7 +582,8 @@ fn concurrent_connections_succeed() {
567582
fn simple_bolt12_send_receive() {
568583
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
569584
let chain_source = TestChainSource::Esplora(&electrsd);
570-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
585+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
586+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
571587

572588
let address_a = node_a.onchain_payment().new_address().unwrap();
573589
let premine_amount_sat = 5_000_000;
@@ -775,7 +791,8 @@ fn simple_bolt12_send_receive() {
775791
fn generate_bip21_uri() {
776792
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
777793
let chain_source = TestChainSource::Esplora(&electrsd);
778-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
794+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
795+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
779796

780797
let address_a = node_a.onchain_payment().new_address().unwrap();
781798
let premined_sats = 5_000_000;
@@ -817,7 +834,10 @@ fn generate_bip21_uri() {
817834
fn unified_qr_send_receive() {
818835
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
819836
let chain_source = TestChainSource::Esplora(&electrsd);
820-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
837+
838+
let mock_logger = init_mock_logger(log::LevelFilter::Trace);
839+
let log_writer = TestLogWriter::LogFacade(LogFacadeLoggerConfig { level: LdkLevel::Trace });
840+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
821841

822842
let address_a = node_a.onchain_payment().new_address().unwrap();
823843
let premined_sats = 5_000_000;
@@ -923,4 +943,10 @@ fn unified_qr_send_receive() {
923943

924944
assert_eq!(node_b.list_balances().total_onchain_balance_sats, 800_000);
925945
assert_eq!(node_b.list_balances().total_lightning_balance_sats, 200_000);
946+
947+
assert!(mock_logger
948+
.retrieve_logs()
949+
.last()
950+
.unwrap()
951+
.contains("Incremental sync of on-chain wallet finished"),);
926952
}

0 commit comments

Comments
 (0)