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 LastBlock int64 `json:"lastBlock"`
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 TestNextForgers(t *testing.T) {
52 // It's assumed that bids for each slot will be received in increasing order
53 bestBids := make(map[int64]testBid)
54 for j := range tc.bids {
55 bestBids[tc.bids[j].SlotNum] = tc.bids[j]
56 }
57 lastBlock := tc.blocks[len(tc.blocks)-1]
58 for i := int64(0); i < tc.slots[len(tc.slots)-1].SlotNum; i++ {
59 lastClosedSlot := i + int64(api.status.Auction.ClosedAuctionSlots)
60 nextForgers, err := api.GetNextForgers(tc.blocks[len(tc.blocks)-1], i, lastClosedSlot)
61 assert.NoError(t, err)
62 for j := i; j <= lastClosedSlot; j++ {
63 for q := range nextForgers {
64 if nextForgers[q].Period.SlotNum == j {
65 if nextForgers[q].Coordinator.ItemID != 0 {
66 assert.Equal(t, bestBids[j].Bidder, nextForgers[q].Coordinator.Bidder)
67 } else {
68 assert.Equal(t, bootCoordinator.Bidder, nextForgers[q].Coordinator.Bidder)
69 }
70 firstBlockSlot, lastBlockSlot := api.getFirstLastBlock(j)
71 fromTimestamp := lastBlock.Timestamp.Add(time.Second * time.Duration(secondsPerBlock*(firstBlockSlot-lastBlock.EthBlockNum)))
72 toTimestamp := lastBlock.Timestamp.Add(time.Second * time.Duration(secondsPerBlock*(lastBlockSlot-lastBlock.EthBlockNum)))
73 assert.Equal(t, fromTimestamp.Unix(), nextForgers[q].Period.FromTimestamp.Unix())
74 assert.Equal(t, toTimestamp.Unix(), nextForgers[q].Period.ToTimestamp.Unix())
75 }
76 }
77 }
78 }
79}
80
81func TestUpdateNetworkInfo(t *testing.T) {
82 status := &Network{}
83 assert.Equal(t, status.LastBlock, api.status.Network.LastBlock)
84 assert.Equal(t, status.LastBatch.BatchNum, api.status.Network.LastBatch.BatchNum)
85 assert.Equal(t, status.CurrentSlot, api.status.Network.CurrentSlot)
86 assert.Equal(t, status.NextForgers, api.status.Network.NextForgers)
87 lastBlock := tc.blocks[3]
88 lastBatchNum := common.BatchNum(3)
89 currentSlotNum := int64(1)
90 err := api.UpdateNetworkInfo(lastBlock, lastBatchNum, currentSlotNum)
91 assert.NoError(t, err)
92 assert.Equal(t, lastBlock.EthBlockNum, api.status.Network.LastBlock)
93 assert.Equal(t, lastBatchNum, api.status.Network.LastBatch.BatchNum)
94 assert.Equal(t, currentSlotNum, api.status.Network.CurrentSlot)
95 assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(api.status.Network.NextForgers))
96}
97
98func TestUpdateMetrics(t *testing.T) {
99 // TODO: Improve checks when til is integrated
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, 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.TransactionsPerBatch, 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 TestGetStatus(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, 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.EthBlockNum, status.Network.LastBlock)
149 assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
150 assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
151 assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(status.Network.NextForgers))
152 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
153 assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
154 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
155 assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
156 assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
157 assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
158 assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
159 assert.Equal(t, status.RecommendedFee.CreatesAccount,
160 status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
161 assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
162 status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
163}