@@ -9,6 +9,9 @@ import java.net.http.HttpRequest
99import java.net.http.HttpResponse
1010import kotlin.io.path.createTempDirectory
1111import kotlin.test.assertEquals
12+ import com.sun.jna.Pointer
13+ import kotlin.test.DefaultAsserter.assertTrue
14+ import kotlin.test.assertTrue
1215
1316fun runCommandAndWait (vararg cmd : String ): String {
1417 println (" Running command \" ${cmd.joinToString(" " )} \" " )
@@ -92,6 +95,59 @@ fun waitForBlock(esploraEndpoint: String, blockHash: String) {
9295 }
9396}
9497
98+ class CustomLogWriter (private var currentLogLevel : LogLevel = LogLevel .INFO ) :
99+ LogWriter (Pointer .NULL ) {
100+ enum class LogLevel {
101+ ERROR , WARN , INFO , DEBUG , TRACE , GOSSIP
102+ }
103+
104+ private val logMessages = mutableListOf<String >()
105+
106+ fun setLogLevel (level : LogLevel ) {
107+ currentLogLevel = level
108+ }
109+
110+ fun getLogMessages (): List <String > {
111+ return logMessages.toList()
112+ }
113+
114+ override fun log (record : LogRecord ) {
115+ val recordLevel =
116+ when (record.level.toString().lowercase()) {
117+ " error" -> LogLevel .ERROR
118+ " warn" -> LogLevel .WARN
119+ " info" -> LogLevel .INFO
120+ " debug" -> LogLevel .DEBUG
121+ " trace" -> LogLevel .TRACE
122+ " gossip" -> LogLevel .GOSSIP
123+ else -> LogLevel .INFO
124+ }
125+
126+ if (isLevelEnabled(recordLevel)) {
127+ val logMessage = formatRecord(record)
128+ logMessages.add(logMessage)
129+ }
130+ }
131+
132+ private fun formatRecord (record : LogRecord ): String {
133+ val timestamp =
134+ java.time.LocalDateTime .now()
135+ .format(java.time.format.DateTimeFormatter .ofPattern(" yyyy-MM-dd HH:mm:ss" ))
136+ return String .format(
137+ " %s %-5s [%s:%d] %s\n " ,
138+ timestamp,
139+ record.level,
140+ record.modulePath,
141+ record.line,
142+ record.args
143+ )
144+ }
145+
146+ private fun isLevelEnabled (level : LogLevel ): Boolean {
147+ return level.ordinal <= currentLogLevel.ordinal
148+ }
149+ }
150+
95151@TestInstance(TestInstance .Lifecycle .PER_CLASS )
96152class LibraryTest {
97153
@@ -106,6 +162,9 @@ class LibraryTest {
106162 }
107163
108164 @Test fun fullCycle () {
165+ val logWriter1 = CustomLogWriter (CustomLogWriter .LogLevel .GOSSIP )
166+ val logWriter2 = CustomLogWriter (CustomLogWriter .LogLevel .GOSSIP )
167+
109168 val tmpDir1 = createTempDirectory(" ldk_node" ).toString()
110169 println (" Random dir 1: $tmpDir1 " )
111170 val tmpDir2 = createTempDirectory(" ldk_node" ).toString()
@@ -129,8 +188,11 @@ class LibraryTest {
129188
130189 val builder1 = Builder .fromConfig(config1)
131190 builder1.setChainSourceEsplora(esploraEndpoint, null )
191+ builder1.setCustomLogger(logWriter1)
192+
132193 val builder2 = Builder .fromConfig(config2)
133194 builder2.setChainSourceEsplora(esploraEndpoint, null )
195+ builder2.setCustomLogger(logWriter2)
134196
135197 val node1 = builder1.build()
136198 val node2 = builder2.build()
@@ -262,6 +324,9 @@ class LibraryTest {
262324 assert (spendableBalance1AfterClose < 100000u )
263325 assertEquals(102500uL , spendableBalance2AfterClose)
264326
327+ assertTrue(logWriter1.getLogMessages().isNotEmpty())
328+ assertTrue(logWriter2.getLogMessages().isNotEmpty())
329+
265330 node1.stop()
266331 node2.stop()
267332 }
0 commit comments