Skip to content

Commit d28e9bd

Browse files
authored
coordinator: add Web3jClientManager to improve test code reuse (#85)
coordinator: add Web3jClientManager to improve integration test code reuse and debugging
1 parent ea17789 commit d28e9bd

File tree

8 files changed

+81
-26
lines changed

8 files changed

+81
-26
lines changed

coordinator/core/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ dependencies {
1818
implementation project(":jvm-libs:teku-execution-client")
1919
implementation "io.vertx:vertx-core"
2020
// jackson shall never be used in the core module
21-
// however, it is used already :( but was as transitive throught Teku Execution Client
21+
// however, it is used already :( but was as transitive through Teku Execution Client
2222
// necessary atm because of Type2StateManagerClient interface
2323
implementation "com.fasterxml.jackson.core:jackson-databind:${libs.versions.jackson.get()}"
2424
// jackson shall never be used in the core module

coordinator/ethereum/message-anchoring/src/integrationTest/kotlin/net.consensys.zkevm.ethereum.coordination.messageanchoring/L1EventQuerierIntegrationTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import net.consensys.linea.contract.LineaRollupAsyncFriendly
99
import net.consensys.toBigInteger
1010
import net.consensys.toULong
1111
import net.consensys.zkevm.ethereum.ContractsManager
12-
import net.consensys.zkevm.ethereum.L1AccountManager
12+
import net.consensys.zkevm.ethereum.Web3jClientManager
1313
import org.apache.tuweni.bytes.Bytes32
1414
import org.assertj.core.api.Assertions.assertThat
1515
import org.junit.jupiter.api.BeforeEach
@@ -37,7 +37,7 @@ class L1EventQuerierIntegrationTest {
3737
fun beforeEach() {
3838
val deploymentResult = ContractsManager.get().deployLineaRollup().get()
3939
testLineaRollupContractAddress = deploymentResult.contractAddress
40-
web3Client = L1AccountManager.web3jClient
40+
web3Client = Web3jClientManager.l1Client
4141
@Suppress("DEPRECATION")
4242
contract = deploymentResult.rollupOperatorClientLegacy
4343
l1ContractDeploymentBlockNumber = deploymentResult.contractDeploymentBlockNumber.toULong()

coordinator/ethereum/message-anchoring/src/integrationTest/kotlin/net.consensys.zkevm.ethereum.coordination.messageanchoring/L2MessageAnchorerIntegrationTest.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ import net.consensys.linea.contract.LineaRollupAsyncFriendly
1313
import net.consensys.toBigInteger
1414
import net.consensys.zkevm.coordinator.clients.smartcontract.LineaRollupSmartContractClient
1515
import net.consensys.zkevm.ethereum.ContractsManager
16-
import net.consensys.zkevm.ethereum.L1AccountManager
17-
import net.consensys.zkevm.ethereum.L2AccountManager
16+
import net.consensys.zkevm.ethereum.Web3jClientManager
1817
import org.apache.tuweni.bytes.Bytes32
1918
import org.assertj.core.api.Assertions.assertThat
2019
import org.junit.jupiter.api.BeforeEach
@@ -61,8 +60,8 @@ class L2MessageAnchorerIntegrationTest {
6160
val deploymentResult = ContractsManager.get().deployRollupAndL2MessageService().get()
6261
testLineaRollupContractAddress = deploymentResult.lineaRollup.contractAddress
6362
l1ContractDeploymentBlockNumber = deploymentResult.lineaRollup.contractDeploymentBlockNumber
64-
l1Web3jClient = L1AccountManager.web3jClient
65-
l2Web3jClient = L2AccountManager.web3jClient
63+
l1Web3jClient = Web3jClientManager.l1Client
64+
l2Web3jClient = Web3jClientManager.l2Client
6665
l2TransactionManager = deploymentResult.l2MessageService.anchorerOperator.txManager
6766
@Suppress("DEPRECATION")
6867
l1ContractLegacyClient = deploymentResult.lineaRollup.rollupOperatorClientLegacy

coordinator/ethereum/message-anchoring/src/integrationTest/kotlin/net.consensys.zkevm.ethereum.coordination.messageanchoring/MessageServiceIntegrationTest.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import net.consensys.toBigInteger
1212
import net.consensys.toULong
1313
import net.consensys.zkevm.coordinator.clients.smartcontract.LineaRollupSmartContractClient
1414
import net.consensys.zkevm.ethereum.ContractsManager
15-
import net.consensys.zkevm.ethereum.L1AccountManager
16-
import net.consensys.zkevm.ethereum.L2AccountManager
15+
import net.consensys.zkevm.ethereum.Web3jClientManager
1716
import org.apache.logging.log4j.LogManager
1817
import org.apache.logging.log4j.Logger
1918
import org.assertj.core.api.Assertions.assertThat
@@ -33,8 +32,8 @@ class MessageServiceIntegrationTest {
3332
private val log: Logger = LogManager.getLogger(this::class.java)
3433

3534
private val l2RecipientAddress = "0x03dfa322A95039BB679771346Ee2dBfEa0e2B773"
36-
private val l1Web3Client = L1AccountManager.web3jClient
37-
private val l2Web3jClient = L2AccountManager.web3jClient
35+
private val l1Web3Client = Web3jClientManager.l1Client
36+
private val l2Web3jClient = Web3jClientManager.l2Client
3837
private lateinit var l2TransactionManager: AsyncFriendlyTransactionManager
3938

4039
private val messagePollingInterval = 200.milliseconds

coordinator/ethereum/test-utils/src/main/kotlin/net/consensys/zkevm/ethereum/AccountManager.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ import org.web3j.crypto.Credentials
1212
import org.web3j.protocol.Web3j
1313
import org.web3j.protocol.core.DefaultBlockParameterName
1414
import org.web3j.protocol.core.Response
15-
import org.web3j.protocol.http.HttpService
1615
import org.web3j.tx.response.PollingTransactionReceiptProcessor
17-
import org.web3j.utils.Async
1816
import tech.pegasys.teku.infrastructure.async.SafeFuture
1917
import java.io.File
2018
import java.math.BigInteger
@@ -75,7 +73,6 @@ fun getTransactionManager(
7573
private inline val Int.ether get(): BigInteger = BigInteger.valueOf(this.toLong()).multiply(BigInteger.TEN.pow(18))
7674

7775
interface AccountManager {
78-
val web3jClient: Web3j
7976
val chainId: Long
8077
fun whaleAccount(): Account
8178
fun generateAccount(initialBalanceWei: BigInteger = 10.ether): Account
@@ -85,13 +82,12 @@ interface AccountManager {
8582
}
8683

8784
private open class WhaleBasedAccountManager(
88-
rpcUrl: String,
85+
val web3jClient: Web3j,
8986
genesisFile: Path,
9087
val clock: Clock = Clock.System,
9188
val testWorkerIdProvider: () -> Long = { ProcessHandle.current().pid() },
9289
val log: Logger = LogManager.getLogger(WhaleBasedAccountManager::class.java)
9390
) : AccountManager {
94-
override val web3jClient: Web3j = Web3j.build(HttpService(rpcUrl), 500, Async.defaultExecutorService())
9591
private val whaleAccounts: List<Account>
9692
final override val chainId: Long
9793

@@ -224,13 +220,13 @@ private open class WhaleBasedAccountManager(
224220
}
225221

226222
object L1AccountManager : AccountManager by WhaleBasedAccountManager(
227-
rpcUrl = System.getProperty("L1_RPC", "http://localhost:8445"),
223+
web3jClient = Web3jClientManager.l1Client,
228224
genesisFile = findFile(System.getProperty("L1_GENESIS", "docker/config/l1-node/el/genesis.json")),
229225
log = LogManager.getLogger(L1AccountManager::class.java)
230226
)
231227

232228
object L2AccountManager : AccountManager by WhaleBasedAccountManager(
233-
rpcUrl = System.getProperty("L2_RPC", "http://localhost:8545"),
229+
web3jClient = Web3jClientManager.l2Client,
234230
genesisFile = findFile(System.getProperty("L2_GENESIS", "docker/config/linea-local-dev-genesis.json")),
235231
log = LogManager.getLogger(L2AccountManager::class.java)
236232
)

coordinator/ethereum/test-utils/src/main/kotlin/net/consensys/zkevm/ethereum/ContractsManager.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ interface ContractsManager {
8080

8181
fun connectL2MessageService(
8282
contractAddress: String,
83-
web3jClient: Web3j = L2AccountManager.web3jClient,
83+
web3jClient: Web3j = Web3jClientManager.l2Client,
8484
transactionManager: AsyncFriendlyTransactionManager,
8585
gasProvider: EIP1559GasProvider = EIP1559GasProvider(
8686
web3jClient,
@@ -193,7 +193,7 @@ object MakeFileDelegatedContractsManager : ContractsManager {
193193
): LineaRollupAsyncFriendly {
194194
return LineaRollupAsyncFriendly.load(
195195
contractAddress,
196-
L1AccountManager.web3jClient,
196+
Web3jClientManager.l1Client,
197197
transactionManager,
198198
gasProvider,
199199
emptyMap()
@@ -207,7 +207,7 @@ object MakeFileDelegatedContractsManager : ContractsManager {
207207
): LineaRollupSmartContractClient {
208208
return Web3JLineaRollupSmartContractClient.load(
209209
contractAddress,
210-
L1AccountManager.web3jClient,
210+
Web3jClientManager.l1Client,
211211
transactionManager,
212212
gasProvider,
213213
emptyMap()
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package net.consensys.zkevm.ethereum
2+
3+
import net.consensys.linea.web3j.okHttpClientBuilder
4+
import org.apache.logging.log4j.Level
5+
import org.apache.logging.log4j.LogManager
6+
import org.apache.logging.log4j.Logger
7+
import org.web3j.protocol.Web3j
8+
import org.web3j.protocol.http.HttpService
9+
import org.web3j.utils.Async
10+
11+
/**
12+
* Helper Object to create Web3j clients for L1 and L2
13+
* that allow overriding default log values for testing and debugging easily
14+
*/
15+
object Web3jClientManager {
16+
val l1RpcUrl: String = System.getProperty("L1_RPC", "http://localhost:8445")
17+
val l2RpcUrl: String = System.getProperty("L2_RPC", "http://localhost:8545")
18+
val l1Client: Web3j = buildL1Client()
19+
val l2Client: Web3j = buildL2Client()
20+
21+
fun buildL1Client(
22+
rpcUrl: String = l1RpcUrl,
23+
log: Logger = LogManager.getLogger("test.clients.l1.web3j-default"),
24+
requestResponseLogLevel: Level = Level.TRACE,
25+
failuresLogLevel: Level = Level.DEBUG
26+
): Web3j {
27+
return buildWeb3Client(rpcUrl, log, requestResponseLogLevel, failuresLogLevel)
28+
}
29+
30+
fun buildL2Client(
31+
rpcUrl: String = l2RpcUrl,
32+
log: Logger = LogManager.getLogger("test.clients.l2.web3j-default"),
33+
requestResponseLogLevel: Level = Level.TRACE,
34+
failuresLogLevel: Level = Level.DEBUG
35+
): Web3j {
36+
return buildWeb3Client(rpcUrl, log, requestResponseLogLevel, failuresLogLevel)
37+
}
38+
39+
fun buildWeb3Client(
40+
rpcUrl: String,
41+
log: Logger = LogManager.getLogger("test.clients.web3j"),
42+
requestResponseLogLevel: Level = Level.TRACE,
43+
failuresLogLevel: Level = Level.DEBUG
44+
): Web3j {
45+
return Web3j.build(
46+
HttpService(
47+
rpcUrl,
48+
okHttpClientBuilder(
49+
logger = log,
50+
requestResponseLogLevel = requestResponseLogLevel,
51+
failuresLogLevel = failuresLogLevel
52+
).build()
53+
),
54+
500,
55+
Async.defaultExecutorService()
56+
)
57+
}
58+
}

jvm-libs/web3j-extensions/src/main/kotlin/net/consensys/linea/web3j/OkHttpClientLogging.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import okhttp3.Interceptor
77
import okhttp3.OkHttpClient
88
import okhttp3.Response
99
import okio.Buffer
10+
import org.apache.logging.log4j.Level
1011
import org.apache.logging.log4j.LogManager
1112
import org.apache.logging.log4j.Logger
1213
import org.web3j.protocol.http.HttpService
@@ -52,17 +53,19 @@ class OkHttpMinimalJsonRpcLoggerInterceptor(
5253
}
5354

5455
fun okHttpClientBuilder(
55-
logger: Logger = LogManager.getLogger(HttpService::class.java) // use same class to keep backward compatibility
56+
logger: Logger = LogManager.getLogger(HttpService::class.java), // use same class to keep backward compatibility
57+
// we make a lot of eth_call request that fail by design, having DEBUG/WARN level is too noisy
58+
// ideally we should manage methods individually, but don't have time for that now
59+
requestResponseLogLevel: Level = Level.TRACE,
60+
failuresLogLevel: Level = Level.DEBUG
5661
): OkHttpClient.Builder {
5762
val httpClientBuilder = OkHttpClient.Builder()
5863
httpClientBuilder.addInterceptor(
5964
OkHttpMinimalJsonRpcLoggerInterceptor(
6065
MinimalInLineJsonRpcLogger(
6166
logger,
62-
// we make a lot of eth_call request that fail by design, having DEBUG/WARN level is too noisy
63-
// ideally we should manage methods individually, but don't have time for that now
64-
requestResponseLogLevel = org.apache.logging.log4j.Level.TRACE,
65-
failuresLogLevel = org.apache.logging.log4j.Level.DEBUG,
67+
requestResponseLogLevel = requestResponseLogLevel,
68+
failuresLogLevel = failuresLogLevel,
6669
maskEndpoint = ::maskEndpointPath
6770
)
6871
)

0 commit comments

Comments
 (0)