· 5 years ago · Feb 04, 2021, 03:50 PM
1package com.wavesplatform.we.app.example.contract.impl
2
3import com.wavesplatform.protobuf.service.contract.ContractServiceGrpc.ContractServiceBlockingStub
4import com.wavesplatform.protobuf.service.contract.ContractTransaction
5import com.wavesplatform.protobuf.service.contract.ContractTransactionResponse
6import com.wavesplatform.protobuf.service.contract.Transaction
7import com.wavesplatform.transaction.protobuf.DataEntry
8import com.wavesplatform.vst.contract.grpc.grpcapi.GrpcConnectionParamFinderImpl
9import com.wavesplatform.vst.contract.grpc.grpcapi.GrpcConnectionParameterFinder
10import com.wavesplatform.vst.contract.grpc.grpcapi.TransactionObserver
11import com.wavesplatform.vst.contract.grpc.service.TransactionHandler
12import com.wavesplatform.vst.contract.utils.JsonUtils
13import com.wavesplatform.vst.node.VstNodeApi
14import com.wavesplatform.vst.node.dto.ParamDto
15import com.wavesplatform.we.app.example.contract.ExampleContractStarter
16import org.junit.jupiter.api.Test
17import org.mockito.Answers
18import org.mockito.Mockito
19import org.mockito.Mockito.RETURNS_MOCKS
20import org.springframework.aop.framework.Advised
21import org.springframework.aop.support.AopUtils
22import org.springframework.beans.factory.annotation.Autowired
23import org.springframework.boot.autoconfigure.EnableAutoConfiguration
24import org.springframework.boot.test.context.SpringBootTest
25import org.springframework.boot.test.mock.mockito.MockBean
26import org.springframework.context.annotation.ComponentScan
27import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
28import org.springframework.test.context.ContextConfiguration
29import java.util.concurrent.Executor
30import java.util.concurrent.TimeUnit.HOURS
31
32@SpringBootTest(classes = [ ExampleContractStarter::class, NoAsyncConfigurer::class ])
33@EnableAutoConfiguration
34@ComponentScan("com.wavesplatform.we.app.example.contract")
35class ExampleContractPt {
36
37 @Autowired
38 lateinit var handler: TransactionHandler
39
40 @MockBean
41 lateinit var vstNodeApi: VstNodeApi
42
43 @MockBean
44 lateinit var contractTxStub: ContractServiceBlockingStub
45
46 @MockBean
47 lateinit var grpcConnectionParamFinder: GrpcConnectionParameterFinder
48
49 @MockBean(answer = Answers.RETURNS_MOCKS)
50 lateinit var transactionObserver: TransactionObserver
51
52 @MockBean
53 lateinit var channel: io.grpc.Channel
54
55 @Autowired
56 lateinit var executor: Executor
57
58 @Test
59 fun test() {
60 // Mock Node API call
61 Mockito.`when`(vstNodeApi.getContractValue("contractId", "USERS_user_id"))
62 .thenReturn(ParamDto("USERS_user_id", "string", JsonUtils.toJson(UserW("id", "external_id"))))
63
64 // Avoid calling async method in separate thread
65 val realHandler = (handler as Advised).targetSource.target as TransactionHandler
66 val t0 = System.currentTimeMillis()
67 val amountTx = 10000
68 (0..amountTx).forEach {
69 val tx = buildTx("$it")
70 realHandler.handleTransaction(tx)
71 }
72 val t1 = System.currentTimeMillis()
73 println("Total time to handle $amountTx tx: ${(t1 - t0)}ms.")
74 println("Avg time to handle 1 tx: ${(t1 - t0) / amountTx}ms.")
75 }
76
77 fun buildTx(txId: String) = ContractTransactionResponse.newBuilder().apply {
78 transaction = ContractTransaction.newBuilder().apply {
79 id = txId
80 type = 104
81 sender = "sender"
82 contractId = "contractId"
83 addParams(DataEntry.newBuilder().apply {
84 key = "action"
85 stringValue = "createWallet"
86
87 })
88 addParams(DataEntry.newBuilder().apply {
89 key = "user_id"
90 stringValue = "user_id"
91
92 })
93 addParams(DataEntry.newBuilder().apply {
94 key = "target"
95 intValue = 1
96
97 })
98 }.build()
99 authToken = "token"
100 }.build()!!
101
102}