From 2bbf1317c74cf60b06b8a658bb7552d832c45c51 Mon Sep 17 00:00:00 2001 From: Piotr Stachyra Date: Tue, 9 Jun 2026 14:39:48 +0200 Subject: [PATCH] test: add probeNode devtools command --- .../java/to/bitkit/dev/DevToolsProvider.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/app/src/debug/java/to/bitkit/dev/DevToolsProvider.kt b/app/src/debug/java/to/bitkit/dev/DevToolsProvider.kt index e2f5108ad4..acfbfc6283 100644 --- a/app/src/debug/java/to/bitkit/dev/DevToolsProvider.kt +++ b/app/src/debug/java/to/bitkit/dev/DevToolsProvider.kt @@ -62,6 +62,7 @@ private sealed interface DevCommand { fun parse(method: String, arg: String?): DevCommand? = when (method) { CreateInvoice.METHOD -> CreateInvoice.parse(arg) ProbeInvoice.METHOD -> ProbeInvoice.parse(arg) + ProbeNode.METHOD -> ProbeNode.parse(arg) ProbeReadiness.METHOD -> ProbeReadiness else -> null } @@ -126,6 +127,45 @@ private sealed interface DevCommand { } } + data class ProbeNode(val args: Args) : DevCommand { + companion object { + const val METHOD = "probeNode" + fun parse(arg: String?) = ProbeNode(arg.deserialize()) + } + + @Serializable + data class Args( + val targetName: String? = null, + val nodeId: String, + val amountMsat: ULong? = null, + val amountSats: ULong? = null, + val timeoutSeconds: Long = 90, + ) + + override suspend fun execute(deps: DevToolsProvider.Dependencies): DevResult { + val amountSats = args.amountSats ?: args.amountMsat?.let { msatCeilOf(it) } + ?: return DevResult.Error("Probe node requires amountSats or amountMsat") + val timeout = args.timeoutSeconds.coerceAtLeast(1).seconds + + Logger.info( + "Sending keysend probe for target '${args.targetName ?: "unknown"}' nodeId='${args.nodeId}' amountSats='$amountSats'", + context = TAG, + ) + + return deps.lightningRepo().sendProbeForNode(args.nodeId, amountSats) + .fold( + onSuccess = { + deps.lightningRepo().waitForProbeOutcome(it.paymentIds, timeout) + .fold( + onSuccess = { outcome -> outcome.toDevResult(it.paymentIds) }, + onFailure = { error -> DevResult.ProbeFailure.from(error, it.paymentIds) }, + ) + }, + onFailure = { DevResult.ProbeFailure.from(it) }, + ) + } + } + data object ProbeReadiness : DevCommand { const val METHOD = "probeReadiness"