11package org.lightningdevkit.ldknode
22
3+ import com.sun.jna.Pointer
34import org.junit.jupiter.api.BeforeAll
45import org.junit.jupiter.api.Test
56import org.junit.jupiter.api.TestInstance
@@ -9,6 +10,7 @@ import java.net.http.HttpRequest
910import java.net.http.HttpResponse
1011import kotlin.io.path.createTempDirectory
1112import kotlin.test.assertEquals
13+ import kotlin.test.assertTrue
1214
1315fun runCommandAndWait (vararg cmd : String ): String {
1416 println (" Running command \" ${cmd.joinToString(" " )} \" " )
@@ -92,6 +94,59 @@ fun waitForBlock(esploraEndpoint: String, blockHash: String) {
9294 }
9395}
9496
97+ class CustomLogWriter (private var currentLogLevel : LogLevel = LogLevel .INFO , noPointer : NoPointer = NoPointer ) :
98+ LogWriter (noPointer) {
99+ enum class LogLevel {
100+ ERROR , WARN , INFO , DEBUG , TRACE , GOSSIP
101+ }
102+
103+ private val logMessages = mutableListOf<String >()
104+
105+ fun setLogLevel (level : LogLevel ) {
106+ currentLogLevel = level
107+ }
108+
109+ fun getLogMessages (): List <String > {
110+ return logMessages.toList()
111+ }
112+
113+ override fun log (record : LogRecord ) {
114+ val recordLevel =
115+ when (record.level.toString().lowercase()) {
116+ " error" -> LogLevel .ERROR
117+ " warn" -> LogLevel .WARN
118+ " info" -> LogLevel .INFO
119+ " debug" -> LogLevel .DEBUG
120+ " trace" -> LogLevel .TRACE
121+ " gossip" -> LogLevel .GOSSIP
122+ else -> LogLevel .INFO
123+ }
124+
125+ if (isLevelEnabled(recordLevel)) {
126+ val logMessage = formatRecord(record)
127+ logMessages.add(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 %-5s [%s:%d] %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()
@@ -129,8 +187,11 @@ class LibraryTest {
129187
130188 val builder1 = Builder .fromConfig(config1)
131189 builder1.setChainSourceEsplora(esploraEndpoint, null )
190+ builder1.setCustomLogger(logWriter1)
191+
132192 val builder2 = Builder .fromConfig(config2)
133193 builder2.setChainSourceEsplora(esploraEndpoint, null )
194+ builder2.setCustomLogger(logWriter2)
134195
135196 val node1 = builder1.build()
136197 val node2 = builder2.build()
@@ -262,6 +323,9 @@ class LibraryTest {
262323 assert (spendableBalance1AfterClose < 100000u )
263324 assertEquals(102500uL , spendableBalance2AfterClose)
264325
326+ assertTrue(logWriter1.getLogMessages().isNotEmpty())
327+ assertTrue(logWriter2.getLogMessages().isNotEmpty())
328+
265329 node1.stop()
266330 node2.stop()
267331 }
0 commit comments