@@ -9,7 +9,8 @@ import java.net.http.HttpRequest
9
9
import java.net.http.HttpResponse
10
10
import kotlin.io.path.createTempDirectory
11
11
import kotlin.test.assertEquals
12
-
12
+ import kotlin.test.assertTrue
13
+ ~~~
13
14
fun runCommandAndWait (vararg cmd : String ): String {
14
15
println (" Running command \" ${cmd.joinToString(" " )} \" " )
15
16
@@ -92,6 +93,59 @@ fun waitForBlock(esploraEndpoint: String, blockHash: String) {
92
93
}
93
94
}
94
95
96
+ class CustomLogWriter (private var currentLogLevel : LogLevel = LogLevel .INFO , noPointer : NoPointer = NoPointer ) :
97
+ LogWriter (noPointer) {
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
+ }
128
+ }
129
+
130
+ private fun formatRecord (record : LogRecord ): String {
131
+ val timestamp =
132
+ java.time.LocalDateTime .now()
133
+ .format(java.time.format.DateTimeFormatter .ofPattern(" yyyy-MM-dd HH:mm:ss" ))
134
+ return String .format(
135
+ " %s %-5s [%s:%d] %s\n " ,
136
+ timestamp,
137
+ record.level,
138
+ record.modulePath,
139
+ record.line,
140
+ record.args
141
+ )
142
+ }
143
+
144
+ private fun isLevelEnabled (level : LogLevel ): Boolean {
145
+ return level.ordinal <= currentLogLevel.ordinal
146
+ }
147
+ }
148
+
95
149
@TestInstance(TestInstance .Lifecycle .PER_CLASS )
96
150
class LibraryTest {
97
151
@@ -106,6 +160,9 @@ class LibraryTest {
106
160
}
107
161
108
162
@Test fun fullCycle () {
163
+ val logWriter1 = CustomLogWriter (CustomLogWriter .LogLevel .GOSSIP )
164
+ val logWriter2 = CustomLogWriter (CustomLogWriter .LogLevel .GOSSIP )
165
+
109
166
val tmpDir1 = createTempDirectory(" ldk_node" ).toString()
110
167
println (" Random dir 1: $tmpDir1 " )
111
168
val tmpDir2 = createTempDirectory(" ldk_node" ).toString()
@@ -129,8 +186,11 @@ class LibraryTest {
129
186
130
187
val builder1 = Builder .fromConfig(config1)
131
188
builder1.setChainSourceEsplora(esploraEndpoint, null )
189
+ builder1.setCustomLogger(logWriter1)
190
+
132
191
val builder2 = Builder .fromConfig(config2)
133
192
builder2.setChainSourceEsplora(esploraEndpoint, null )
193
+ builder2.setCustomLogger(logWriter2)
134
194
135
195
val node1 = builder1.build()
136
196
val node2 = builder2.build()
@@ -262,6 +322,9 @@ class LibraryTest {
262
322
assert (spendableBalance1AfterClose < 100000u )
263
323
assertEquals(102500uL , spendableBalance2AfterClose)
264
324
325
+ assertTrue(logWriter1.getLogMessages().isNotEmpty())
326
+ assertTrue(logWriter2.getLogMessages().isNotEmpty())
327
+
265
328
node1.stop()
266
329
node2.stop()
267
330
}
0 commit comments