Skip to content

Commit d85c5c5

Browse files
committed
test(logger): test facade and custom loggers
1 parent 8ca11b2 commit d85c5c5

File tree

2 files changed

+128
-5
lines changed

2 files changed

+128
-5
lines changed

tests/common/mod.rs

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
#![cfg(any(test, cln_test, vss_test))]
99
#![allow(dead_code)]
1010

11+
use chrono::Utc;
1112
use ldk_node::config::{
1213
Config, EsploraSyncConfig, DEFAULT_LOG_FILENAME, DEFAULT_LOG_LEVEL, DEFAULT_STORAGE_DIR_PATH,
1314
};
1415
use ldk_node::io::sqlite_store::SqliteStore;
15-
use ldk_node::logger::{LogLevel, LogWriter};
16+
use ldk_node::logger::{LogLevel, LogRecord, LogWriter};
1617
use ldk_node::payment::{PaymentDirection, PaymentKind, PaymentStatus};
1718
use ldk_node::{
1819
Builder, CustomTlvRecord, Event, LightningBalance, Node, NodeError, PendingSweepBalance,
@@ -39,12 +40,13 @@ use bitcoincore_rpc::RpcApi;
3940
use electrsd::{bitcoind, bitcoind::BitcoinD, ElectrsD};
4041
use electrum_client::ElectrumApi;
4142

43+
use log::{Level, LevelFilter, Log, Record};
4244
use rand::distributions::Alphanumeric;
4345
use rand::{thread_rng, Rng};
4446

4547
use std::env;
4648
use std::path::PathBuf;
47-
use std::sync::{Arc, RwLock};
49+
use std::sync::{Arc, Mutex, RwLock};
4850
use std::time::Duration;
4951

5052
macro_rules! expect_event {
@@ -1207,3 +1209,90 @@ impl KVStore for TestSyncStore {
12071209
self.do_list(primary_namespace, secondary_namespace)
12081210
}
12091211
}
1212+
1213+
pub(crate) struct MockLogger {
1214+
logs: Arc<Mutex<Vec<String>>>,
1215+
}
1216+
1217+
impl MockLogger {
1218+
pub fn new() -> Self {
1219+
Self { logs: Arc::new(Mutex::new(Vec::new())) }
1220+
}
1221+
1222+
pub fn retrieve_logs(&self) -> Vec<String> {
1223+
self.logs.lock().unwrap().to_vec()
1224+
}
1225+
}
1226+
1227+
impl Log for MockLogger {
1228+
fn enabled(&self, _metadata: &log::Metadata) -> bool {
1229+
true
1230+
}
1231+
1232+
fn log(&self, record: &log::Record) {
1233+
let message = format!(
1234+
"{} {:<5} [{}:{}] {}",
1235+
Utc::now().format("%Y-%m-%d %H:%M:%S"),
1236+
record.level().to_string(),
1237+
record.module_path().unwrap(),
1238+
record.line().unwrap(),
1239+
record.args()
1240+
);
1241+
println!("{message}");
1242+
self.logs.lock().unwrap().push(message);
1243+
}
1244+
1245+
fn flush(&self) {}
1246+
}
1247+
1248+
impl LogWriter for MockLogger {
1249+
fn log<'a>(&self, record: LogRecord) {
1250+
let record = MockLogRecord(record).into();
1251+
Log::log(self, &record);
1252+
}
1253+
}
1254+
1255+
struct MockLogRecord<'a>(LogRecord<'a>);
1256+
struct MockLogLevel(LogLevel);
1257+
1258+
impl From<MockLogLevel> for Level {
1259+
fn from(level: MockLogLevel) -> Self {
1260+
match level.0 {
1261+
LogLevel::Gossip | LogLevel::Trace => Level::Trace,
1262+
LogLevel::Debug => Level::Debug,
1263+
LogLevel::Info => Level::Info,
1264+
LogLevel::Warn => Level::Warn,
1265+
LogLevel::Error => Level::Error,
1266+
}
1267+
}
1268+
}
1269+
1270+
impl<'a> From<MockLogRecord<'a>> for Record<'a> {
1271+
fn from(log_record: MockLogRecord<'a>) -> Self {
1272+
let log_record = log_record.0;
1273+
let level = MockLogLevel(log_record.level).into();
1274+
1275+
let mut record_builder = Record::builder();
1276+
let record = record_builder
1277+
.level(level)
1278+
.module_path(Some(log_record.module_path))
1279+
.line(Some(log_record.line))
1280+
.args(log_record.args);
1281+
1282+
record.build()
1283+
}
1284+
}
1285+
1286+
pub(crate) fn init_log_logger(level: LevelFilter) -> Arc<MockLogger> {
1287+
let logger = Arc::new(MockLogger::new());
1288+
log::set_boxed_logger(Box::new(logger.clone())).unwrap();
1289+
log::set_max_level(level);
1290+
1291+
logger
1292+
}
1293+
1294+
pub(crate) fn init_custom_logger() -> Arc<MockLogger> {
1295+
let logger = Arc::new(MockLogger::new());
1296+
1297+
logger
1298+
}

tests/integration_tests_rust.rs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ 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,
13-
premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd, setup_builder,
14-
setup_node, setup_two_nodes, wait_for_tx, TestChainSource, TestSyncStore,
12+
expect_payment_successful_event, generate_blocks_and_wait, init_custom_logger, init_log_logger,
13+
open_channel, premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd,
14+
setup_builder, setup_node, setup_two_nodes, wait_for_tx, TestChainSource, TestLogWriter,
15+
TestSyncStore,
1516
};
1617

1718
use ldk_node::config::EsploraSyncConfig;
19+
use ldk_node::logger::LogLevel;
1820
use ldk_node::payment::{
1921
ConfirmationStatus, PaymentDirection, PaymentKind, PaymentStatus, QrPaymentResult,
2022
SendingParameters,
@@ -28,6 +30,7 @@ use bitcoincore_rpc::RpcApi;
2830

2931
use bitcoin::Amount;
3032
use lightning_invoice::{Bolt11InvoiceDescription, Description};
33+
use log::LevelFilter;
3134

3235
use std::sync::Arc;
3336

@@ -990,3 +993,34 @@ fn unified_qr_send_receive() {
990993
assert_eq!(node_b.list_balances().total_onchain_balance_sats, 800_000);
991994
assert_eq!(node_b.list_balances().total_lightning_balance_sats, 200_000);
992995
}
996+
997+
#[test]
998+
fn facade_logging() {
999+
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
1000+
let chain_source = TestChainSource::Esplora(&electrsd);
1001+
1002+
let logger = init_log_logger(LevelFilter::Trace);
1003+
let mut config = random_config(false);
1004+
config.log_writer = TestLogWriter::LogFacade { max_log_level: LogLevel::Gossip };
1005+
1006+
println!("== Facade logging start ==");
1007+
let _node = setup_node(&chain_source, config, None);
1008+
println!("== Facade logging end ==");
1009+
1010+
assert!(!logger.retrieve_logs().is_empty());
1011+
}
1012+
1013+
#[test]
1014+
fn custom_logging() {
1015+
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
1016+
let chain_source = TestChainSource::Esplora(&electrsd);
1017+
let logger = init_custom_logger();
1018+
let mut config = random_config(false);
1019+
config.log_writer = TestLogWriter::Custom(logger.clone());
1020+
1021+
println!("== Custom logging start ==");
1022+
let _node = setup_node(&chain_source, config, None);
1023+
println!("== Custom logging end ==");
1024+
1025+
assert!(!logger.retrieve_logs().is_empty());
1026+
}

0 commit comments

Comments
 (0)