solution: refactoring

This commit is contained in:
Igor Artamonov
2020-02-24 22:14:24 -05:00
parent b255bed3a1
commit 2816b5b8fc
30 changed files with 158 additions and 86 deletions

View File

@@ -18,13 +18,11 @@ package io.emeraldpay.dshackle.test
import com.fasterxml.jackson.databind.ObjectMapper
import com.google.protobuf.ByteString
import io.emeraldpay.api.proto.BlockchainOuterClass
import io.emeraldpay.dshackle.upstream.DirectCallMethods
import io.emeraldpay.dshackle.upstream.calls.DirectCallMethods
import io.emeraldpay.dshackle.upstream.ethereum.DirectEthereumApi
import io.emeraldpay.grpc.Chain
import io.grpc.stub.StreamObserver
import io.infinitape.etherjar.rpc.ReactorRpcClient
import io.infinitape.etherjar.rpc.RpcClient
import io.infinitape.etherjar.rpc.RpcException
import io.infinitape.etherjar.rpc.RpcResponseError
import io.infinitape.etherjar.rpc.json.ResponseJson
import org.jetbrains.annotations.NotNull

View File

@@ -16,7 +16,7 @@
package io.emeraldpay.dshackle.test
import com.fasterxml.jackson.databind.ObjectMapper
import io.emeraldpay.dshackle.upstream.DirectCallMethods
import io.emeraldpay.dshackle.upstream.calls.DirectCallMethods
import io.emeraldpay.dshackle.upstream.ethereum.DirectEthereumApi
import io.infinitape.etherjar.rpc.ReactorBatch
import io.infinitape.etherjar.rpc.ReactorRpcClient
@@ -25,8 +25,6 @@ import io.infinitape.etherjar.rpc.RpcCallResponse
import reactor.core.publisher.Flux
import reactor.core.publisher.Mono
import java.util.concurrent.CompletableFuture
class EthereumApiStub extends DirectEthereumApi {
private String id

View File

@@ -16,9 +16,9 @@
package io.emeraldpay.dshackle.test
import io.emeraldpay.dshackle.config.UpstreamsConfig
import io.emeraldpay.dshackle.upstream.CallMethods
import io.emeraldpay.dshackle.upstream.NodeDetailsList
import io.emeraldpay.dshackle.upstream.QuorumBasedMethods
import io.emeraldpay.dshackle.upstream.calls.CallMethods
import io.emeraldpay.dshackle.startup.QuorumForLabels
import io.emeraldpay.dshackle.upstream.calls.QuorumBasedMethods
import io.emeraldpay.dshackle.upstream.ethereum.DirectEthereumApi
import io.emeraldpay.dshackle.upstream.ethereum.EthereumHead
import io.emeraldpay.dshackle.upstream.ethereum.EthereumUpstream
@@ -46,7 +46,7 @@ class EthereumUpstreamMock extends EthereumUpstream {
EthereumUpstreamMock(@NotNull String id, @NotNull Chain chain, @NotNull DirectEthereumApi api, CallMethods methods) {
super(id, chain, api, null,
UpstreamsConfig.Options.getDefaults(), new NodeDetailsList.NodeDetails(1, new UpstreamsConfig.Labels()),
UpstreamsConfig.Options.getDefaults(), new QuorumForLabels.QuorumItem(1, new UpstreamsConfig.Labels()),
methods)
setLag(0)
setStatus(UpstreamAvailability.OK)

View File

@@ -21,16 +21,13 @@ import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.module.SimpleModule
import io.emeraldpay.dshackle.cache.Caches
import io.emeraldpay.dshackle.upstream.AggregatedUpstream
import io.emeraldpay.dshackle.upstream.CallMethods
import io.emeraldpay.dshackle.upstream.ChainUpstreams
import io.emeraldpay.dshackle.upstream.DirectCallMethods
import io.emeraldpay.dshackle.upstream.QuorumBasedMethods
import io.emeraldpay.dshackle.upstream.calls.DirectCallMethods
import io.emeraldpay.dshackle.upstream.ethereum.DirectEthereumApi
import io.emeraldpay.dshackle.upstream.ethereum.EthereumUpstream
import io.emeraldpay.grpc.Chain
import io.infinitape.etherjar.rpc.JacksonRpcConverter
import io.infinitape.etherjar.rpc.ReactorRpcClient
import io.infinitape.etherjar.rpc.RpcClient
import java.text.SimpleDateFormat

View File

@@ -18,7 +18,7 @@ package io.emeraldpay.dshackle.test
import io.emeraldpay.dshackle.cache.Caches
import io.emeraldpay.dshackle.upstream.AggregatedUpstream
import io.emeraldpay.dshackle.upstream.ChainUpstreams
import io.emeraldpay.dshackle.upstream.QuorumBasedMethods
import io.emeraldpay.dshackle.upstream.calls.QuorumBasedMethods
import io.emeraldpay.dshackle.upstream.Upstream
import io.emeraldpay.dshackle.upstream.Upstreams
import io.emeraldpay.grpc.Chain

View File

@@ -19,6 +19,7 @@ import io.emeraldpay.dshackle.cache.Caches
import io.emeraldpay.dshackle.quorum.AlwaysQuorum
import io.emeraldpay.dshackle.test.EthereumUpstreamMock
import io.emeraldpay.dshackle.test.TestingCommons
import io.emeraldpay.dshackle.upstream.calls.DirectCallMethods
import io.emeraldpay.dshackle.upstream.ethereum.DirectEthereumApi
import io.emeraldpay.grpc.Chain
import spock.lang.Specification

View File

@@ -1,5 +1,6 @@
package io.emeraldpay.dshackle.upstream
import io.emeraldpay.dshackle.startup.UpstreamChange
import io.emeraldpay.dshackle.test.EthereumUpstreamMock
import io.emeraldpay.dshackle.test.TestingCommons
import io.emeraldpay.grpc.Chain

View File

@@ -16,8 +16,10 @@
package io.emeraldpay.dshackle.upstream
import io.emeraldpay.dshackle.config.UpstreamsConfig
import io.emeraldpay.dshackle.startup.QuorumForLabels
import io.emeraldpay.dshackle.test.EthereumApiStub
import io.emeraldpay.dshackle.test.TestingCommons
import io.emeraldpay.dshackle.upstream.calls.QuorumBasedMethods
import io.emeraldpay.dshackle.upstream.ethereum.DirectEthereumApi
import io.emeraldpay.dshackle.upstream.ethereum.EthereumUpstream
import io.emeraldpay.dshackle.upstream.ethereum.EthereumWs
@@ -50,7 +52,7 @@ class FilteredApisSpec extends Specification {
new DirectEthereumApi(rpcClient, null, objectMapper, ethereumTargets),
(EthereumWs) null,
new UpstreamsConfig.Options(),
new NodeDetailsList.NodeDetails(1, UpstreamsConfig.Labels.fromMap(it)),
new QuorumForLabels.QuorumItem(1, UpstreamsConfig.Labels.fromMap(it)),
ethereumTargets
)
}

View File

@@ -16,49 +16,50 @@
package io.emeraldpay.dshackle.upstream
import io.emeraldpay.dshackle.config.UpstreamsConfig
import io.emeraldpay.dshackle.startup.QuorumForLabels
import org.codehaus.groovy.runtime.DefaultGroovyMethods
import spock.lang.Specification
class NodeDetailsListSpec extends Specification {
class QuorumForLabelsSpec extends Specification {
def "Adds new node"() {
setup:
def list = new NodeDetailsList()
def list = new QuorumForLabels()
when:
list.add(new NodeDetailsList.NodeDetails(1, asLabels([foo: "bar"])))
list.add(new QuorumForLabels.QuorumItem(1, asLabels([foo: "bar"])))
then:
list.nodes.size() == 1
with(list.nodes.get(0)) {
list.all.size() == 1
with(list.all.get(0)) {
quorum == 1
DefaultGroovyMethods.equals(labels, [foo: "bar"])
}
when:
list.add(new NodeDetailsList.NodeDetails(2, asLabels([foo: "not-bar"])))
list.add(new QuorumForLabels.QuorumItem(2, asLabels([foo: "not-bar"])))
then:
list.nodes.size() == 2
with(list.nodes.get(0)) {
list.all.size() == 2
with(list.all.get(0)) {
quorum == 1
DefaultGroovyMethods.equals(labels, [foo: "bar"])
}
with(list.nodes.get(1)) {
with(list.all.get(1)) {
quorum == 2
DefaultGroovyMethods.equals(labels, [foo: "not-bar"])
}
when:
list.add(new NodeDetailsList.NodeDetails(1, asLabels([foo: "bar", baz: "baz"])))
list.add(new QuorumForLabels.QuorumItem(1, asLabels([foo: "bar", baz: "baz"])))
then:
list.nodes.size() == 3
with(list.nodes.get(0)) {
list.all.size() == 3
with(list.all.get(0)) {
quorum == 1
DefaultGroovyMethods.equals(labels, [foo: "bar"])
}
with(list.nodes.get(1)) {
with(list.all.get(1)) {
quorum == 2
DefaultGroovyMethods.equals(labels, [foo: "not-bar"])
}
with(list.nodes.get(2)) {
with(list.all.get(2)) {
quorum == 1
DefaultGroovyMethods.equals(labels, [foo: "bar", baz: "baz"])
}
@@ -66,19 +67,19 @@ class NodeDetailsListSpec extends Specification {
def "Updates existing node"() {
setup:
def list = new NodeDetailsList()
list.add(new NodeDetailsList.NodeDetails(1, asLabels([foo: "bar"])))
list.add(new NodeDetailsList.NodeDetails(1, asLabels([baz: "true"])))
def list = new QuorumForLabels()
list.add(new QuorumForLabels.QuorumItem(1, asLabels([foo: "bar"])))
list.add(new QuorumForLabels.QuorumItem(1, asLabels([baz: "true"])))
when:
list.add(new NodeDetailsList.NodeDetails(2, asLabels([baz: "true"])))
list.add(new QuorumForLabels.QuorumItem(2, asLabels([baz: "true"])))
then:
list.nodes.size() == 2
with(list.nodes.get(0)) {
list.all.size() == 2
with(list.all.get(0)) {
quorum == 1
DefaultGroovyMethods.equals(labels, [foo: "bar"])
}
with(list.nodes.get(1)) {
with(list.all.get(1)) {
quorum == 3
DefaultGroovyMethods.equals(labels, [baz: "true"])
}
@@ -86,23 +87,23 @@ class NodeDetailsListSpec extends Specification {
def "Applies all from another list"() {
setup:
def list1 = new NodeDetailsList()
list1.add(new NodeDetailsList.NodeDetails(1, asLabels([foo: "bar"])))
list1.add(new NodeDetailsList.NodeDetails(2, asLabels([baz: "true"])))
list1.add(new NodeDetailsList.NodeDetails(3, asLabels([baz: "true", bar: "bar"])))
def list1 = new QuorumForLabels()
list1.add(new QuorumForLabels.QuorumItem(1, asLabels([foo: "bar"])))
list1.add(new QuorumForLabels.QuorumItem(2, asLabels([baz: "true"])))
list1.add(new QuorumForLabels.QuorumItem(3, asLabels([baz: "true", bar: "bar"])))
def list2 = new NodeDetailsList()
list1.add(new NodeDetailsList.NodeDetails(4, asLabels([foo: "bar"])))
list1.add(new NodeDetailsList.NodeDetails(5, asLabels([baz: "true", bar: "bar"])))
list1.add(new NodeDetailsList.NodeDetails(6, asLabels([bar: "bar"])))
def list2 = new QuorumForLabels()
list1.add(new QuorumForLabels.QuorumItem(4, asLabels([foo: "bar"])))
list1.add(new QuorumForLabels.QuorumItem(5, asLabels([baz: "true", bar: "bar"])))
list1.add(new QuorumForLabels.QuorumItem(6, asLabels([bar: "bar"])))
def list = new NodeDetailsList()
def list = new QuorumForLabels()
when:
list.add(list1)
list.add(list2)
def nodes = list.nodes.toSorted { it.quorum }
def nodes = list.all.toSorted { it.quorum }
then:
list.nodes.size() == 4
list.all.size() == 4
with(nodes.get(0)) {
quorum == 2
DefaultGroovyMethods.equals(labels, [baz: "true"])

View File

@@ -13,9 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.emeraldpay.dshackle.upstream
package io.emeraldpay.dshackle.upstream.calls
import io.emeraldpay.dshackle.quorum.AlwaysQuorum
import io.emeraldpay.dshackle.upstream.calls.AggregatedCallMethods
import io.emeraldpay.dshackle.upstream.calls.CallMethods
import io.emeraldpay.dshackle.upstream.calls.DirectCallMethods
import spock.lang.Specification
class AggregatedCallMethodsSpec extends Specification {

View File

@@ -13,9 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.emeraldpay.dshackle.upstream
package io.emeraldpay.dshackle.upstream.calls
import io.emeraldpay.dshackle.quorum.AlwaysQuorum
import io.emeraldpay.dshackle.upstream.calls.DirectCallMethods
import io.emeraldpay.dshackle.upstream.calls.ManagedCallMethods
import spock.lang.Specification
class ManagedCallMethodsSpec extends Specification {

View File

@@ -16,7 +16,7 @@
package io.emeraldpay.dshackle.upstream.ethereum
import io.emeraldpay.dshackle.test.TestingCommons
import io.emeraldpay.dshackle.upstream.DirectCallMethods
import io.emeraldpay.dshackle.upstream.calls.DirectCallMethods
import io.infinitape.etherjar.rpc.ReactorRpcClient
import io.infinitape.etherjar.rpc.RpcException
import io.infinitape.etherjar.rpc.RpcResponseError

View File

@@ -22,22 +22,17 @@ import io.emeraldpay.api.proto.BlockchainOuterClass
import io.emeraldpay.api.proto.Common
import io.emeraldpay.dshackle.test.MockServer
import io.emeraldpay.dshackle.test.TestingCommons
import io.emeraldpay.dshackle.upstream.QuorumBasedMethods
import io.emeraldpay.dshackle.upstream.UpstreamAvailability
import io.emeraldpay.dshackle.upstream.grpc.GrpcUpstream
import io.emeraldpay.grpc.Chain
import io.grpc.stub.StreamObserver
import io.infinitape.etherjar.domain.BlockHash
import io.infinitape.etherjar.rpc.JacksonRpcConverter
import io.infinitape.etherjar.rpc.ReactorRpcClient
import io.infinitape.etherjar.rpc.emerald.ReactorEmeraldClient
import io.infinitape.etherjar.rpc.json.BlockJson
import reactor.test.StepVerifier
import spock.lang.Specification
import java.time.Duration
import java.util.concurrent.CompletableFuture
import java.util.concurrent.Executors
class GrpcUpstreamSpec extends Specification {