88#![ cfg( any( test, cln_test, vss_test) ) ]
99#![ allow( dead_code) ]
1010
11+ use chrono:: Utc ;
1112use ldk_node:: config:: {
1213 Config , EsploraSyncConfig , DEFAULT_LOG_FILENAME , DEFAULT_LOG_LEVEL , DEFAULT_STORAGE_DIR_PATH ,
1314} ;
1415use ldk_node:: io:: sqlite_store:: SqliteStore ;
15- use ldk_node:: logger:: { LogLevel , LogWriter } ;
16+ use ldk_node:: logger:: { LogLevel , LogRecord , LogWriter } ;
1617use ldk_node:: payment:: { PaymentDirection , PaymentKind , PaymentStatus } ;
1718use ldk_node:: {
1819 Builder , CustomTlvRecord , Event , LightningBalance , Node , NodeError , PendingSweepBalance ,
@@ -39,12 +40,13 @@ use bitcoincore_rpc::RpcApi;
3940use electrsd:: { bitcoind, bitcoind:: BitcoinD , ElectrsD } ;
4041use electrum_client:: ElectrumApi ;
4142
43+ use log:: { Level , LevelFilter , Log , Record } ;
4244use rand:: distributions:: Alphanumeric ;
4345use rand:: { thread_rng, Rng } ;
4446
4547use std:: env;
4648use std:: path:: PathBuf ;
47- use std:: sync:: { Arc , RwLock } ;
49+ use std:: sync:: { Arc , Mutex , RwLock } ;
4850use std:: time:: Duration ;
4951
5052macro_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+ }
0 commit comments