Poll rpc heads using expected-block-time (#338)

This commit is contained in:
KirillPamPam
2023-11-10 13:18:08 +04:00
committed by GitHub
parent ef48f8c89f
commit e5f844b091
2 changed files with 80 additions and 1 deletions

View File

@@ -0,0 +1,71 @@
package io.emeraldpay.dshackle.upstream.generic.connectors
import io.emeraldpay.dshackle.Chain
import io.emeraldpay.dshackle.FileResolver
import io.emeraldpay.dshackle.config.ChainsConfig
import io.emeraldpay.dshackle.config.ChainsConfigReader
import io.emeraldpay.dshackle.config.UpstreamsConfig
import io.emeraldpay.dshackle.foundation.ChainOptionsReader
import io.emeraldpay.dshackle.startup.configure.GenericConnectorFactoryCreator
import io.emeraldpay.dshackle.upstream.BlockValidator
import io.emeraldpay.dshackle.upstream.DefaultUpstream
import io.emeraldpay.dshackle.upstream.forkchoice.AlwaysForkChoice
import io.emeraldpay.dshackle.upstream.generic.GenericRpcHead
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.Arguments
import org.junit.jupiter.params.provider.MethodSource
import org.mockito.Mockito.mockConstruction
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import reactor.core.scheduler.Schedulers.immediate
import java.io.File
import java.net.URI
import java.time.Duration
class GenericConnectorFactoryCreatorTest {
@ParameterizedTest
@MethodSource("data")
fun `rpc head poll interval must equal to expected-block-time`(
expectedBlockTime: Duration,
config: ChainsConfig.ChainConfig,
) {
val factory = GenericConnectorFactoryCreator(
FileResolver(File("")),
immediate(),
immediate(),
immediate(),
immediate(),
)
var args: List<*>? = null
mockConstruction(GenericRpcHead::class.java) { _, ctx -> args = ctx.arguments() }
.use {
factory.createConnectorFactoryCreator(
"id",
UpstreamsConfig.RpcConnection(
UpstreamsConfig.HttpEndpoint(URI("http://localhost")),
),
Chain.ETHEREUM__MAINNET,
AlwaysForkChoice(),
BlockValidator.ALWAYS_VALID,
config,
)?.create(mock<DefaultUpstream> { on { getId() } doReturn "id" }, Chain.ETHEREUM__MAINNET)
assertEquals(expectedBlockTime, args?.get(6))
}
}
companion object {
private val chainsConfigReader = ChainsConfigReader(ChainOptionsReader())
@JvmStatic
fun data(): List<Arguments> = chainsConfigReader.read(null)
.flatMap { cfg ->
cfg.shortNames.map {
Arguments.of(cfg.expectedBlockTime.coerceAtLeast(Duration.ofSeconds(1)), cfg)
}
}
}
}