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, api.status.Network.LastBatch)
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 // Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
101 lastBlock := tc.blocks[3]
102 lastBatchNum := common.BatchNum(3)
103 currentSlotNum := int64(1)
104 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
105 assert.NoError(t, err)
106
107 err = api.UpdateMetrics()
108 assert.NoError(t, err)
109 assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
110 assert.Greater(t, api.status.Metrics.BatchFrequency, float64(0))
111 assert.Greater(t, api.status.Metrics.TransactionsPerSecond, float64(0))
112 assert.Greater(t, api.status.Metrics.TotalAccounts, int64(0))
113 assert.Greater(t, api.status.Metrics.TotalBJJs, int64(0))
114 assert.Greater(t, api.status.Metrics.AvgTransactionFee, float64(0))
115}
116
117func TestUpdateRecommendedFee(t *testing.T) {
118 err := api.UpdateRecommendedFee()
119 assert.NoError(t, err)
120 assert.Greater(t, api.status.RecommendedFee.ExistingAccount, float64(0))
121 assert.Equal(t, api.status.RecommendedFee.CreatesAccount,
122 api.status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
123 assert.Equal(t, api.status.RecommendedFee.CreatesAccountAndRegister,
124 api.status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
125}
126
127func TestGetState(t *testing.T) {
128 lastBlock := tc.blocks[3]
129 lastBatchNum := common.BatchNum(3)
130 currentSlotNum := int64(1)
131 api.SetRollupVariables(tc.rollupVars)
132 api.SetWDelayerVariables(tc.wdelayerVars)
133 api.SetAuctionVariables(tc.auctionVars)
134 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
135 assert.NoError(t, err)
136 err = api.UpdateMetrics()
137 assert.NoError(t, err)
138 err = api.UpdateRecommendedFee()
139 assert.NoError(t, err)
140
141 endpoint := apiURL + "state"
142 var status testStatus
143
144 assert.NoError(t, doGoodReq("GET", endpoint, nil, &status))
145 assert.Equal(t, tc.rollupVars, status.Rollup)
146 assert.Equal(t, tc.auctionVars, status.Auction)
147 assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
148 assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
149 assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
150 assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
151 assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
152 assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(status.Network.NextForgers))
153 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
154 assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
155 assert.Greater(t, status.Metrics.TransactionsPerSecond, float64(0))
156 assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
157 assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
158 assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
159 assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
160 assert.Equal(t, status.RecommendedFee.CreatesAccount,
161 status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
162 assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
163 status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
164}