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