hermez-node/api/state_test.go
api/state_test.goRaw
1package api
2
3import (
4 "math/big"
5 "testing"
6
7 "github.com/hermeznetwork/hermez-node/apitypes"
8 "github.com/hermeznetwork/hermez-node/common"
9 "github.com/hermeznetwork/hermez-node/db/historydb"
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
12)
13
14type testStatus struct {
15 Network testNetwork `json:"network"`
16 Metrics historydb.Metrics `json:"metrics"`
17 Rollup historydb.RollupVariablesAPI `json:"rollup"`
18 Auction common.AuctionVariables `json:"auction"`
19 WithdrawalDelayer common.WDelayerVariables `json:"withdrawalDelayer"`
20 RecommendedFee common.RecommendedFee `json:"recommendedFee"`
21}
22
23type testNetwork struct {
24 LastEthBlock int64 `json:"lastEthereumBlock"`
25 LastSyncBlock int64 `json:"lastSynchedBlock"`
26 LastBatch testBatch `json:"lastBatch"`
27 CurrentSlot int64 `json:"currentSlot"`
28 NextForgers []NextForger `json:"nextForgers"`
29}
30
31func TestSetRollupVariables(t *testing.T) {
32 rollupVars := &common.RollupVariables{}
33 assertEqualRollupVariables(t, *rollupVars, api.status.Rollup, true)
34 api.SetRollupVariables(tc.rollupVars)
35 assertEqualRollupVariables(t, tc.rollupVars, api.status.Rollup, true)
36}
37
38func assertEqualRollupVariables(t *testing.T, rollupVariables common.RollupVariables, apiVariables historydb.RollupVariablesAPI, checkBuckets bool) {
39 assert.Equal(t, apitypes.NewBigIntStr(rollupVariables.FeeAddToken), apiVariables.FeeAddToken)
40 assert.Equal(t, rollupVariables.ForgeL1L2BatchTimeout, apiVariables.ForgeL1L2BatchTimeout)
41 assert.Equal(t, rollupVariables.WithdrawalDelay, apiVariables.WithdrawalDelay)
42 assert.Equal(t, rollupVariables.SafeMode, apiVariables.SafeMode)
43 if checkBuckets {
44 for i, bucket := range rollupVariables.Buckets {
45 assert.Equal(t, apitypes.NewBigIntStr(bucket.BlockWithdrawalRate), apiVariables.Buckets[i].BlockWithdrawalRate)
46 assert.Equal(t, apitypes.NewBigIntStr(bucket.CeilUSD), apiVariables.Buckets[i].CeilUSD)
47 assert.Equal(t, apitypes.NewBigIntStr(bucket.MaxWithdrawals), apiVariables.Buckets[i].MaxWithdrawals)
48 assert.Equal(t, apitypes.NewBigIntStr(bucket.Withdrawals), apiVariables.Buckets[i].Withdrawals)
49 }
50 }
51}
52
53func TestSetWDelayerVariables(t *testing.T) {
54 wdelayerVars := &common.WDelayerVariables{}
55 assert.Equal(t, *wdelayerVars, api.status.WithdrawalDelayer)
56 api.SetWDelayerVariables(tc.wdelayerVars)
57 assert.Equal(t, tc.wdelayerVars, api.status.WithdrawalDelayer)
58}
59
60func TestSetAuctionVariables(t *testing.T) {
61 auctionVars := &common.AuctionVariables{}
62 assert.Equal(t, *auctionVars, api.status.Auction)
63 api.SetAuctionVariables(tc.auctionVars)
64 assert.Equal(t, tc.auctionVars, api.status.Auction)
65}
66
67func TestUpdateNetworkInfo(t *testing.T) {
68 status := &Network{}
69 assert.Equal(t, status.LastSyncBlock, api.status.Network.LastSyncBlock)
70 assert.Equal(t, status.LastBatch, api.status.Network.LastBatch)
71 assert.Equal(t, status.CurrentSlot, api.status.Network.CurrentSlot)
72 assert.Equal(t, status.NextForgers, api.status.Network.NextForgers)
73 lastBlock := tc.blocks[3]
74 lastBatchNum := common.BatchNum(3)
75 currentSlotNum := int64(1)
76
77 // Generate some bucket_update data
78 bucketUpdates := []common.BucketUpdate{
79 {
80 EthBlockNum: 4,
81 NumBucket: 0,
82 BlockStamp: 4,
83 Withdrawals: big.NewInt(123),
84 },
85 {
86 EthBlockNum: 5,
87 NumBucket: 2,
88 BlockStamp: 5,
89 Withdrawals: big.NewInt(42),
90 },
91 {
92 EthBlockNum: 5,
93 NumBucket: 2, // Repeated bucket
94 BlockStamp: 5,
95 Withdrawals: big.NewInt(43),
96 },
97 }
98 err := api.h.AddBucketUpdatesTest(api.h.DB(), bucketUpdates)
99 require.NoError(t, err)
100
101 err = api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
102 assert.NoError(t, err)
103 assert.Equal(t, lastBlock.Num, api.status.Network.LastSyncBlock)
104 assert.Equal(t, lastBatchNum, api.status.Network.LastBatch.BatchNum)
105 assert.Equal(t, currentSlotNum, api.status.Network.CurrentSlot)
106 assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(api.status.Network.NextForgers))
107 assert.Equal(t, api.status.Rollup.Buckets[0].Withdrawals, apitypes.NewBigIntStr(big.NewInt(123)))
108 assert.Equal(t, api.status.Rollup.Buckets[2].Withdrawals, apitypes.NewBigIntStr(big.NewInt(43)))
109}
110
111func TestUpdateMetrics(t *testing.T) {
112 // Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
113 lastBlock := tc.blocks[3]
114 lastBatchNum := common.BatchNum(3)
115 currentSlotNum := int64(1)
116 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
117 assert.NoError(t, err)
118
119 err = api.UpdateMetrics()
120 assert.NoError(t, err)
121 assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
122 assert.Greater(t, api.status.Metrics.BatchFrequency, float64(0))
123 assert.Greater(t, api.status.Metrics.TransactionsPerSecond, float64(0))
124 assert.Greater(t, api.status.Metrics.TotalAccounts, int64(0))
125 assert.Greater(t, api.status.Metrics.TotalBJJs, int64(0))
126 assert.Greater(t, api.status.Metrics.AvgTransactionFee, float64(0))
127}
128
129func TestUpdateRecommendedFee(t *testing.T) {
130 err := api.UpdateRecommendedFee()
131 assert.NoError(t, err)
132 assert.Greater(t, api.status.RecommendedFee.ExistingAccount, float64(0))
133 assert.Equal(t, api.status.RecommendedFee.CreatesAccount,
134 api.status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
135 assert.Equal(t, api.status.RecommendedFee.CreatesAccountAndRegister,
136 api.status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
137}
138
139func TestGetState(t *testing.T) {
140 lastBlock := tc.blocks[3]
141 lastBatchNum := common.BatchNum(3)
142 currentSlotNum := int64(1)
143 api.SetRollupVariables(tc.rollupVars)
144 api.SetWDelayerVariables(tc.wdelayerVars)
145 api.SetAuctionVariables(tc.auctionVars)
146 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
147 assert.NoError(t, err)
148 err = api.UpdateMetrics()
149 assert.NoError(t, err)
150 err = api.UpdateRecommendedFee()
151 assert.NoError(t, err)
152
153 endpoint := apiURL + "state"
154 var status testStatus
155
156 assert.NoError(t, doGoodReq("GET", endpoint, nil, &status))
157
158 // SC vars
159 // UpdateNetworkInfo will overwrite buckets withdrawal values
160 // So they won't be checked here, they are checked at
161 // TestUpdateNetworkInfo
162 assertEqualRollupVariables(t, tc.rollupVars, status.Rollup, false)
163 assert.Equal(t, tc.auctionVars, status.Auction)
164 assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
165 // Network
166 assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
167 assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
168 // TODO: assert all the batch, not just the batch num
169 assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
170 assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
171 assertNextForgers(t, tc.nextForgers, status.Network.NextForgers)
172 // Metrics
173 // TODO: perform real asserts (not just greater than 0)
174 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
175 assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
176 assert.Greater(t, status.Metrics.TransactionsPerSecond, float64(0))
177 assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
178 assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
179 assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
180 // Recommended fee
181 // TODO: perform real asserts (not just greater than 0)
182 assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
183 assert.Equal(t, status.RecommendedFee.CreatesAccount,
184 status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
185 assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
186 status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
187}
188
189func assertNextForgers(t *testing.T, expected, actual []NextForger) {
190 assert.Equal(t, len(expected), len(actual))
191 for i := range expected {
192 // ignore timestamps and other metadata
193 actual[i].Period.FromTimestamp = expected[i].Period.FromTimestamp
194 actual[i].Period.ToTimestamp = expected[i].Period.ToTimestamp
195 actual[i].Coordinator.ItemID = expected[i].Coordinator.ItemID
196 actual[i].Coordinator.EthBlockNum = expected[i].Coordinator.EthBlockNum
197 assert.Equal(t, expected[i], actual[i])
198 }
199}