@@ -9,6 +9,7 @@ import java.net.http.HttpRequest
99import java.net.http.HttpResponse
1010import kotlin.io.path.createTempDirectory
1111import kotlin.test.assertEquals
12+ import kotlin.test.assertTrue
1213
1314fun runCommandAndWait (vararg cmd : String ): String {
1415 println (" Running command \" ${cmd.joinToString(" " )} \" " )
@@ -92,6 +93,60 @@ fun waitForBlock(esploraEndpoint: String, blockHash: String) {
9293 }
9394}
9495
96+ class CustomLogWriter (private var currentLogLevel : LogLevel = LogLevel .INFO ) :
97+ LogWriter {
98+ enum class LogLevel {
99+ ERROR , WARN , INFO , DEBUG , TRACE , GOSSIP
100+ }
101+
102+ private val logMessages = mutableListOf<String >()
103+
104+ fun setLogLevel (level : LogLevel ) {
105+ currentLogLevel = level
106+ }
107+
108+ fun getLogMessages (): List <String > {
109+ return logMessages.toList()
110+ }
111+
112+ override fun log (record : LogRecord ) {
113+ val recordLevel =
114+ when (record.level.toString().lowercase()) {
115+ " error" -> LogLevel .ERROR
116+ " warn" -> LogLevel .WARN
117+ " info" -> LogLevel .INFO
118+ " debug" -> LogLevel .DEBUG
119+ " trace" -> LogLevel .TRACE
120+ " gossip" -> LogLevel .GOSSIP
121+ else -> LogLevel .INFO
122+ }
123+
124+ if (isLevelEnabled(recordLevel)) {
125+ val logMessage = formatRecord(record)
126+ logMessages.add(logMessage)
127+ println (" $logMessage " )
128+ }
129+ }
130+
131+ private fun formatRecord (record : LogRecord ): String {
132+ val timestamp =
133+ java.time.LocalDateTime .now()
134+ .format(java.time.format.DateTimeFormatter .ofPattern(" yyyy-MM-dd HH:mm:ss" ))
135+ return String .format(
136+ " %s %-6s [%s:%s] %s\n " ,
137+ timestamp,
138+ record.level,
139+ record.modulePath,
140+ record.line,
141+ record.args
142+ )
143+ }
144+
145+ private fun isLevelEnabled (level : LogLevel ): Boolean {
146+ return level.ordinal <= currentLogLevel.ordinal
147+ }
148+ }
149+
95150@TestInstance(TestInstance .Lifecycle .PER_CLASS )
96151class LibraryTest {
97152
@@ -106,6 +161,9 @@ class LibraryTest {
106161 }
107162
108163 @Test fun fullCycle () {
164+ val logWriter1 = CustomLogWriter (CustomLogWriter .LogLevel .GOSSIP )
165+ val logWriter2 = CustomLogWriter (CustomLogWriter .LogLevel .GOSSIP )
166+
109167 val tmpDir1 = createTempDirectory(" ldk_node" ).toString()
110168 println (" Random dir 1: $tmpDir1 " )
111169 val tmpDir2 = createTempDirectory(" ldk_node" ).toString()
@@ -118,21 +176,22 @@ class LibraryTest {
118176 config1.storageDirPath = tmpDir1
119177 config1.listeningAddresses = listOf (listenAddress1)
120178 config1.network = Network .REGTEST
121- config1.logLevel = LogLevel .TRACE
122179
123180 println (" Config 1: $config1 " )
124181
125182 val config2 = defaultConfig()
126183 config2.storageDirPath = tmpDir2
127184 config2.listeningAddresses = listOf (listenAddress2)
128185 config2.network = Network .REGTEST
129- config2.logLevel = LogLevel .TRACE
130186 println (" Config 2: $config2 " )
131187
132188 val builder1 = Builder .fromConfig(config1)
133189 builder1.setChainSourceEsplora(esploraEndpoint, null )
190+ builder1.setCustomLogger(logWriter1)
191+
134192 val builder2 = Builder .fromConfig(config2)
135193 builder2.setChainSourceEsplora(esploraEndpoint, null )
194+ builder2.setCustomLogger(logWriter2)
136195
137196 val node1 = builder1.build()
138197 val node2 = builder2.build()
@@ -265,6 +324,9 @@ class LibraryTest {
265324 assert (spendableBalance1AfterClose < 100000u )
266325 assertEquals(102500uL , spendableBalance2AfterClose)
267326
327+ assertTrue(logWriter1.getLogMessages().isNotEmpty())
328+ assertTrue(logWriter2.getLogMessages().isNotEmpty())
329+
268330 node1.stop()
269331 node2.stop()
270332 }
0 commit comments