Skip to content

Commit 80ac358

Browse files
committed
test(logger): test facade and custom loggers
1 parent c84115d commit 80ac358

File tree

2 files changed

+129
-9
lines changed

2 files changed

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

tests/integration_tests_rust.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@
88
mod common;
99

1010
use common::{
11-
do_channel_full_cycle, expect_channel_pending_event, expect_channel_ready_event, expect_event,
12-
expect_payment_received_event, expect_payment_successful_event, generate_blocks_and_wait,
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, TestSyncStore,
11+
do_channel_full_cycle, expect_channel_pending_event, expect_channel_ready_event, expect_event, expect_payment_received_event, expect_payment_successful_event, generate_blocks_and_wait, init_custom_logger, init_log_logger, open_channel, premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd, setup_builder, setup_node, setup_two_nodes, wait_for_tx, TestChainSource, TestLogWriter, TestSyncStore
1512
};
1613

1714
use ldk_node::config::EsploraSyncConfig;
1815
use ldk_node::liquidity::LSPS2ServiceConfig;
16+
17+
use ldk_node::logger::LogLevel;
1918
use ldk_node::payment::{
2019
ConfirmationStatus, PaymentDirection, PaymentKind, PaymentStatus, QrPaymentResult,
2120
SendingParameters,
@@ -30,6 +29,7 @@ use bitcoincore_rpc::RpcApi;
3029
use bitcoin::hashes::Hash;
3130
use bitcoin::Amount;
3231
use lightning_invoice::{Bolt11InvoiceDescription, Description};
32+
use log::LevelFilter;
3333

3434
use std::sync::Arc;
3535

@@ -1066,7 +1066,7 @@ fn lsps2_client_service_integration() {
10661066
};
10671067

10681068
let service_config = random_config(true);
1069-
setup_builder!(service_builder, service_config);
1069+
setup_builder!(service_builder, service_config.node_config);
10701070
service_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
10711071
service_builder.set_liquidity_provider_lsps2(lsps2_service_config);
10721072
let service_node = service_builder.build().unwrap();
@@ -1076,14 +1076,14 @@ fn lsps2_client_service_integration() {
10761076
let service_addr = service_node.listening_addresses().unwrap().first().unwrap().clone();
10771077

10781078
let client_config = random_config(true);
1079-
setup_builder!(client_builder, client_config);
1079+
setup_builder!(client_builder, client_config.node_config);
10801080
client_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
10811081
client_builder.set_liquidity_source_lsps2(service_node_id, service_addr, None);
10821082
let client_node = client_builder.build().unwrap();
10831083
client_node.start().unwrap();
10841084

10851085
let payer_config = random_config(true);
1086-
setup_builder!(payer_builder, payer_config);
1086+
setup_builder!(payer_builder, payer_config.node_config);
10871087
payer_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
10881088
let payer_node = payer_builder.build().unwrap();
10891089
payer_node.start().unwrap();
@@ -1144,3 +1144,34 @@ fn lsps2_client_service_integration() {
11441144
let channel_value_sats = client_node.list_channels().first().unwrap().channel_value_sats;
11451145
assert_eq!(channel_value_sats, expected_channel_size_sat);
11461146
}
1147+
1148+
#[test]
1149+
fn facade_logging() {
1150+
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
1151+
let chain_source = TestChainSource::Esplora(&electrsd);
1152+
1153+
let logger = init_log_logger(LevelFilter::Trace);
1154+
let mut config = random_config(false);
1155+
config.log_writer = TestLogWriter::LogFacade { max_log_level: LogLevel::Gossip };
1156+
1157+
println!("== Facade logging start ==");
1158+
let _node = setup_node(&chain_source, config, None);
1159+
println!("== Facade logging end ==");
1160+
1161+
assert!(!logger.retrieve_logs().is_empty());
1162+
}
1163+
1164+
#[test]
1165+
fn custom_logging() {
1166+
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
1167+
let chain_source = TestChainSource::Esplora(&electrsd);
1168+
let logger = init_custom_logger();
1169+
let mut config = random_config(false);
1170+
config.log_writer = TestLogWriter::Custom(logger.clone());
1171+
1172+
println!("== Custom logging start ==");
1173+
let _node = setup_node(&chain_source, config, None);
1174+
println!("== Custom logging end ==");
1175+
1176+
assert!(!logger.retrieve_logs().is_empty());
1177+
}

0 commit comments

Comments
 (0)