Skip to content

Commit c1f7858

Browse files
committed
test(logwriter): forward logs to mock in-memory log logger
1 parent 3dbff37 commit c1f7858

File tree

4 files changed

+107
-27
lines changed

4 files changed

+107
-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: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ use ldk_node::config::{Config, EsploraSyncConfig};
1212
use ldk_node::io::sqlite_store::SqliteStore;
1313
use ldk_node::payment::{PaymentDirection, PaymentKind, PaymentStatus};
1414
use ldk_node::{
15-
Builder, CustomTlvRecord, Event, LightningBalance, Node, NodeError, PendingSweepBalance,
15+
Builder, CustomTlvRecord, Event, FilesystemLoggerConfig, LightningBalance,
16+
LogFacadeLoggerConfig, Node, NodeError, PendingSweepBalance,
1617
};
1718

1819
use lightning::ln::msgs::SocketAddress;
@@ -36,9 +37,11 @@ use electrum_client::ElectrumApi;
3637
use rand::distributions::Alphanumeric;
3738
use rand::{thread_rng, Rng};
3839

40+
use log::{LevelFilter, Log};
41+
3942
use std::env;
4043
use std::path::PathBuf;
41-
use std::sync::{Arc, RwLock};
44+
use std::sync::{Arc, Mutex, RwLock};
4245
use std::time::Duration;
4346

4447
macro_rules! expect_event {
@@ -247,6 +250,47 @@ pub(crate) enum TestChainSource<'a> {
247250
BitcoindRpc(&'a BitcoinD),
248251
}
249252

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+
250294
macro_rules! setup_builder {
251295
($builder: ident, $config: expr) => {
252296
#[cfg(feature = "uniffi")]
@@ -260,11 +304,11 @@ pub(crate) use setup_builder;
260304

261305
pub(crate) fn setup_two_nodes(
262306
chain_source: &TestChainSource, allow_0conf: bool, anchor_channels: bool,
263-
anchors_trusted_no_reserve: bool,
307+
anchors_trusted_no_reserve: bool, log_writer: TestLogWriter,
264308
) -> (TestNode, TestNode) {
265309
println!("== Node A ==");
266310
let config_a = random_config(anchor_channels);
267-
let node_a = setup_node(chain_source, config_a, None);
311+
let node_a = setup_node(chain_source, config_a, None, log_writer.clone());
268312

269313
println!("\n== Node B ==");
270314
let mut config_b = random_config(anchor_channels);
@@ -279,12 +323,13 @@ pub(crate) fn setup_two_nodes(
279323
.trusted_peers_no_reserve
280324
.push(node_a.node_id());
281325
}
282-
let node_b = setup_node(chain_source, config_b, None);
326+
let node_b = setup_node(chain_source, config_b, None, log_writer);
283327
(node_a, node_b)
284328
}
285329

286330
pub(crate) fn setup_node(
287331
chain_source: &TestChainSource, config: Config, seed_bytes: Option<Vec<u8>>,
332+
log_writer: TestLogWriter,
288333
) -> TestNode {
289334
setup_builder!(builder, config);
290335
match chain_source {
@@ -305,6 +350,15 @@ pub(crate) fn setup_node(
305350
},
306351
}
307352

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+
308362
if let Some(seed) = seed_bytes {
309363
builder.set_entropy_seed_bytes(seed).unwrap();
310364
}

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();
@@ -280,7 +288,8 @@ fn start_stop_reinit() {
280288
fn onchain_spend_receive() {
281289
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
282290
let chain_source = TestChainSource::Esplora(&electrsd);
283-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
291+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
292+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
284293

285294
let addr_a = node_a.onchain_payment().new_address().unwrap();
286295
let addr_b = node_b.onchain_payment().new_address().unwrap();
@@ -381,7 +390,9 @@ fn onchain_wallet_recovery() {
381390
let seed_bytes = vec![42u8; 64];
382391

383392
let original_config = random_config(true);
384-
let original_node = setup_node(&chain_source, original_config, Some(seed_bytes.clone()));
393+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
394+
let original_node =
395+
setup_node(&chain_source, original_config, Some(seed_bytes.clone()), log_writer);
385396

386397
let premine_amount_sat = 100_000;
387398

@@ -426,7 +437,8 @@ fn onchain_wallet_recovery() {
426437

427438
// Now we start from scratch, only the seed remains the same.
428439
let recovered_config = random_config(true);
429-
let recovered_node = setup_node(&chain_source, recovered_config, Some(seed_bytes));
440+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
441+
let recovered_node = setup_node(&chain_source, recovered_config, Some(seed_bytes), log_writer);
430442

431443
recovered_node.sync_wallets().unwrap();
432444
assert_eq!(
@@ -469,7 +481,8 @@ fn sign_verify_msg() {
469481
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
470482
let config = random_config(true);
471483
let chain_source = TestChainSource::Esplora(&electrsd);
472-
let node = setup_node(&chain_source, config, None);
484+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
485+
let node = setup_node(&chain_source, config, None, log_writer);
473486

474487
// Tests arbitrary message signing and later verification
475488
let msg = "OK computer".as_bytes();
@@ -487,7 +500,8 @@ fn connection_restart_behavior() {
487500
fn do_connection_restart_behavior(persist: bool) {
488501
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
489502
let chain_source = TestChainSource::Esplora(&electrsd);
490-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, false, false);
503+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
504+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, false, false, log_writer);
491505

492506
let node_id_a = node_a.node_id();
493507
let node_id_b = node_b.node_id();
@@ -539,7 +553,8 @@ fn do_connection_restart_behavior(persist: bool) {
539553
fn concurrent_connections_succeed() {
540554
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
541555
let chain_source = TestChainSource::Esplora(&electrsd);
542-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
556+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
557+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
543558

544559
let node_a = Arc::new(node_a);
545560
let node_b = Arc::new(node_b);
@@ -570,7 +585,8 @@ fn concurrent_connections_succeed() {
570585
fn simple_bolt12_send_receive() {
571586
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
572587
let chain_source = TestChainSource::Esplora(&electrsd);
573-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
588+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
589+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
574590

575591
let address_a = node_a.onchain_payment().new_address().unwrap();
576592
let premine_amount_sat = 5_000_000;
@@ -778,7 +794,8 @@ fn simple_bolt12_send_receive() {
778794
fn generate_bip21_uri() {
779795
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
780796
let chain_source = TestChainSource::Esplora(&electrsd);
781-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
797+
let log_writer = TestLogWriter::File(FilesystemLoggerConfig::default());
798+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
782799

783800
let address_a = node_a.onchain_payment().new_address().unwrap();
784801
let premined_sats = 5_000_000;
@@ -820,7 +837,10 @@ fn generate_bip21_uri() {
820837
fn unified_qr_send_receive() {
821838
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
822839
let chain_source = TestChainSource::Esplora(&electrsd);
823-
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
840+
841+
let mock_logger = init_mock_logger(log::LevelFilter::Trace);
842+
let log_writer = TestLogWriter::LogFacade(LogFacadeLoggerConfig { level: LdkLevel::Trace });
843+
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false, log_writer);
824844

825845
let address_a = node_a.onchain_payment().new_address().unwrap();
826846
let premined_sats = 5_000_000;
@@ -926,4 +946,10 @@ fn unified_qr_send_receive() {
926946

927947
assert_eq!(node_b.list_balances().total_onchain_balance_sats, 800_000);
928948
assert_eq!(node_b.list_balances().total_lightning_balance_sats, 200_000);
949+
950+
assert!(mock_logger
951+
.retrieve_logs()
952+
.last()
953+
.unwrap()
954+
.contains("Incremental sync of on-chain wallet finished"),);
929955
}

0 commit comments

Comments
 (0)