hermez-node/api/state_test.go
api/state_test.goRaw
1package api
2
3import (
4 "testing"
5 "time"
6
7 "github.com/hermeznetwork/hermez-node/common"
8 "github.com/hermeznetwork/hermez-node/db/historydb"
9 "github.com/stretchr/testify/assert"
10)
11
12const secondsPerBlock = 15
13
14type testStatus struct {
15 Network testNetwork `json:"network"`
16 Metrics historydb.Metrics `json:"metrics"`
17 Rollup common.RollupVariables `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 assert.Equal(t, *rollupVars, api.status.Rollup)
34 api.SetRollupVariables(tc.rollupVars)
35 assert.Equal(t, tc.rollupVars, api.status.Rollup)
36}
37
38func TestSetWDelayerVariables(t *testing.T) {
39 wdelayerVars := &common.WDelayerVariables{}
40 assert.Equal(t, *wdelayerVars, api.status.WithdrawalDelayer)
41 api.SetWDelayerVariables(tc.wdelayerVars)
42 assert.Equal(t, tc.wdelayerVars, api.status.WithdrawalDelayer)
43}
44
45func TestSetAuctionVariables(t *testing.T) {
46 auctionVars := &common.AuctionVariables{}
47 assert.Equal(t, *auctionVars, api.status.Auction)
48 api.SetAuctionVariables(tc.auctionVars)
49 assert.Equal(t, tc.auctionVars, api.status.Auction)
50}
51
52func TestNextForgers(t *testing.T) {
53 // It's assumed that bids for each slot will be received in increasing order
54 bestBids := make(map[int64]testBid)
55 for j := range tc.bids {
56 bestBids[tc.bids[j].SlotNum] = tc.bids[j]
57 }
58 lastBlock := tc.blocks[len(tc.blocks)-1]
59 for i := int64(0); i < tc.slots[len(tc.slots)-1].SlotNum; i++ {
60 lastClosedSlot := i + int64(api.status.Auction.ClosedAuctionSlots)
61 nextForgers, err := api.GetNextForgers(tc.blocks[len(tc.blocks)-1], i, lastClosedSlot)
62 assert.NoError(t, err)
63 for j := i; j <= lastClosedSlot; j++ {
64 for q := range nextForgers {
65 if nextForgers[q].Period.SlotNum == j {
66 if nextForgers[q].Coordinator.ItemID != 0 {
67 assert.Equal(t, bestBids[j].Bidder, nextForgers[q].Coordinator.Bidder)
68 } else {
69 assert.Equal(t, bootCoordinator.Bidder, nextForgers[q].Coordinator.Bidder)
70 }
71 firstBlockSlot, lastBlockSlot := api.getFirstLastBlock(j)
72 fromTimestamp := lastBlock.Timestamp.Add(time.Second * time.Duration(secondsPerBlock*(firstBlockSlot-lastBlock.Num)))
73 toTimestamp := lastBlock.Timestamp.Add(time.Second * time.Duration(secondsPerBlock*(lastBlockSlot-lastBlock.Num)))
74 assert.Equal(t, fromTimestamp.Unix(), nextForgers[q].Period.FromTimestamp.Unix())
75 assert.Equal(t, toTimestamp.Unix(), nextForgers[q].Period.ToTimestamp.Unix())
76 }
77 }
78 }
79 }
80}
81
82func TestUpdateNetworkInfo(t *testing.T) {
83 status := &Network{}
84 assert.Equal(t, status.LastSyncBlock, api.status.Network.LastSyncBlock)
85 assert.Equal(t, status.LastBatch.BatchNum, api.status.Network.LastBatch.BatchNum)
86 assert.Equal(t, status.CurrentSlot, api.status.Network.CurrentSlot)
87 assert.Equal(t, status.NextForgers, api.status.Network.NextForgers)
88 lastBlock := tc.blocks[3]
89 lastBatchNum := common.BatchNum(3)
90 currentSlotNum := int64(1)
91 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
92 assert.NoError(t, err)
93 assert.Equal(t, lastBlock.Num, api.status.Network.LastSyncBlock)
94 assert.Equal(t, lastBatchNum, api.status.Network.LastBatch.BatchNum)
95 assert.Equal(t, currentSlotNum, api.status.Network.CurrentSlot)
96 assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(api.status.Network.NextForgers))
97}
98
99func TestUpdateMetrics(t *testing.T) {
100 // TODO: Improve checks when til is integrated
101 // Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
102 lastBlock := tc.blocks[3]
103 lastBatchNum := common.BatchNum(3)
104 currentSlotNum := int64(1)
105 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
106 assert.NoError(t, err)
107
108 err = api.UpdateMetrics()
109 assert.NoError(t, err)
110 assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
111 assert.Greater(t, api.status.Metrics.BatchFrequency, float64(0))
112 assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
113 assert.Greater(t, api.status.Metrics.TotalAccounts, int64(0))
114 assert.Greater(t, api.status.Metrics.TotalBJJs, int64(0))
115 assert.Greater(t, api.status.Metrics.AvgTransactionFee, float64(0))
116}
117
118func TestUpdateRecommendedFee(t *testing.T) {
119 err := api.UpdateRecommendedFee()
120 assert.NoError(t, err)
121 assert.Greater(t, api.status.RecommendedFee.ExistingAccount, float64(0))
122 assert.Equal(t, api.status.RecommendedFee.CreatesAccount,
123 api.status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
124 assert.Equal(t, api.status.RecommendedFee.CreatesAccountAndRegister,
125 api.status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
126}
127
128func TestGetState(t *testing.T) {
129 lastBlock := tc.blocks[3]
130 lastBatchNum := common.BatchNum(3)
131 currentSlotNum := int64(1)
132 api.SetRollupVariables(tc.rollupVars)
133 api.SetWDelayerVariables(tc.wdelayerVars)
134 api.SetAuctionVariables(tc.auctionVars)
135 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
136 assert.NoError(t, err)
137 err = api.UpdateMetrics()
138 assert.NoError(t, err)
139 err = api.UpdateRecommendedFee()
140 assert.NoError(t, err)
141
142 endpoint := apiURL + "state"
143 var status testStatus
144
145 assert.NoError(t, doGoodReq("GET", endpoint, nil, &status))
146 assert.Equal(t, tc.rollupVars, status.Rollup)
147 assert.Equal(t, tc.auctionVars, status.Auction)
148 assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
149 assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
150 assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
151 assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
152 assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
153 assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(status.Network.NextForgers))
154 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
155 assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
156 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
157 assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
158 assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
159 assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
160 assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
161 assert.Equal(t, status.RecommendedFee.CreatesAccount,
162 status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
163 assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
164 status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
165}