Detect and send node version in api (#445)

This commit is contained in:
KirillPamPam
2024-03-29 19:25:22 +04:00
committed by GitHub
parent 5fedc28d24
commit 7e9709bb6f
39 changed files with 459 additions and 151 deletions

View File

@@ -5,6 +5,8 @@ import io.emeraldpay.api.proto.BlockchainOuterClass.NativeCallReplyItem
import io.emeraldpay.api.proto.BlockchainOuterClass.NativeCallRequest
import io.emeraldpay.dshackle.config.MainConfig
import io.emeraldpay.dshackle.upstream.MultistreamHolder
import io.emeraldpay.dshackle.upstream.UNKNOWN_CLIENT_VERSION
import io.emeraldpay.dshackle.upstream.Upstream
import io.emeraldpay.dshackle.upstream.signature.ResponseSigner
import io.emeraldpay.dshackle.upstream.stream.Chunk
import org.junit.jupiter.api.Test
@@ -31,7 +33,7 @@ class NativeCallTest {
),
) {
on { nativeCallResult(request) } doReturn Flux.just(
NativeCall.CallResult.ok(1, null, "0x1".toByteArray(), null, "id", null),
NativeCall.CallResult.ok(1, null, "0x1".toByteArray(), null, Upstream.UpstreamSettingsData("id"), null),
)
}
@@ -39,6 +41,7 @@ class NativeCallTest {
.expectNext(
NativeCallReplyItem.newBuilder()
.setUpstreamId("id")
.setUpstreamNodeVersion(UNKNOWN_CLIENT_VERSION)
.setId(1)
.setSucceed(true)
.setPayload(ByteString.copyFrom("0x1".toByteArray()))
@@ -60,7 +63,7 @@ class NativeCallTest {
),
) {
on { nativeCallResult(request) } doReturn Flux.just(
NativeCall.CallResult(1, null, null, NativeCall.CallError(50001, "message", null, null, "upId"), null, null),
NativeCall.CallResult(1, null, null, NativeCall.CallError(50001, "message", null, null, Upstream.UpstreamSettingsData("upId")), null, null),
)
}
@@ -69,6 +72,7 @@ class NativeCallTest {
NativeCallReplyItem.newBuilder()
.setUpstreamId("upId")
.setId(1)
.setUpstreamNodeVersion(UNKNOWN_CLIENT_VERSION)
.setSucceed(false)
.setErrorMessage("message")
.setItemErrorCode(50001)
@@ -95,7 +99,7 @@ class NativeCallTest {
),
) {
on { nativeCallResult(request) } doReturn Flux.just(
NativeCall.CallResult.ok(1, null, "".toByteArray(), null, "upId", null, chunks),
NativeCall.CallResult.ok(1, null, "".toByteArray(), null, Upstream.UpstreamSettingsData("upId"), null, chunks),
)
}
@@ -104,6 +108,7 @@ class NativeCallTest {
NativeCallReplyItem.newBuilder()
.setUpstreamId("upId")
.setId(1)
.setUpstreamNodeVersion(UNKNOWN_CLIENT_VERSION)
.setChunked(true)
.setSucceed(true)
.setPayload(ByteString.copyFrom("0x1".toByteArray()))

View File

@@ -0,0 +1,46 @@
package io.emeraldpay.dshackle.upstream.near
import io.emeraldpay.dshackle.reader.ChainReader
import io.emeraldpay.dshackle.upstream.ChainRequest
import io.emeraldpay.dshackle.upstream.ChainResponse
import io.emeraldpay.dshackle.upstream.Upstream
import io.emeraldpay.dshackle.upstream.rpcclient.ListParams
import org.junit.jupiter.api.Test
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import reactor.core.publisher.Mono
import reactor.test.StepVerifier
class NearUpstreamSettingsDetectorTest {
@Test
fun `detect client version`() {
val reader = mock<ChainReader> {
on { read(ChainRequest("status", ListParams())) } doReturn
Mono.just(
ChainResponse(
"""
{
"version": {
"build": "1.38.1",
"rustc_version": "1.75.0",
"version": "1.38.1"
}
}
""".trimIndent().toByteArray(),
null,
),
)
}
val up = mock<Upstream> {
on { getIngressReader() } doReturn reader
}
val detector = NearUpstreamSettingsDetector(up)
StepVerifier.create(detector.detectClientVersion())
.expectNext("1.38.1")
.expectComplete()
.verify()
}
}

View File

@@ -0,0 +1,71 @@
package io.emeraldpay.dshackle.upstream.solana
import io.emeraldpay.dshackle.reader.ChainReader
import io.emeraldpay.dshackle.upstream.ChainCallError
import io.emeraldpay.dshackle.upstream.ChainRequest
import io.emeraldpay.dshackle.upstream.ChainResponse
import io.emeraldpay.dshackle.upstream.UNKNOWN_CLIENT_VERSION
import io.emeraldpay.dshackle.upstream.Upstream
import io.emeraldpay.dshackle.upstream.rpcclient.ListParams
import org.junit.jupiter.api.Test
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import reactor.core.publisher.Mono
import reactor.test.StepVerifier
class SolanaUpstreamSettingsDetectorTest {
@Test
fun `detect client version`() {
val reader = mock<ChainReader> {
on { read(ChainRequest("getVersion", ListParams())) } doReturn
Mono.just(
ChainResponse(
"""
{
"feature-set": 2891131721,
"solana-core": "1.16.7"
}
""".trimIndent().toByteArray(),
null,
),
)
}
val up = mock<Upstream> {
on { getIngressReader() } doReturn reader
}
val detector = SolanaUpstreamSettingsDetector(up)
StepVerifier.create(detector.detectClientVersion())
.expectNext("1.16.7")
.expectComplete()
.verify()
}
@Test
fun `unknown client if there is an error`() {
val reader = mock<ChainReader> {
on { read(ChainRequest("getVersion", ListParams())) } doReturn
Mono.just(
ChainResponse(
null,
ChainCallError(
1,
"message",
),
),
)
}
val up = mock<Upstream> {
on { getIngressReader() } doReturn reader
}
val detector = SolanaUpstreamSettingsDetector(up)
StepVerifier.create(detector.detectClientVersion())
.expectNext(UNKNOWN_CLIENT_VERSION)
.expectComplete()
.verify()
}
}