Skip to content

Commit dcf757d

Browse files
committed
test(kotlin-jvm): set custom logging via builder method
1 parent e07716d commit dcf757d

File tree

1 file changed

+64
-0
lines changed
  • bindings/kotlin/ldk-node-jvm/lib/src/test/kotlin/org/lightningdevkit/ldknode

1 file changed

+64
-0
lines changed

bindings/kotlin/ldk-node-jvm/lib/src/test/kotlin/org/lightningdevkit/ldknode/LibraryTest.kt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.lightningdevkit.ldknode
22

3+
import com.sun.jna.Pointer
34
import org.junit.jupiter.api.BeforeAll
45
import org.junit.jupiter.api.Test
56
import org.junit.jupiter.api.TestInstance
@@ -9,6 +10,7 @@ import java.net.http.HttpRequest
910
import java.net.http.HttpResponse
1011
import kotlin.io.path.createTempDirectory
1112
import kotlin.test.assertEquals
13+
import kotlin.test.assertTrue
1214

1315
fun 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)
96151
class 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

Comments
 (0)