diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt index 47efb4be..1685eba3 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt @@ -51,20 +51,31 @@ class AccessHandler( } } + private fun process( + call: ServerCall, + headers: Metadata, + next: ServerCallHandler, + builder: EventsBuilder.RequestReply + ): ServerCall.Listener { + builder.start(headers, call.attributes) + val callWrapper: ServerCall = StdCallResponse( + call, builder, accessLogWriter + ) + return StdCallListener( + next.startCall(callWrapper, headers), + builder + ) + } + @Suppress("UNCHECKED_CAST") private fun processSubscribeHead( call: ServerCall, headers: Metadata, next: ServerCallHandler ): ServerCall.Listener { - val builder = EventsBuilder.SubscribeHead() - .start(headers, call.attributes) - val callWrapper: ServerCall = OnSubscribeHeadResponse( - call as ServerCall, builder, accessLogWriter) as ServerCall - return OnSubscribeHead( - next.startCall(callWrapper, headers) as ServerCall.Listener, - builder - ) as ServerCall.Listener + return process(call, headers, next, + EventsBuilder.SubscribeHead() as EventsBuilder.RequestReply<*, ReqT, RespT> + ) } @Suppress("UNCHECKED_CAST") @@ -74,14 +85,9 @@ class AccessHandler( next: ServerCallHandler, subscribe: Boolean ): ServerCall.Listener { - val builder = EventsBuilder.SubscribeBalance(subscribe) - .start(headers, call.attributes) - val callWrapper: ServerCall = OnSubscribeBalanceResponse( - call as ServerCall, builder, accessLogWriter) as ServerCall - return OnSubscribeBalance( - next.startCall(callWrapper, headers) as ServerCall.Listener, - builder - ) as ServerCall.Listener + return process(call, headers, next, + EventsBuilder.SubscribeBalance(subscribe) as EventsBuilder.RequestReply<*, ReqT, RespT> + ) } @Suppress("UNCHECKED_CAST") @@ -90,14 +96,9 @@ class AccessHandler( headers: Metadata, next: ServerCallHandler ): ServerCall.Listener { - val builder = EventsBuilder.TxStatus() - .start(headers, call.attributes) - val callWrapper: ServerCall = OnTxStatusResponse( - call as ServerCall, builder, accessLogWriter) as ServerCall - return OnSubscribeTxStatus( - next.startCall(callWrapper, headers) as ServerCall.Listener, - builder - ) as ServerCall.Listener + return process(call, headers, next, + EventsBuilder.TxStatus() as EventsBuilder.RequestReply<*, ReqT, RespT> + ) } @Suppress("UNCHECKED_CAST") @@ -106,18 +107,9 @@ class AccessHandler( headers: Metadata, next: ServerCallHandler ): ServerCall.Listener { - val builder = EventsBuilder.NativeCall() - .start(headers, call.attributes) - - val callWrapper: ServerCall = OnNativeCallResponse( - call as ServerCall, - builder, - accessLogWriter - ) as ServerCall - return OnNativeCall( - next.startCall(callWrapper, headers) as ServerCall.Listener, - builder - ) as ServerCall.Listener + return process(call, headers, next, + EventsBuilder.NativeCall() as EventsBuilder.RequestReply<*, ReqT, RespT> + ) } @Suppress("UNCHECKED_CAST") @@ -126,17 +118,9 @@ class AccessHandler( headers: Metadata, next: ServerCallHandler ): ServerCall.Listener { - val builder = EventsBuilder.Describe() - .start(headers, call.attributes) - - val callWrapper: ServerCall = OnDescribeResponse( - call as ServerCall, - builder, - accessLogWriter - ) as ServerCall - return OnDescribeRequest( - next.startCall(callWrapper, headers) as ServerCall.Listener, - builder) as ServerCall.Listener + return process(call, headers, next, + EventsBuilder.Describe() as EventsBuilder.RequestReply<*, ReqT, RespT> + ) } @Suppress("UNCHECKED_CAST") @@ -145,115 +129,32 @@ class AccessHandler( headers: Metadata, next: ServerCallHandler ): ServerCall.Listener { - val builder = EventsBuilder.Status() - .start(headers, call.attributes) - - val callWrapper: ServerCall = OnStatusResponse( - call as ServerCall, - builder, - accessLogWriter - ) as ServerCall - return OnStatusRequest( - next.startCall(callWrapper, headers) as ServerCall.Listener, - builder) as ServerCall.Listener + return process(call, headers, next, + EventsBuilder.Status() as EventsBuilder.RequestReply<*, ReqT, RespT> + ) } - class OnSubscribeHead( - val next: ServerCall.Listener, - val builder: EventsBuilder.SubscribeHead - ) : ForwardingServerCallListener() { + open class StdCallListener>( + val next: ServerCall.Listener, + val builder: EB + ) : ForwardingServerCallListener() { - override fun onMessage(message: Common.Chain) { - val chainId = message.type.number - builder.withChain(chainId) + override fun onMessage(message: Req) { + builder.onRequest(message) super.onMessage(message) } - override fun delegate(): ServerCall.Listener { + override fun delegate(): ServerCall.Listener { return next } } - class OnSubscribeBalance( - val next: ServerCall.Listener, - val builder: EventsBuilder.SubscribeBalance - ) : ForwardingServerCallListener() { - - override fun onMessage(message: BlockchainOuterClass.BalanceRequest) { - builder.withRequest(message) - super.onMessage(message) - } - - override fun delegate(): ServerCall.Listener { - return next - } - } - - class OnSubscribeTxStatus( - val next: ServerCall.Listener, - val builder: EventsBuilder.TxStatus - ) : ForwardingServerCallListener() { - - override fun onMessage(message: BlockchainOuterClass.TxStatusRequest) { - builder.withRequest(message) - super.onMessage(message) - } - - override fun delegate(): ServerCall.Listener { - return next - } - } - - class OnNativeCall( - val next: ServerCall.Listener, - val builder: EventsBuilder.NativeCall - ) : ForwardingServerCallListener() { - - override fun onMessage(message: BlockchainOuterClass.NativeCallRequest) { - val chain = message.chain - builder.withChain(chain.number) - message.itemsList.forEach { item -> - builder.onRequest(item) - } - super.onMessage(message) - } - - override fun delegate(): ServerCall.Listener { - return next - } - } - - class OnDescribeRequest( - val next: ServerCall.Listener, - val builder: EventsBuilder.Describe - ) : ForwardingServerCallListener() { - - override fun onMessage(message: BlockchainOuterClass.DescribeRequest) { - super.onMessage(message) - } - - override fun delegate(): ServerCall.Listener { - return next - } - } - - class OnStatusRequest( - val next: ServerCall.Listener, - val builder: EventsBuilder.Status - ) : ForwardingServerCallListener() { - - override fun onMessage(message: BlockchainOuterClass.StatusRequest) { - super.onMessage(message) - } - - override fun delegate(): ServerCall.Listener { - return next - } - } - - abstract class BaseCallResponse( - val next: ServerCall + open class StdCallResponse>( + val next: ServerCall, + val builder: EB, + val accessLogWriter: AccessLogWriter ) : ForwardingServerCall() { + override fun getMethodDescriptor(): MethodDescriptor { return next.methodDescriptor } @@ -264,85 +165,10 @@ class AccessHandler( override fun sendMessage(message: RespT) { super.sendMessage(message) - } - } - - class OnNativeCallResponse( - next: ServerCall, - val builder: EventsBuilder.NativeCall, - val accessLogWriter: AccessLogWriter - ) : BaseCallResponse(next) { - - override fun sendMessage(message: BlockchainOuterClass.NativeCallReplyItem) { accessLogWriter.submit( - builder.onReply(message) + builder.onReply(message)!! ) - super.sendMessage(message) } } - class OnSubscribeHeadResponse( - next: ServerCall, - val builder: EventsBuilder.SubscribeHead, - val accessLogWriter: AccessLogWriter - ) : BaseCallResponse(next) { - - override fun sendMessage(message: BlockchainOuterClass.ChainHead) { - val event = builder.onReply(message) - accessLogWriter.submit(event) - super.sendMessage(message) - } - } - - class OnSubscribeBalanceResponse( - next: ServerCall, - val builder: EventsBuilder.SubscribeBalance, - val accessLogWriter: AccessLogWriter - ) : BaseCallResponse(next) { - - override fun sendMessage(message: BlockchainOuterClass.AddressBalance) { - val event = builder.onReply(message) - accessLogWriter.submit(event) - super.sendMessage(message) - } - } - - class OnTxStatusResponse( - next: ServerCall, - val builder: EventsBuilder.TxStatus, - val accessLogWriter: AccessLogWriter - ) : BaseCallResponse(next) { - - override fun sendMessage(message: BlockchainOuterClass.TxStatus) { - val event = builder.onReply(message) - accessLogWriter.submit(event) - super.sendMessage(message) - } - } - - class OnDescribeResponse( - next: ServerCall, - val builder: EventsBuilder.Describe, - val accessLogWriter: AccessLogWriter - ) : BaseCallResponse(next) { - - override fun sendMessage(message: BlockchainOuterClass.DescribeResponse) { - val event = builder.onReply() - accessLogWriter.submit(event) - super.sendMessage(message) - } - } - - class OnStatusResponse( - next: ServerCall, - val builder: EventsBuilder.Status, - val accessLogWriter: AccessLogWriter - ) : BaseCallResponse(next) { - - override fun sendMessage(message: BlockchainOuterClass.ChainStatus) { - val event = builder.onReply(message) - accessLogWriter.submit(event) - super.sendMessage(message) - } - } } \ No newline at end of file diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt index 8428c298..e8a88fe1 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt @@ -16,6 +16,7 @@ package io.emeraldpay.dshackle.monitoring.accesslog import io.emeraldpay.api.proto.BlockchainOuterClass +import io.emeraldpay.api.proto.Common import io.emeraldpay.grpc.Chain import io.grpc.Attributes import io.grpc.Grpc @@ -33,7 +34,16 @@ class EventsBuilder { private val log = LoggerFactory.getLogger(EventsBuilder::class.java) } - abstract class Base() { + interface StartingRequest { + fun start(metadata: Metadata, attributes: Attributes) + } + + interface RequestReply : StartingRequest { + fun onRequest(msg: Req) + fun onReply(msg: Resp): E + } + + abstract class Base() : StartingRequest { companion object { private val remoteIpKeys = listOf( Metadata.Key.of("x-real-ip", Metadata.ASCII_STRING_MARSHALLER), @@ -82,9 +92,9 @@ class EventsBuilder { .trim() } - abstract protected fun getT(): T + protected abstract fun getT(): T - fun start(metadata: Metadata, attributes: Attributes): T { + override fun start(metadata: Metadata, attributes: Attributes) { val userAgent = metadata.get(Metadata.Key.of("user-agent", Metadata.ASCII_STRING_MARSHALLER)) ?.let(this@Base::clean) ?: "" @@ -108,7 +118,6 @@ class EventsBuilder { ip = ip, userAgent = userAgent )) - return getT() } fun withChain(chain: Int): T { @@ -118,21 +127,31 @@ class EventsBuilder { } } - class SubscribeHead() : Base() { + class SubscribeHead() : + Base(), + RequestReply { + private var index = 0 override fun getT(): SubscribeHead { return this } - fun onReply(resp: BlockchainOuterClass.ChainHead): Events.SubscribeHead { + override fun onRequest(msg: Common.Chain) { + withChain(msg.type.number) + } + + override fun onReply(msg: BlockchainOuterClass.ChainHead): Events.SubscribeHead { return Events.SubscribeHead( chain, UUID.randomUUID(), requestDetails, index++ ) } } - class SubscribeBalance(val subscribe: Boolean) : Base() { + class SubscribeBalance(val subscribe: Boolean) : + Base(), + RequestReply { + private var index = 0 private var balanceRequest: Events.BalanceRequest? = null @@ -140,39 +159,40 @@ class EventsBuilder { return this } - fun withRequest(req: BlockchainOuterClass.BalanceRequest): SubscribeBalance { + override fun onRequest(msg: BlockchainOuterClass.BalanceRequest) { balanceRequest = Events.BalanceRequest( - req.asset.code.toUpperCase(), - req.address.addrTypeCase.name + msg.asset.code.toUpperCase(), + msg.address.addrTypeCase.name ) - return this } - fun onReply(resp: BlockchainOuterClass.AddressBalance): Events.SubscribeBalance { + override fun onReply(msg: BlockchainOuterClass.AddressBalance): Events.SubscribeBalance { if (balanceRequest == null) { throw IllegalStateException("Request is not initialized") } - val addressBalance = Events.AddressBalance(resp.asset.code, resp.address.address) - val chain = Chain.byId(resp.asset.chain.number) + val addressBalance = Events.AddressBalance(msg.asset.code, msg.address.address) + val chain = Chain.byId(msg.asset.chain.number) return Events.SubscribeBalance( chain, UUID.randomUUID(), subscribe, requestDetails, balanceRequest!!, addressBalance, index++ ) } } - class TxStatus() : Base() { + class TxStatus() : + Base(), + RequestReply { private var index = 0 private var txStatusRequest: Events.TxStatusRequest? = null - fun withRequest(req: BlockchainOuterClass.TxStatusRequest): TxStatus { - this.txStatusRequest = Events.TxStatusRequest(req.txId) - return withChain(req.chainValue) + override fun onRequest(msg: BlockchainOuterClass.TxStatusRequest) { + this.txStatusRequest = Events.TxStatusRequest(msg.txId) + withChain(msg.chainValue) } - fun onReply(resp: BlockchainOuterClass.TxStatus): Events.TxStatus { + override fun onReply(msg: BlockchainOuterClass.TxStatus): Events.TxStatus { return Events.TxStatus( chain, UUID.randomUUID(), requestDetails, txStatusRequest!!, - Events.TxStatusResponse(resp.confirmations), + Events.TxStatusResponse(msg.confirmations), index++ ) } @@ -183,7 +203,9 @@ class EventsBuilder { } - class NativeCall : Base() { + class NativeCall : + Base(), + RequestReply { val items = ArrayList() val replies = HashMap() private var index = 0 @@ -192,24 +214,26 @@ class EventsBuilder { return this } - fun onRequest(item: BlockchainOuterClass.NativeCallItem): NativeCall { - this.items.add( - Events.NativeCallItemDetails( - item.method, - item.id, - item.payload.size().toLong() - ) - ) - return this + override fun onRequest(msg: BlockchainOuterClass.NativeCallRequest) { + withChain(msg.chain.number) + msg.itemsList.forEach { item -> + this.items.add( + Events.NativeCallItemDetails( + item.method, + item.id, + item.payload.size().toLong() + ) + ) + } } - fun onReply(reply: BlockchainOuterClass.NativeCallReplyItem): Events.NativeCall { - val item = items.find { it.id == reply.id }!! + override fun onReply(msg: BlockchainOuterClass.NativeCallReplyItem): Events.NativeCall { + val item = items.find { it.id == msg.id }!! return Events.NativeCall( request = requestDetails, total = items.size, index = index++, - succeed = reply.succeed, + succeed = msg.succeed, blockchain = chain, nativeCall = item, payloadSizeBytes = item.payloadSizeBytes, @@ -219,13 +243,18 @@ class EventsBuilder { } - class Describe : Base() { + class Describe : + Base(), + RequestReply { override fun getT(): Describe { return this } - fun onReply(): Events.Describe { + override fun onRequest(msg: BlockchainOuterClass.DescribeRequest) { + } + + override fun onReply(msg: BlockchainOuterClass.DescribeResponse): Events.Describe { return Events.Describe( id = UUID.randomUUID(), request = requestDetails @@ -233,13 +262,18 @@ class EventsBuilder { } } - class Status : Base() { + class Status : + Base(), + RequestReply { override fun getT(): Status { return this } - fun onReply(message: BlockchainOuterClass.ChainStatus): Events.Status { - val chain = Chain.byId(message.chainValue) + override fun onRequest(msg: BlockchainOuterClass.StatusRequest) { + } + + override fun onReply(msg: BlockchainOuterClass.ChainStatus): Events.Status { + val chain = Chain.byId(msg.chainValue) return Events.Status( blockchain = chain, request = requestDetails, diff --git a/src/test/groovy/io/emeraldpay/dshackle/monitoring/accesslog/EventsBaseBuilderSpec.groovy b/src/test/groovy/io/emeraldpay/dshackle/monitoring/accesslog/EventsBaseBuilderSpec.groovy index 49c1fce8..ede6ab9d 100644 --- a/src/test/groovy/io/emeraldpay/dshackle/monitoring/accesslog/EventsBaseBuilderSpec.groovy +++ b/src/test/groovy/io/emeraldpay/dshackle/monitoring/accesslog/EventsBaseBuilderSpec.groovy @@ -20,10 +20,40 @@ import io.emeraldpay.grpc.Chain import io.grpc.Attributes import io.grpc.Grpc import io.grpc.Metadata +import org.jetbrains.annotations.NotNull +import org.junit.validator.TestClassValidator import spock.lang.Specification class EventsBaseBuilderSpec extends Specification { + class TestEvent extends Events.Base { + Events.StreamRequestDetails request + + TestEvent(Events.StreamRequestDetails request) { + super(UUID.randomUUID(), "TEST") + this.request = request + } + } + + class TestEventBuilder extends EventsBuilder.Base + implements EventsBuilder.RequestReply { + + @Override + protected TestEventBuilder getT() { + return this + } + + @Override + void onRequest(BlockchainOuterClass.NativeCallRequest msg) { + + } + + @Override + TestEvent onReply(BlockchainOuterClass.NativeCallReplyItem msg) { + return new TestEvent(requestDetails) + } + } + def "Parse headers from direct local access"() { setup: def metadata = new Metadata() @@ -32,10 +62,11 @@ class EventsBaseBuilderSpec extends Specification { .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(Inet4Address.getByName("127.0.0.1"), 2448)) .build() when: - def act = new EventsBuilder.NativeCall() - .start(metadata, attributes) - .withChain(Chain.ETHEREUM.id) - .onRequest(BlockchainOuterClass.NativeCallItem.getDefaultInstance()) + def act = new TestEventBuilder() + .tap { + it.start(metadata, attributes) + it.onRequest(BlockchainOuterClass.NativeCallRequest.getDefaultInstance()) + } .onReply(BlockchainOuterClass.NativeCallReplyItem.getDefaultInstance()) then: act.request != null @@ -56,10 +87,11 @@ class EventsBaseBuilderSpec extends Specification { .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(Inet4Address.getByName("127.0.0.1"), 2448)) .build() when: - def act = new EventsBuilder.NativeCall() - .start(metadata, attributes) - .withChain(Chain.ETHEREUM.id) - .onRequest(BlockchainOuterClass.NativeCallItem.getDefaultInstance()) + def act = new TestEventBuilder() + .tap { + it.start(metadata, attributes) + it.onRequest(BlockchainOuterClass.NativeCallRequest.getDefaultInstance()) + } .onReply(BlockchainOuterClass.NativeCallReplyItem.getDefaultInstance()) then: with(act.request.remote) { @@ -77,10 +109,11 @@ class EventsBaseBuilderSpec extends Specification { .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(Inet4Address.getByName("30.56.100.15"), 2448)) .build() when: - def act = new EventsBuilder.NativeCall() - .start(metadata, attributes) - .withChain(Chain.ETHEREUM.id) - .onRequest(BlockchainOuterClass.NativeCallItem.getDefaultInstance()) + def act = new TestEventBuilder() + .tap { + it.start(metadata, attributes) + it.onRequest(BlockchainOuterClass.NativeCallRequest.getDefaultInstance()) + } .onReply(BlockchainOuterClass.NativeCallReplyItem.getDefaultInstance()) then: with(act.request.remote) { @@ -99,10 +132,11 @@ class EventsBaseBuilderSpec extends Specification { .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(Inet4Address.getByName("30.56.100.15"), 2448)) .build() when: - def act = new EventsBuilder.NativeCall() - .start(metadata, attributes) - .withChain(Chain.ETHEREUM.id) - .onRequest(BlockchainOuterClass.NativeCallItem.getDefaultInstance()) + def act = new TestEventBuilder() + .tap { + it.start(metadata, attributes) + it.onRequest(BlockchainOuterClass.NativeCallRequest.getDefaultInstance()) + } .onReply(BlockchainOuterClass.NativeCallReplyItem.getDefaultInstance()) then: with(act.request.remote) { @@ -121,10 +155,11 @@ class EventsBaseBuilderSpec extends Specification { .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(Inet4Address.getByName("30.56.100.15"), 2448)) .build() when: - def act = new EventsBuilder.NativeCall() - .start(metadata, attributes) - .withChain(Chain.ETHEREUM.id) - .onRequest(BlockchainOuterClass.NativeCallItem.getDefaultInstance()) + def act = new TestEventBuilder() + .tap { + it.start(metadata, attributes) + it.onRequest(BlockchainOuterClass.NativeCallRequest.getDefaultInstance()) + } .onReply(BlockchainOuterClass.NativeCallReplyItem.getDefaultInstance()) then: with(act.request.remote) { @@ -143,10 +178,11 @@ class EventsBaseBuilderSpec extends Specification { .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(Inet6Address.getByName("::1"), 2448)) .build() when: - def act = new EventsBuilder.NativeCall() - .start(metadata, attributes) - .withChain(Chain.ETHEREUM.id) - .onRequest(BlockchainOuterClass.NativeCallItem.getDefaultInstance()) + def act = new TestEventBuilder() + .tap { + it.start(metadata, attributes) + it.onRequest(BlockchainOuterClass.NativeCallRequest.getDefaultInstance()) + } .onReply(BlockchainOuterClass.NativeCallReplyItem.getDefaultInstance()) then: with(act.request.remote) { @@ -163,10 +199,11 @@ class EventsBaseBuilderSpec extends Specification { .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(Inet4Address.getByName("30.56.100.15"), 2448)) .build() when: - def act = new EventsBuilder.NativeCall() - .start(metadata, attributes) - .withChain(Chain.ETHEREUM.id) - .onRequest(BlockchainOuterClass.NativeCallItem.getDefaultInstance()) + def act = new TestEventBuilder() + .tap { + it.start(metadata, attributes) + it.onRequest(BlockchainOuterClass.NativeCallRequest.getDefaultInstance()) + } .onReply(BlockchainOuterClass.NativeCallReplyItem.getDefaultInstance()) then: with(act.request.remote) { @@ -183,10 +220,11 @@ class EventsBaseBuilderSpec extends Specification { .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(Inet4Address.getByName("30.56.100.15"), 2448)) .build() when: - def act = new EventsBuilder.NativeCall() - .start(metadata, attributes) - .withChain(Chain.ETHEREUM.id) - .onRequest(BlockchainOuterClass.NativeCallItem.getDefaultInstance()) + def act = new TestEventBuilder() + .tap { + it.start(metadata, attributes) + it.onRequest(BlockchainOuterClass.NativeCallRequest.getDefaultInstance()) + } .onReply(BlockchainOuterClass.NativeCallReplyItem.getDefaultInstance()) then: with(act.request.remote) { diff --git a/src/test/groovy/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilderSubscribeBalanceSpec.groovy b/src/test/groovy/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilderSubscribeBalanceSpec.groovy index eec89d59..75d78f5a 100644 --- a/src/test/groovy/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilderSubscribeBalanceSpec.groovy +++ b/src/test/groovy/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilderSubscribeBalanceSpec.groovy @@ -32,9 +32,9 @@ class EventsBuilderSubscribeBalanceSpec extends Specification { .setBalance("1234560000000000000") .build() when: - def act = new EventsBuilder.SubscribeBalance(true) - .withRequest(request) - .onReply(resp) + def act = new EventsBuilder.SubscribeBalance(true).tap { + it.onRequest(request) + }.onReply(resp) then: act.index == 0 act.blockchain == Chain.ETHEREUM @@ -69,9 +69,9 @@ class EventsBuilderSubscribeBalanceSpec extends Specification { .setBalance("12345600000000") .build() when: - def act = new EventsBuilder.SubscribeBalance(true) - .withRequest(request) - .onReply(resp) + def act = new EventsBuilder.SubscribeBalance(true).tap { + it.onRequest(request) + }.onReply(resp) then: act.index == 0 act.blockchain == Chain.BITCOIN