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 {
@@ -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+ }
0 commit comments