Pass all upstreams that resolved a request (#531)

This commit is contained in:
KirillPamPam
2024-07-25 14:55:00 +04:00
committed by GitHub
parent 008b4c51d2
commit ee8181ea29
27 changed files with 133 additions and 94 deletions

View File

@@ -116,7 +116,7 @@ abstract class BaseHandler(
// If Proxy is configured to preserve original order it means that a client expect responses at exact same position // If Proxy is configured to preserve original order it means that a client expect responses at exact same position
// as requests even if a request completely failed for a some reason. It's very unlikely situation, but still possible // as requests even if a request completely failed for a some reason. It's very unlikely situation, but still possible
// At this case, if we found a gap in responses, we put a default response with an error // At this case, if we found a gap in responses, we put a default response with an error
?: NativeCall.CallResult(id, null, null, NativeCall.CallError(id, "No response", null, null), null, null, null) ?: NativeCall.CallResult(id, null, null, NativeCall.CallError(id, "No response", null, null), null, emptyList(), null)
} }
} }
.flatMapMany { .flatMapMany {

View File

@@ -183,7 +183,7 @@ class WebsocketHandler(
} }
Mono.just(response) Mono.just(response)
.map { Global.objectMapper.writeValueAsString(it) } .map { Global.objectMapper.writeValueAsString(it) }
.doOnNext { eventHandler.onResponse(NativeCall.CallResult.ok(0, null, it.toByteArray(), null, null, null)) } .doOnNext { eventHandler.onResponse(NativeCall.CallResult.ok(0, null, it.toByteArray(), null, emptyList(), null)) }
.doFinally { eventHandler.close() } .doFinally { eventHandler.close() }
} else { } else {
val eventHandler: AccessHandlerHttp.RequestHandler = eventHandlerFactory.call() val eventHandler: AccessHandlerHttp.RequestHandler = eventHandlerFactory.call()

View File

@@ -223,8 +223,12 @@ class QuorumRequestReader(
} }
} }
private fun resolvedBy() = private fun resolvedBy(): List<Upstream.UpstreamSettingsData> {
if (quorum.getResolvedBy().isEmpty()) null else quorum.getResolvedBy().last().getUpstreamSettingsData() if (quorum.getResolvedBy().isEmpty()) {
return emptyList()
}
return quorum.getResolvedBy().last().getUpstreamSettingsData()?.run { listOf(this) } ?: emptyList()
}
private fun noResponse(method: String, q: CallQuorum): Mono<Result> { private fun noResponse(method: String, q: CallQuorum): Mono<Result> {
return apiControl.upstreamsMatchesResponse()?.run { return apiControl.upstreamsMatchesResponse()?.run {
@@ -232,7 +236,7 @@ class QuorumRequestReader(
val cause = getCause(method) ?: return Mono.error(RpcException(1, "No response for method $method", getFullCause())) val cause = getCause(method) ?: return Mono.error(RpcException(1, "No response for method $method", getFullCause()))
if (cause.shouldReturnNull) { if (cause.shouldReturnNull) {
Mono.just( Mono.just(
Result(Global.nullValue, null, 1, null, null), Result(Global.nullValue, null, 1, emptyList(), null),
) )
} else { } else {
Mono.error(RpcException(1, "No response for method $method. Cause - ${cause.cause}")) Mono.error(RpcException(1, "No response for method $method. Cause - ${cause.cause}"))

View File

@@ -46,26 +46,28 @@ class BroadcastReader(
val sig = getSignature(key, it.jsonRpcResponse, it.upstream.getId()) val sig = getSignature(key, it.jsonRpcResponse, it.upstream.getId())
quorum.record(it.jsonRpcResponse, sig, it.upstream) quorum.record(it.jsonRpcResponse, sig, it.upstream)
} else { } else {
val err = ChainException(ChainResponse.NumberId(key.id), it.jsonRpcResponse.error!!, it.upstream.getUpstreamSettingsData()) val upData = it.upstream.getUpstreamSettingsData()?.run { listOf(this) } ?: emptyList()
val err = ChainException(ChainResponse.NumberId(key.id), it.jsonRpcResponse.error!!, upData)
quorum.record(err, null, it.upstream) quorum.record(err, null, it.upstream)
} }
quorum quorum
}.onErrorResume { err -> }.onErrorResume { err ->
log.error("Broadcast error: ${err.message}") log.error("Broadcast error: ${err.message}")
Mono.error(handleError(null, 0, null)) Mono.error(handleError(null, 0, emptyList()))
}.collectList() }.collectList()
.flatMap { .flatMap {
val upsData = quorum.getResolvedBy().mapNotNull { it.getUpstreamSettingsData() }
if (quorum.isResolved()) { if (quorum.isResolved()) {
val res = Result( val res = Result(
quorum.getResponse()!!.getResult(), quorum.getResponse()!!.getResult(),
quorum.getSignature(), quorum.getSignature(),
upstreams.size, upstreams.size,
quorum.getResolvedBy().first().getUpstreamSettingsData(), upsData,
null, null,
) )
Mono.just(res) Mono.just(res)
} else { } else {
Mono.error(handleError(quorum.getError(), key.id, null)) Mono.error(handleError(quorum.getError(), key.id, upsData))
} }
} }
} }

View File

@@ -34,9 +34,12 @@ abstract class RequestReader(
) )
} }
protected fun handleError(error: ChainCallError?, id: Int, upstreamSettingsData: Upstream.UpstreamSettingsData?) = protected fun handleError(
error?.asException(ChainResponse.NumberId(id), upstreamSettingsData) error: ChainCallError?,
?: ChainException(ChainResponse.NumberId(id), ChainCallError(-32603, "Unhandled Upstream error"), upstreamSettingsData) id: Int,
upstreamSettingsData: List<Upstream.UpstreamSettingsData>,
) = error?.asException(ChainResponse.NumberId(id), upstreamSettingsData)
?: ChainException(ChainResponse.NumberId(id), ChainCallError(-32603, "Unhandled Upstream error"), upstreamSettingsData)
protected fun getSignature(key: ChainRequest, response: ChainResponse, upstreamId: String) = protected fun getSignature(key: ChainRequest, response: ChainResponse, upstreamId: String) =
response.providedSignature response.providedSignature
@@ -50,7 +53,7 @@ abstract class RequestReader(
val value: ByteArray, val value: ByteArray,
val signature: ResponseSigner.Signature?, val signature: ResponseSigner.Signature?,
val quorum: Int, val quorum: Int,
val resolvedUpstreamData: Upstream.UpstreamSettingsData?, val resolvedUpstreamData: List<Upstream.UpstreamSettingsData>,
val stream: Flux<Chunk>?, val stream: Flux<Chunk>?,
) )
} }

View File

@@ -138,10 +138,15 @@ open class NativeCall(
Flux.concat( Flux.concat(
Mono.just(firstChunk) Mono.just(firstChunk)
.map { .map {
buildStreamResult(it, callResult.id) val result = buildStreamResult(it, callResult.id)
.setUpstreamId(callResult.upstreamSettingsData?.id) if (callResult.upstreamSettingsData.isNotEmpty()) {
.setUpstreamNodeVersion(callResult.upstreamSettingsData?.nodeVersion) getUpstreamIdsAndVersions(callResult.upstreamSettingsData)
.build() .let { idsAndVersions ->
result.upstreamId = idsAndVersions.first
result.upstreamNodeVersion = idsAndVersions.second
}
}
result.build()
}, },
stream.skip(1).map { buildStreamResult(it, callResult.id).build() }, stream.skip(1).map { buildStreamResult(it, callResult.id).build() },
) )
@@ -213,7 +218,7 @@ open class NativeCall(
val error = callContext.getError() val error = callContext.getError()
Mono.just( Mono.just(
CallResult(error.id, 0, null, error, null, null, null), CallResult(error.id, 0, null, error, null, emptyList(), null),
) )
} }
} }
@@ -242,9 +247,10 @@ open class NativeCall(
if (it.nonce != null && it.signature != null) { if (it.nonce != null && it.signature != null) {
result.signature = buildSignature(it.nonce, it.signature) result.signature = buildSignature(it.nonce, it.signature)
} }
it.upstreamSettingsData?.let { if (it.upstreamSettingsData.isNotEmpty()) {
result.upstreamId = it.id val idsAndVersions = getUpstreamIdsAndVersions(it.upstreamSettingsData)
result.upstreamNodeVersion = it.nodeVersion result.upstreamId = idsAndVersions.first
result.upstreamNodeVersion = idsAndVersions.second
} }
it.finalization?.let { it.finalization?.let {
result.finalization = Common.FinalizationData.newBuilder() result.finalization = Common.FinalizationData.newBuilder()
@@ -397,6 +403,13 @@ open class NativeCall(
} }
} }
private fun getUpstreamIdsAndVersions(upstreamSettingsData: List<Upstream.UpstreamSettingsData>): Pair<String, String> {
return Pair(
upstreamSettingsData.joinToString { it.id },
upstreamSettingsData.joinToString { it.nodeVersion },
)
}
private fun parsedCallDetails(item: BlockchainOuterClass.NativeCallItem): ParsedCallDetails { private fun parsedCallDetails(item: BlockchainOuterClass.NativeCallItem): ParsedCallDetails {
return if (item.hasPayload()) { return if (item.hasPayload()) {
ParsedCallDetails(item.method, extractParams(item.payload.toStringUtf8())) ParsedCallDetails(item.method, extractParams(item.payload.toStringUtf8()))
@@ -432,10 +445,17 @@ open class NativeCall(
.read(ctx.payload.toChainRequest(ctx.nonce, ctx.forwardedSelector, false)) .read(ctx.payload.toChainRequest(ctx.nonce, ctx.forwardedSelector, false))
.map { .map {
val result = it.getResult() val result = it.getResult()
val resolvedUpstreamData = it.resolvedUpstreamData ?: ctx.upstream.getUpstreamSettingsData() val resolvedUpstreamData = it.resolvedUpstreamData.ifEmpty {
ctx.upstream.getUpstreamSettingsData()?.run { listOf(this) } ?: emptyList()
}
validateResult(result, "local", ctx) validateResult(result, "local", ctx)
if (ctx.nonce != null) { if (ctx.nonce != null) {
CallResult.ok(ctx.id, ctx.nonce, result, signer.sign(ctx.nonce, result, resolvedUpstreamData?.id ?: ctx.upstream.getId()), resolvedUpstreamData, ctx, it.finalization) val source = if (resolvedUpstreamData.isNotEmpty()) {
resolvedUpstreamData[0].id
} else {
ctx.upstream.getId()
}
CallResult.ok(ctx.id, ctx.nonce, result, signer.sign(ctx.nonce, result, source), resolvedUpstreamData, ctx, it.finalization)
} else { } else {
CallResult.ok(ctx.id, null, result, null, resolvedUpstreamData, ctx, it.finalization) CallResult.ok(ctx.id, null, result, null, resolvedUpstreamData, ctx, it.finalization)
} }
@@ -446,8 +466,8 @@ open class NativeCall(
.onErrorResume { .onErrorResume {
Mono.just(CallResult.fail(ctx.id, ctx.nonce, it, ctx)) Mono.just(CallResult.fail(ctx.id, ctx.nonce, it, ctx))
}.doOnNext { }.doOnNext {
if (it.finalization != null && it.upstreamSettingsData != null) { if (it.finalization != null && it.upstreamSettingsData.isNotEmpty()) {
ctx.upstream.addFinalization(it.finalization, it.upstreamSettingsData.id) ctx.upstream.addFinalization(it.finalization, it.upstreamSettingsData[0].id)
} }
} }
} }
@@ -465,7 +485,9 @@ open class NativeCall(
return SpannedReader(reader, tracer, RPC_READER) return SpannedReader(reader, tracer, RPC_READER)
.read(ctx.payload.toChainRequest(ctx.nonce, ctx.forwardedSelector, ctx.streamRequest)) .read(ctx.payload.toChainRequest(ctx.nonce, ctx.forwardedSelector, ctx.streamRequest))
.map { .map {
val resolvedUpstreamData = it.resolvedUpstreamData ?: ctx.upstream.getUpstreamSettingsData() val resolvedUpstreamData = it.resolvedUpstreamData.ifEmpty {
ctx.upstream.getUpstreamSettingsData()?.run { listOf(this) } ?: emptyList()
}
if (it.stream == null) { if (it.stream == null) {
val bytes = ctx.resultDecorator.processResult(it) val bytes = ctx.resultDecorator.processResult(it)
validateResult(bytes, "remote", ctx) validateResult(bytes, "remote", ctx)
@@ -563,8 +585,8 @@ open class NativeCall(
} }
override fun processResult(result: RequestReader.Result): ByteArray { override fun processResult(result: RequestReader.Result): ByteArray {
val bytes = result.value val bytes = result.value
if (bytes.last() == quoteCode && result.resolvedUpstreamData != null) { if (bytes.last() == quoteCode && result.resolvedUpstreamData.isNotEmpty()) {
val suffix = result.resolvedUpstreamData.nodeId val suffix = result.resolvedUpstreamData[0].nodeId
.toUByte() .toUByte()
.toString(16).padStart(2, padChar = '0').toByteArray() .toString(16).padStart(2, padChar = '0').toByteArray()
bytes[bytes.lastIndex] = suffix.first() bytes[bytes.lastIndex] = suffix.first()
@@ -678,7 +700,7 @@ open class NativeCall(
val message: String, val message: String,
val upstreamError: ChainCallError?, val upstreamError: ChainCallError?,
val data: String?, val data: String?,
val upstreamSettingsData: Upstream.UpstreamSettingsData? = null, val upstreamSettingsData: List<Upstream.UpstreamSettingsData> = emptyList(),
) { ) {
companion object { companion object {
@@ -719,7 +741,7 @@ open class NativeCall(
val result: ByteArray?, val result: ByteArray?,
val error: CallError?, val error: CallError?,
val signature: ResponseSigner.Signature?, val signature: ResponseSigner.Signature?,
val upstreamSettingsData: Upstream.UpstreamSettingsData?, val upstreamSettingsData: List<Upstream.UpstreamSettingsData>,
val ctx: ValidCallContext<ParsedCallDetails>?, val ctx: ValidCallContext<ParsedCallDetails>?,
val stream: Flux<Chunk>? = null, val stream: Flux<Chunk>? = null,
val finalization: FinalizationData? = null, val finalization: FinalizationData? = null,
@@ -732,23 +754,23 @@ open class NativeCall(
callError: CallError?, callError: CallError?,
signature: ResponseSigner.Signature?, signature: ResponseSigner.Signature?,
ctx: ValidCallContext<ParsedCallDetails>?, ctx: ValidCallContext<ParsedCallDetails>?,
) : this(id, nonce, result, callError, signature, callError?.upstreamSettingsData, ctx) ) : this(id, nonce, result, callError, signature, callError?.upstreamSettingsData ?: emptyList(), ctx)
companion object { companion object {
fun ok(id: Int, nonce: Long?, result: ByteArray, signature: ResponseSigner.Signature?, upstreamSettingsData: Upstream.UpstreamSettingsData?, ctx: ValidCallContext<ParsedCallDetails>?): CallResult { fun ok(id: Int, nonce: Long?, result: ByteArray, signature: ResponseSigner.Signature?, upstreamSettingsData: List<Upstream.UpstreamSettingsData>, ctx: ValidCallContext<ParsedCallDetails>?): CallResult {
return CallResult(id, nonce, result, null, signature, upstreamSettingsData, ctx) return CallResult(id, nonce, result, null, signature, upstreamSettingsData, ctx)
} }
fun ok(id: Int, nonce: Long?, result: ByteArray, signature: ResponseSigner.Signature?, upstreamSettingsData: Upstream.UpstreamSettingsData?, ctx: ValidCallContext<ParsedCallDetails>?, final: FinalizationData?): CallResult { fun ok(id: Int, nonce: Long?, result: ByteArray, signature: ResponseSigner.Signature?, upstreamSettingsData: List<Upstream.UpstreamSettingsData>, ctx: ValidCallContext<ParsedCallDetails>?, final: FinalizationData?): CallResult {
return CallResult(id, nonce, result, null, signature, upstreamSettingsData, ctx, null, final) return CallResult(id, nonce, result, null, signature, upstreamSettingsData, ctx, null, final)
} }
fun ok(id: Int, nonce: Long?, result: ByteArray, signature: ResponseSigner.Signature?, upstreamSettingsData: Upstream.UpstreamSettingsData?, ctx: ValidCallContext<ParsedCallDetails>?, stream: Flux<Chunk>?): CallResult { fun ok(id: Int, nonce: Long?, result: ByteArray, signature: ResponseSigner.Signature?, upstreamSettingsData: List<Upstream.UpstreamSettingsData>, ctx: ValidCallContext<ParsedCallDetails>?, stream: Flux<Chunk>?): CallResult {
return CallResult(id, nonce, result, null, signature, upstreamSettingsData, ctx, stream) return CallResult(id, nonce, result, null, signature, upstreamSettingsData, ctx, stream)
} }
fun fail(id: Int, nonce: Long?, error: CallError, ctx: ValidCallContext<ParsedCallDetails>?): CallResult { fun fail(id: Int, nonce: Long?, error: CallError, ctx: ValidCallContext<ParsedCallDetails>?): CallResult {
return CallResult(id, nonce, null, error, null, null, ctx) return CallResult(id, nonce, null, error, null, emptyList(), ctx)
} }
fun fail(id: Int, nonce: Long?, error: Throwable, ctx: ValidCallContext<ParsedCallDetails>?): CallResult { fun fail(id: Int, nonce: Long?, error: Throwable, ctx: ValidCallContext<ParsedCallDetails>?): CallResult {

View File

@@ -36,7 +36,7 @@ data class ChainCallError(val code: Int, val message: String, val details: Any?)
return ChainCallUpstreamException(id ?: ChainResponse.NumberId(-1), this) return ChainCallUpstreamException(id ?: ChainResponse.NumberId(-1), this)
} }
fun asException(id: ChainResponse.Id?, upstreamSettingsData: Upstream.UpstreamSettingsData?): ChainException { fun asException(id: ChainResponse.Id?, upstreamSettingsData: List<Upstream.UpstreamSettingsData>): ChainException {
return ChainException(id ?: ChainResponse.NumberId(-1), this, upstreamSettingsData, false) return ChainException(id ?: ChainResponse.NumberId(-1), this, upstreamSettingsData, false)
} }
} }

View File

@@ -3,4 +3,4 @@ package io.emeraldpay.dshackle.upstream
class ChainCallUpstreamException( class ChainCallUpstreamException(
id: ChainResponse.Id, id: ChainResponse.Id,
error: ChainCallError, error: ChainCallError,
) : ChainException(id, error, null, false) ) : ChainException(id, error, emptyList(), false)

View File

@@ -20,7 +20,7 @@ import io.emeraldpay.dshackle.upstream.ethereum.rpc.RpcException
open class ChainException( open class ChainException(
val id: ChainResponse.Id, val id: ChainResponse.Id,
val error: ChainCallError, val error: ChainCallError,
val upstreamSettingsData: Upstream.UpstreamSettingsData? = null, val upstreamSettingsData: List<Upstream.UpstreamSettingsData> = emptyList(),
writableStackTrace: Boolean = true, writableStackTrace: Boolean = true,
cause: Throwable? = null, cause: Throwable? = null,
) : Exception(error.message, cause, true, writableStackTrace) { ) : Exception(error.message, cause, true, writableStackTrace) {

View File

@@ -33,18 +33,18 @@ class ChainResponse @JvmOverloads constructor(
* When making a request through Dshackle protocol a remote may provide its signature with the response, which we keep here * When making a request through Dshackle protocol a remote may provide its signature with the response, which we keep here
*/ */
val providedSignature: ResponseSigner.Signature? = null, val providedSignature: ResponseSigner.Signature? = null,
val resolvedUpstreamData: Upstream.UpstreamSettingsData? = null, val resolvedUpstreamData: List<Upstream.UpstreamSettingsData> = emptyList(),
val finalization: FinalizationData? = null, val finalization: FinalizationData? = null,
) { ) {
constructor(stream: Flux<Chunk>, id: Int) : constructor(stream: Flux<Chunk>, id: Int) :
this(null, null, NumberId(id.toLong()), stream, null, null, null) this(null, null, NumberId(id.toLong()), stream, null, emptyList(), null)
constructor(result: ByteArray?, error: ChainCallError?) : this(result, error, NumberId(0), null, null) constructor(result: ByteArray?, error: ChainCallError?) : this(result, error, NumberId(0), null, null)
constructor(result: ByteArray?, error: ChainCallError?, resolvedUpstreamData: Upstream.UpstreamSettingsData?) : constructor(result: ByteArray?, error: ChainCallError?, resolvedUpstreamData: List<Upstream.UpstreamSettingsData>) :
this(result, error, NumberId(0), null, null, resolvedUpstreamData, null) this(result, error, NumberId(0), null, null, resolvedUpstreamData, null)
constructor(result: ByteArray?, resolvedUpstreamData: Upstream.UpstreamSettingsData?, finalization: FinalizationData) : constructor(result: ByteArray?, resolvedUpstreamData: List<Upstream.UpstreamSettingsData>, finalization: FinalizationData) :
this(result, null, NumberId(0), null, null, resolvedUpstreamData, finalization) this(result, null, NumberId(0), null, null, resolvedUpstreamData, finalization)
companion object { companion object {

View File

@@ -157,7 +157,7 @@ open class EthereumCachingReader(
) : Reader<K, Result<D>> { ) : Reader<K, Result<D>> {
override fun read(key: K): Mono<Result<D>> { override fun read(key: K): Mono<Result<D>> {
return reader.read(key) return reader.read(key)
.map { Result(it, null) } .map { Result(it, emptyList()) }
} }
} }
} }

View File

@@ -274,6 +274,6 @@ class EthereumDirectReader(
data class Result<T>( data class Result<T>(
val data: T, val data: T,
val resolvedUpstreamData: Upstream.UpstreamSettingsData?, val resolvedUpstreamData: List<Upstream.UpstreamSettingsData>,
) )
} }

View File

@@ -63,7 +63,7 @@ class EthereumLocalReader(
return commonRequests(key)?.switchIfEmpty { return commonRequests(key)?.switchIfEmpty {
// we need to explicitly return null to prevent executeOnRemote // we need to explicitly return null to prevent executeOnRemote
// for example // for example
Mono.just(ChainResponse(nullValue, null, null)) Mono.just(ChainResponse(nullValue, null, emptyList()))
} ?: Mono.empty() } ?: Mono.empty()
} }
@@ -244,7 +244,7 @@ class EthereumLocalReader(
} }
return logsOracle.estimate(limit?.toLong(), fromBlock, toBlock, address, topics) return logsOracle.estimate(limit?.toLong(), fromBlock, toBlock, address, topics)
.map { ChainResponse(it.toByteArray(), null, null) } .map { ChainResponse(it.toByteArray(), null, emptyList()) }
} }
private fun parseBlockRef(blockRef: String?): Long { private fun parseBlockRef(blockRef: String?): Long {

View File

@@ -378,7 +378,7 @@ open class WsConnectionImpl(
RpcResponseError.CODE_INTERNAL_ERROR, RpcResponseError.CODE_INTERNAL_ERROR,
"Response not received from WebSocket", "Response not received from WebSocket",
), ),
null, emptyList(),
false, false,
) )

View File

@@ -127,7 +127,16 @@ class JsonRpcGrpcClient(
} else { } else {
null null
} }
Mono.just(ChainResponse(bytes, null, ChainResponse.NumberId(0), null, signature, Upstream.UpstreamSettingsData(0, resp.upstreamId, resp.upstreamNodeVersion))) Mono.just(
ChainResponse(
bytes,
null,
ChainResponse.NumberId(0),
null,
signature,
listOf(Upstream.UpstreamSettingsData(0, resp.upstreamId, resp.upstreamNodeVersion)),
),
)
} else { } else {
metrics?.fails?.increment() metrics?.fails?.increment()
Mono.error( Mono.error(

View File

@@ -62,7 +62,7 @@ class BaseHandlerSpec extends Specification {
def call = new ProxyCall(ProxyCall.RpcType.SINGLE) def call = new ProxyCall(ProxyCall.RpcType.SINGLE)
call.items.add(request) call.items.add(request)
call.ids[0] = 5 call.ids[0] = 5
def response = new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, null, null, null) def response = new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, List.of(), null, null)
when: when:
def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, false)) def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, false))
.collectList() .collectList()
@@ -85,7 +85,7 @@ class BaseHandlerSpec extends Specification {
def call = new ProxyCall(ProxyCall.RpcType.BATCH) def call = new ProxyCall(ProxyCall.RpcType.BATCH)
call.items.add(request) call.items.add(request)
call.ids[0] = 5 call.ids[0] = 5
def response = new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, null, null, null) def response = new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, List.of(), null, null)
when: when:
def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, false)) def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, false))
.collectList() .collectList()
@@ -116,8 +116,8 @@ class BaseHandlerSpec extends Specification {
call.items.add(request2) call.items.add(request2)
call.ids[1] = 6 call.ids[1] = 6
def response = [ def response = [
new NativeCall.CallResult(1, null, '{"foo": 2}'.bytes, null, null, null, null, null), new NativeCall.CallResult(1, null, '{"foo": 2}'.bytes, null, null, List.of(), null, null),
new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, null, null, null) new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, List.of(), null, null)
] ]
when: when:
def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, true)) def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, true))
@@ -149,8 +149,8 @@ class BaseHandlerSpec extends Specification {
call.items.add(request2) call.items.add(request2)
call.ids[1] = 6 call.ids[1] = 6
def response = [ def response = [
new NativeCall.CallResult(1, null, '{"foo": 2}'.bytes, null, null, null, null, null), new NativeCall.CallResult(1, null, '{"foo": 2}'.bytes, null, null, List.of(), null, null),
new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, null, null, null) new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, List.of(), null, null)
] ]
when: when:
def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, true)) def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, true))
@@ -189,8 +189,8 @@ class BaseHandlerSpec extends Specification {
// note there is only 2 responses // note there is only 2 responses
def response = [ def response = [
new NativeCall.CallResult(1, null, '{"foo": 2}'.bytes, null, null, null, null, null), new NativeCall.CallResult(1, null, '{"foo": 2}'.bytes, null, null, List.of(), null, null),
new NativeCall.CallResult(2, null, '{"foo": 3}'.bytes, null, null, null, null, null) new NativeCall.CallResult(2, null, '{"foo": 3}'.bytes, null, null, List.of(), null, null)
] ]
when: when:
def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, true)) def act = Flux.from(handler.execute(Chain.ETHEREUM__MAINNET, call, requestHandler, true))

View File

@@ -42,7 +42,7 @@ class HttpHandlerSpec extends Specification {
.setMethod("test_test") .setMethod("test_test")
.setPayload(ByteString.copyFromUtf8("[]")) .setPayload(ByteString.copyFromUtf8("[]"))
.build() .build()
def respItem = new NativeCall.CallResult(1, null, "100".bytes, null, null, null, null, null) def respItem = new NativeCall.CallResult(1, null, "100".bytes, null, null, List.of(), null, null)
def req = BlockchainOuterClass.NativeCallRequest.newBuilder() def req = BlockchainOuterClass.NativeCallRequest.newBuilder()
.setChain(Common.ChainRef.CHAIN_ETHEREUM__MAINNET) .setChain(Common.ChainRef.CHAIN_ETHEREUM__MAINNET)
.addItems(reqItem) .addItems(reqItem)
@@ -128,7 +128,7 @@ class HttpHandlerSpec extends Specification {
def act = handler.execute(Chain.ETHEREUM__MAINNET, call, new AccessHandlerHttp.NoOpHandler(), false) def act = handler.execute(Chain.ETHEREUM__MAINNET, call, new AccessHandlerHttp.NoOpHandler(), false)
then: then:
1 * nativeCall.nativeCallResult(_) >> Flux.just(new NativeCall.CallResult(1, null, "".bytes, null, null, null, null, null)) 1 * nativeCall.nativeCallResult(_) >> Flux.just(new NativeCall.CallResult(1, null, "".bytes, null, null, List.of(), null, null))
StepVerifier.create(act) StepVerifier.create(act)
.expectNext("hello") .expectNext("hello")
.expectComplete() .expectComplete()

View File

@@ -86,7 +86,7 @@ class WebsocketHandlerSpec extends Specification {
def "Respond to a single call"() { def "Respond to a single call"() {
setup: setup:
def response = new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, new Upstream.UpstreamSettingsData("test"), null, null) def response = new NativeCall.CallResult(0, null, '{"foo": 1}'.bytes, null, null, List.of(new Upstream.UpstreamSettingsData("test")), null, null)
def nativeCall = Mock(NativeCall) { def nativeCall = Mock(NativeCall) {
1 * it.nativeCallResult(_) >> Flux.fromIterable([response]) 1 * it.nativeCallResult(_) >> Flux.fromIterable([response])

View File

@@ -85,7 +85,7 @@ class WriteRpcJsonSpec extends Specification {
def call = new ProxyCall(ProxyCall.RpcType.SINGLE) def call = new ProxyCall(ProxyCall.RpcType.SINGLE)
call.ids[1] = 105 call.ids[1] = 105
def data = [ def data = [
new NativeCall.CallResult(1, null, '"0x98dbb1"'.bytes, null, null, null, null, null) new NativeCall.CallResult(1, null, '"0x98dbb1"'.bytes, null, null, List.of(), null, null)
] ]
when: when:
def act = writer.toJson(call, data[0]) def act = writer.toJson(call, data[0])
@@ -98,7 +98,7 @@ class WriteRpcJsonSpec extends Specification {
def call = new ProxyCall(ProxyCall.RpcType.SINGLE) def call = new ProxyCall(ProxyCall.RpcType.SINGLE)
call.ids[1] = 1 call.ids[1] = 1
def data = [ def data = [
new NativeCall.CallResult(1, null, null, new NativeCall.CallError(1, "Internal Error", null, null, null), null, null, null, null) new NativeCall.CallResult(1, null, null, new NativeCall.CallError(1, "Internal Error", null, null, List.of()), null, List.of(), null, null)
] ]
when: when:
def act = writer.toJson(call, data[0]) def act = writer.toJson(call, data[0])
@@ -111,7 +111,7 @@ class WriteRpcJsonSpec extends Specification {
def call = new ProxyCall(ProxyCall.RpcType.SINGLE) def call = new ProxyCall(ProxyCall.RpcType.SINGLE)
call.ids[1] = "aaa" call.ids[1] = "aaa"
def data = [ def data = [
new NativeCall.CallResult(1, null, '"0x98dbb1"'.bytes, null, null, null, null, null) new NativeCall.CallResult(1, null, '"0x98dbb1"'.bytes, null, null, List.of(), null, null)
] ]
when: when:
def act = writer.toJson(call, data[0]) def act = writer.toJson(call, data[0])
@@ -126,9 +126,9 @@ class WriteRpcJsonSpec extends Specification {
call.ids[2] = 11 call.ids[2] = 11
call.ids[3] = 15 call.ids[3] = 15
def data = [ def data = [
new NativeCall.CallResult(1, null, '"0x98dbb1"'.bytes, null, null, null, null, null), new NativeCall.CallResult(1, null, '"0x98dbb1"'.bytes, null, null, List.of(), null, null),
new NativeCall.CallResult(2, null, null, new NativeCall.CallError(2, "oops", null, null, null), null, null, null, null), new NativeCall.CallResult(2, null, null, new NativeCall.CallError(2, "oops", null, null, List.of()), null, List.of(), null, null),
new NativeCall.CallResult(3, null, '{"hash": "0x2484f459dc"}'.bytes, null, null, null, null, null), new NativeCall.CallResult(3, null, '{"hash": "0x2484f459dc"}'.bytes, null, null, List.of(), null, null),
] ]
when: when:
def act = Flux.fromIterable(data) def act = Flux.fromIterable(data)
@@ -154,7 +154,7 @@ class WriteRpcJsonSpec extends Specification {
def call = new ProxyCall(ProxyCall.RpcType.SINGLE) def call = new ProxyCall(ProxyCall.RpcType.SINGLE)
call.ids[1] = 10 call.ids[1] = 10
def data = [ def data = [
new NativeCall.CallResult(1, null, '"0x1"'.bytes, null, null, null, null, null), new NativeCall.CallResult(1, null, '"0x1"'.bytes, null, null, List.of(), null, null),
] ]
when: when:
def act = Flux.fromIterable(data) def act = Flux.fromIterable(data)

View File

@@ -182,7 +182,7 @@ class BroadcastReaderSpec extends Specification {
when: when:
def act = reader def act = reader
.read(new ChainRequest("eth_sendRawTransaction", new ListParams(["0x1"]))) .read(new ChainRequest("eth_sendRawTransaction", new ListParams(["0x1"])))
.switchIfEmpty(Mono.just(new RequestReader.Result(new byte[0], null, 0, null, null))) .switchIfEmpty(Mono.just(new RequestReader.Result(new byte[0], null, 0, List.of(), null)))
then: then:
StepVerifier.create(act) StepVerifier.create(act)
.expectErrorMessage("Unhandled Upstream error") .expectErrorMessage("Unhandled Upstream error")

View File

@@ -123,7 +123,7 @@ class NativeCallSpec extends Specification {
def nativeCall = nativeCall() def nativeCall = nativeCall()
nativeCall.requestReaderFactory = Mock(RequestReaderFactory) { nativeCall.requestReaderFactory = Mock(RequestReaderFactory) {
1 * create(_) >> Mock(RequestReader) { 1 * create(_) >> Mock(RequestReader) {
1 * read(_) >> Mono.just(new RequestReader.Result("\"foo\"".bytes, null, 1, new Upstream.UpstreamSettingsData((byte)1, "test", "v"), null)) 1 * read(_) >> Mono.just(new RequestReader.Result("\"foo\"".bytes, null, 1, List.of(new Upstream.UpstreamSettingsData((byte)1, "test", "v")), null))
} }
} }
def call = new NativeCall.ValidCallContext(1, 10, TestingCommons.multistream(TestingCommons.api()), new Selector.UpstreamFilter(Selector.empty), quorum, def call = new NativeCall.ValidCallContext(1, 10, TestingCommons.multistream(TestingCommons.api()), new Selector.UpstreamFilter(Selector.empty), quorum,
@@ -170,7 +170,7 @@ class NativeCallSpec extends Specification {
nativeCall.requestReaderFactory = Mock(RequestReaderFactory) { nativeCall.requestReaderFactory = Mock(RequestReaderFactory) {
1 * create(_) >> Mock(RequestReader) { 1 * create(_) >> Mock(RequestReader) {
1 * read(new ChainRequest("eth_test", new ListParams(), 10)) >> Mono.error( 1 * read(new ChainRequest("eth_test", new ListParams(), 10)) >> Mono.error(
new ChainException(ChainResponse.Id.from(12), new ChainCallError(-32123, "Foo Bar", "Foo Bar Baz"), null, true, null) new ChainException(ChainResponse.Id.from(12), new ChainCallError(-32123, "Foo Bar", "Foo Bar Baz"), List.of(), true, null)
) )
} }
} }
@@ -231,7 +231,7 @@ class NativeCallSpec extends Specification {
when: when:
def resp = nativeCall.buildResponse( def resp = nativeCall.buildResponse(
new NativeCall.CallResult(1561, 10, objectMapper.writeValueAsBytes(json), null, null, null, null, null) new NativeCall.CallResult(1561, 10, objectMapper.writeValueAsBytes(json), null, null, List.of(), null, null)
) )
then: then:
resp.id == 1561 resp.id == 1561
@@ -246,7 +246,7 @@ class NativeCallSpec extends Specification {
when: when:
def resp = nativeCall.buildResponse( def resp = nativeCall.buildResponse(
new NativeCall.CallResult(1561, 10, objectMapper.writeValueAsBytes(json), null, new ResponseSigner.Signature("sig1".bytes, "test", 100), new Upstream.UpstreamSettingsData("test"), null, null) new NativeCall.CallResult(1561, 10, objectMapper.writeValueAsBytes(json), null, new ResponseSigner.Signature("sig1".bytes, "test", 100), List.of(new Upstream.UpstreamSettingsData("test")), null, null)
) )
then: then:
resp.id == 1561 resp.id == 1561
@@ -609,7 +609,7 @@ class NativeCallSpec extends Specification {
def nativeCall = nativeCall(multistreamHolder) def nativeCall = nativeCall(multistreamHolder)
nativeCall.requestReaderFactory = Mock(RequestReaderFactory) { nativeCall.requestReaderFactory = Mock(RequestReaderFactory) {
1 * create(_) >> Mock(RequestReader) { 1 * create(_) >> Mock(RequestReader) {
1 * read(_) >> Mono.just(new RequestReader.Result("\"0xab\"".bytes, null, 1, new Upstream.UpstreamSettingsData((byte) 255, "", ""), null)) 1 * read(_) >> Mono.just(new RequestReader.Result("\"0xab\"".bytes, null, 1, List.of(new Upstream.UpstreamSettingsData((byte) 255, "", "")), null))
} }
} }
def call = new NativeCall.ValidCallContext(1, 10, multistream, new Selector.UpstreamFilter(Selector.empty), quorum, def call = new NativeCall.ValidCallContext(1, 10, multistream, new Selector.UpstreamFilter(Selector.empty), quorum,
@@ -642,7 +642,7 @@ class NativeCallSpec extends Specification {
def nativeCall = nativeCall(multistreamHolder) def nativeCall = nativeCall(multistreamHolder)
nativeCall.requestReaderFactory = Mock(RequestReaderFactory) { nativeCall.requestReaderFactory = Mock(RequestReaderFactory) {
1 * create(_) >> Mock(RequestReader) { 1 * create(_) >> Mock(RequestReader) {
1 * read(_) >> Mono.just(new RequestReader.Result("\"0xab\"".bytes, null, 1, new Upstream.UpstreamSettingsData((byte) 1, "", ""), null)) 1 * read(_) >> Mono.just(new RequestReader.Result("\"0xab\"".bytes, null, 1, List.of(new Upstream.UpstreamSettingsData((byte) 1, "", "")), null))
} }
} }
def call = new NativeCall.ValidCallContext(1, 10, multistream, new Selector.UpstreamFilter(Selector.empty), quorum, def call = new NativeCall.ValidCallContext(1, 10, multistream, new Selector.UpstreamFilter(Selector.empty), quorum,

View File

@@ -108,7 +108,7 @@ class ApiReaderMock implements Reader<ChainRequest, ChainResponse> {
} }
error = new ChainCallError(-32601, "Method ${request.method} with ${request.params} is not mocked") error = new ChainCallError(-32601, "Method ${request.method} with ${request.params} is not mocked")
} }
return new ChainResponse(result, error, ChainResponse.Id.from(request.id), null, null, null, null) return new ChainResponse(result, error, ChainResponse.Id.from(request.id), null, null, List.of(), null)
} as Callable<ChainResponse> } as Callable<ChainResponse>
return Mono.fromCallable(call) return Mono.fromCallable(call)
} }

View File

@@ -33,7 +33,7 @@ class EthereumDirectReaderSpec extends Specification {
String hash1 = "0x40d15edaff9acdabd2a1c96fd5f683b3300aad34e7015f34def3c56ba8a7ffb5" String hash1 = "0x40d15edaff9acdabd2a1c96fd5f683b3300aad34e7015f34def3c56ba8a7ffb5"
String address1 = "0xe0aadb0a012dbcdc529c4c743d3e0385a0b54d3d" String address1 = "0xe0aadb0a012dbcdc529c4c743d3e0385a0b54d3d"
Upstream.UpstreamSettingsData data = new Upstream.UpstreamSettingsData("test") List<Upstream.UpstreamSettingsData> data = List.of(new Upstream.UpstreamSettingsData("test"))
def "Reads block by finalization"() { def "Reads block by finalization"() {
setup: setup:
def json = new BlockJson().tap { def json = new BlockJson().tap {

View File

@@ -73,7 +73,7 @@ class EthereumLocalReaderSpec extends Specification {
_ * txByHashAsCont() >> new EmptyReader<>() _ * txByHashAsCont() >> new EmptyReader<>()
1 * blocksByHeightAsCont() >> Mock(Reader) { 1 * blocksByHeightAsCont() >> Mock(Reader) {
1 * read(101L) >> Mono.just( 1 * read(101L) >> Mono.just(
new EthereumDirectReader.Result<>(TestingCommons.blockForEthereum(101L), null) new EthereumDirectReader.Result<>(TestingCommons.blockForEthereum(101L), List.of())
) )
} }
} }
@@ -101,7 +101,7 @@ class EthereumLocalReaderSpec extends Specification {
_ * txByHashAsCont() >> new EmptyReader<>() _ * txByHashAsCont() >> new EmptyReader<>()
1 * blocksByHeightAsCont() >> Mock(Reader) { 1 * blocksByHeightAsCont() >> Mock(Reader) {
1 * read(0L) >> Mono.just( 1 * read(0L) >> Mono.just(
new EthereumDirectReader.Result<>(TestingCommons.blockForEthereum(0L), null) new EthereumDirectReader.Result<>(TestingCommons.blockForEthereum(0L), List.of())
) )
} }
} }
@@ -129,7 +129,7 @@ class EthereumLocalReaderSpec extends Specification {
_ * txByHashAsCont() >> new EmptyReader<>() _ * txByHashAsCont() >> new EmptyReader<>()
1 * blocksByHeightAsCont() >> Mock(Reader) { 1 * blocksByHeightAsCont() >> Mock(Reader) {
1 * read(74735L) >> Mono.just( 1 * read(74735L) >> Mono.just(
new EthereumDirectReader.Result<>(TestingCommons.blockForEthereum(74735L), null) new EthereumDirectReader.Result<>(TestingCommons.blockForEthereum(74735L), List.of())
) )
} }
} }
@@ -155,7 +155,7 @@ class EthereumLocalReaderSpec extends Specification {
def reader = Mock(EthereumCachingReader) { def reader = Mock(EthereumCachingReader) {
1 * blockByFinalization() >> Mock(Reader) { 1 * blockByFinalization() >> Mock(Reader) {
1 * read(FinalizationType.SAFE_BLOCK) >> Mono.just( 1 * read(FinalizationType.SAFE_BLOCK) >> Mono.just(
new EthereumDirectReader.Result<>(TestingCommons.blockForEthereum(74735L), null) new EthereumDirectReader.Result<>(TestingCommons.blockForEthereum(74735L), List.of())
) )
} }
} }

View File

@@ -17,7 +17,6 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe
import io.emeraldpay.dshackle.Chain import io.emeraldpay.dshackle.Chain
import io.emeraldpay.dshackle.data.BlockId import io.emeraldpay.dshackle.data.BlockId
import io.emeraldpay.dshackle.data.TxId
import io.emeraldpay.dshackle.reader.Reader import io.emeraldpay.dshackle.reader.Reader
import io.emeraldpay.dshackle.upstream.ethereum.EthereumDirectReader import io.emeraldpay.dshackle.upstream.ethereum.EthereumDirectReader
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
@@ -47,7 +46,7 @@ class ProduceLogsSpec extends Specification {
setup: setup:
def logs = Mock(Reader) { def logs = Mock(Reader) {
1 * it.read(BlockId.from("0x668b92d6b8c7db1350fd527fec4885ce5be2159b2b7daf6b126babdcbaa349da")) >> 1 * it.read(BlockId.from("0x668b92d6b8c7db1350fd527fec4885ce5be2159b2b7daf6b126babdcbaa349da")) >>
Mono.just(new EthereumDirectReader.Result<>([], null)) Mono.just(new EthereumDirectReader.Result<>([], List.of()))
} }
def producer = new ProduceLogs(logs, Chain.ETHEREUM__MAINNET) def producer = new ProduceLogs(logs, Chain.ETHEREUM__MAINNET)
def update = new ConnectBlockUpdates.Update( def update = new ConnectBlockUpdates.Update(
@@ -69,7 +68,7 @@ class ProduceLogsSpec extends Specification {
def logs = Mock(Reader) { def logs = Mock(Reader) {
1 * it.read(BlockId.from("0x668b92d6b8c7db1350fd527fec4885ce5be2159b2b7daf6b126babdcbaa349da")) >> 1 * it.read(BlockId.from("0x668b92d6b8c7db1350fd527fec4885ce5be2159b2b7daf6b126babdcbaa349da")) >>
Mono.just(new EthereumDirectReader.Result<>(logs, null)) Mono.just(new EthereumDirectReader.Result<>(logs, List.of()))
} }
def producer = new ProduceLogs(logs, Chain.ETHEREUM__MAINNET) def producer = new ProduceLogs(logs, Chain.ETHEREUM__MAINNET)
def update = new ConnectBlockUpdates.Update( def update = new ConnectBlockUpdates.Update(
@@ -92,7 +91,7 @@ class ProduceLogsSpec extends Specification {
setup: setup:
def logs = Mock(Reader) { def logs = Mock(Reader) {
1 * it.read(BlockId.from("0x668b92d6b8c7db1350fd527fec4885ce5be2159b2b7daf6b126babdcbaa349da")) >> 1 * it.read(BlockId.from("0x668b92d6b8c7db1350fd527fec4885ce5be2159b2b7daf6b126babdcbaa349da")) >>
Mono.just(new EthereumDirectReader.Result<>(logs, null)) Mono.just(new EthereumDirectReader.Result<>(logs, List.of()))
} }
def producer = new ProduceLogs(logs, Chain.ETHEREUM__MAINNET) def producer = new ProduceLogs(logs, Chain.ETHEREUM__MAINNET)
def update1 = new ConnectBlockUpdates.Update( def update1 = new ConnectBlockUpdates.Update(

View File

@@ -65,7 +65,7 @@ class JsonRpcResponseSpec extends Specification {
def "Serialize int id and null result"() { def "Serialize int id and null result"() {
setup: setup:
def json = new ChainResponse("null".bytes, null, new ChainResponse.NumberId(1), null, null, null) def json = new ChainResponse("null".bytes, null, new ChainResponse.NumberId(1), null, null, List.of())
when: when:
def act = objectMapper.writeValueAsString(json) def act = objectMapper.writeValueAsString(json)
then: then:
@@ -74,7 +74,7 @@ class JsonRpcResponseSpec extends Specification {
def "Serialize int id and string result"() { def "Serialize int id and string result"() {
setup: setup:
def json = new ChainResponse('"Hello World"'.bytes, null, new ChainResponse.NumberId(10), null, null, null) def json = new ChainResponse('"Hello World"'.bytes, null, new ChainResponse.NumberId(10), null, null, List.of())
when: when:
def act = objectMapper.writeValueAsString(json) def act = objectMapper.writeValueAsString(json)
then: then:
@@ -83,7 +83,7 @@ class JsonRpcResponseSpec extends Specification {
def "Serialize int id and object result"() { def "Serialize int id and object result"() {
setup: setup:
def json = new ChainResponse('{"foo": "Hello World", "bar": 1}'.bytes, null, new ChainResponse.NumberId(101), null, null, null) def json = new ChainResponse('{"foo": "Hello World", "bar": 1}'.bytes, null, new ChainResponse.NumberId(101), null, null, List.of())
when: when:
def act = objectMapper.writeValueAsString(json) def act = objectMapper.writeValueAsString(json)
then: then:
@@ -92,7 +92,7 @@ class JsonRpcResponseSpec extends Specification {
def "Serialize int id and error"() { def "Serialize int id and error"() {
setup: setup:
def json = new ChainResponse(null, new ChainCallError(-32041, "Oooops"), new ChainResponse.NumberId(101), null, null, null) def json = new ChainResponse(null, new ChainCallError(-32041, "Oooops"), new ChainResponse.NumberId(101), null, null, List.of())
when: when:
def act = objectMapper.writeValueAsString(json) def act = objectMapper.writeValueAsString(json)
then: then:
@@ -101,7 +101,7 @@ class JsonRpcResponseSpec extends Specification {
def "Serialize string id and null result"() { def "Serialize string id and null result"() {
setup: setup:
def json = new ChainResponse("null".bytes, null, new ChainResponse.StringId("asf01t1gg"), null, null, null) def json = new ChainResponse("null".bytes, null, new ChainResponse.StringId("asf01t1gg"), null, null, List.of())
when: when:
def act = objectMapper.writeValueAsString(json) def act = objectMapper.writeValueAsString(json)
then: then:
@@ -110,7 +110,7 @@ class JsonRpcResponseSpec extends Specification {
def "Serialize string id and string result"() { def "Serialize string id and string result"() {
setup: setup:
def json = new ChainResponse('"Hello World"'.bytes, null, new ChainResponse.StringId("10"), null, null, null) def json = new ChainResponse('"Hello World"'.bytes, null, new ChainResponse.StringId("10"), null, null, List.of())
when: when:
def act = objectMapper.writeValueAsString(json) def act = objectMapper.writeValueAsString(json)
then: then:
@@ -119,7 +119,7 @@ class JsonRpcResponseSpec extends Specification {
def "Serialize string id and object result"() { def "Serialize string id and object result"() {
setup: setup:
def json = new ChainResponse('{"foo": "Hello World", "bar": 1}'.bytes, null, new ChainResponse.StringId("g8gk19g"), null, null, null) def json = new ChainResponse('{"foo": "Hello World", "bar": 1}'.bytes, null, new ChainResponse.StringId("g8gk19g"), null, null, List.of())
when: when:
def act = objectMapper.writeValueAsString(json) def act = objectMapper.writeValueAsString(json)
then: then:
@@ -130,7 +130,7 @@ class JsonRpcResponseSpec extends Specification {
setup: setup:
def json = new ChainResponse(null, def json = new ChainResponse(null,
new ChainCallError(-32041, "Oooops"), new ChainCallError(-32041, "Oooops"),
new ChainResponse.StringId("9kbo29gkaasf"), null, null, null ) new ChainResponse.StringId("9kbo29gkaasf"), null, null, List.of())
when: when:
def act = objectMapper.writeValueAsString(json) def act = objectMapper.writeValueAsString(json)
then: then:

View File

@@ -33,7 +33,7 @@ class NativeCallTest {
), ),
) { ) {
on { nativeCallResult(request) } doReturn Flux.just( on { nativeCallResult(request) } doReturn Flux.just(
NativeCall.CallResult.ok(1, null, "0x1".toByteArray(), null, Upstream.UpstreamSettingsData("id"), null), NativeCall.CallResult.ok(1, null, "0x1".toByteArray(), null, listOf(Upstream.UpstreamSettingsData("id")), null),
) )
} }
@@ -63,7 +63,7 @@ class NativeCallTest {
), ),
) { ) {
on { nativeCallResult(request) } doReturn Flux.just( on { nativeCallResult(request) } doReturn Flux.just(
NativeCall.CallResult(1, null, null, NativeCall.CallError(50001, "message", null, null, Upstream.UpstreamSettingsData("upId")), null, null), NativeCall.CallResult(1, null, null, NativeCall.CallError(50001, "message", null, null, listOf(Upstream.UpstreamSettingsData("upId"))), null, null),
) )
} }
@@ -99,7 +99,7 @@ class NativeCallTest {
), ),
) { ) {
on { nativeCallResult(request) } doReturn Flux.just( on { nativeCallResult(request) } doReturn Flux.just(
NativeCall.CallResult.ok(1, null, "".toByteArray(), null, Upstream.UpstreamSettingsData("upId"), null, chunks), NativeCall.CallResult.ok(1, null, "".toByteArray(), null, listOf(Upstream.UpstreamSettingsData("upId")), null, chunks),
) )
} }