hermez-node/api/state_test.go
api/state_test.goRaw
1package api
2
3import (
4 "testing"
5
6 "github.com/hermeznetwork/hermez-node/common"
7 "github.com/hermeznetwork/hermez-node/db/historydb"
8 "github.com/stretchr/testify/assert"
9)
10
11type testStatus struct {
12 Network testNetwork `json:"network"`
13 Metrics historydb.Metrics `json:"metrics"`
14 Rollup common.RollupVariables `json:"rollup"`
15 Auction common.AuctionVariables `json:"auction"`
16 WithdrawalDelayer common.WDelayerVariables `json:"withdrawalDelayer"`
17 RecommendedFee common.RecommendedFee `json:"recommendedFee"`
18}
19
20type testNetwork struct {
21 LastEthBlock int64 `json:"lastEthereumBlock"`
22 LastSyncBlock int64 `json:"lastSynchedBlock"`
23 LastBatch testBatch `json:"lastBatch"`
24 CurrentSlot int64 `json:"currentSlot"`
25 NextForgers []NextForger `json:"nextForgers"`
26}
27
28func TestSetRollupVariables(t *testing.T) {
29 rollupVars := &common.RollupVariables{}
30 assert.Equal(t, *rollupVars, api.status.Rollup)
31 api.SetRollupVariables(tc.rollupVars)
32 assert.Equal(t, tc.rollupVars, api.status.Rollup)
33}
34
35func TestSetWDelayerVariables(t *testing.T) {
36 wdelayerVars := &common.WDelayerVariables{}
37 assert.Equal(t, *wdelayerVars, api.status.WithdrawalDelayer)
38 api.SetWDelayerVariables(tc.wdelayerVars)
39 assert.Equal(t, tc.wdelayerVars, api.status.WithdrawalDelayer)
40}
41
42func TestSetAuctionVariables(t *testing.T) {
43 auctionVars := &common.AuctionVariables{}
44 assert.Equal(t, *auctionVars, api.status.Auction)
45 api.SetAuctionVariables(tc.auctionVars)
46 assert.Equal(t, tc.auctionVars, api.status.Auction)
47}
48
49func TestUpdateNetworkInfo(t *testing.T) {
50 status := &Network{}
51 assert.Equal(t, status.LastSyncBlock, api.status.Network.LastSyncBlock)
52 assert.Equal(t, status.LastBatch, api.status.Network.LastBatch)
53 assert.Equal(t, status.CurrentSlot, api.status.Network.CurrentSlot)
54 assert.Equal(t, status.NextForgers, api.status.Network.NextForgers)
55 lastBlock := tc.blocks[3]
56 lastBatchNum := common.BatchNum(3)
57 currentSlotNum := int64(1)
58 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
59 assert.NoError(t, err)
60 assert.Equal(t, lastBlock.Num, api.status.Network.LastSyncBlock)
61 assert.Equal(t, lastBatchNum, api.status.Network.LastBatch.BatchNum)
62 assert.Equal(t, currentSlotNum, api.status.Network.CurrentSlot)
63 assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(api.status.Network.NextForgers))
64}
65
66func TestUpdateMetrics(t *testing.T) {
67 // TODO: Improve checks when til is integrated
68 // Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
69 lastBlock := tc.blocks[3]
70 lastBatchNum := common.BatchNum(3)
71 currentSlotNum := int64(1)
72 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
73 assert.NoError(t, err)
74
75 err = api.UpdateMetrics()
76 assert.NoError(t, err)
77 assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
78 assert.Greater(t, api.status.Metrics.BatchFrequency, float64(0))
79 assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
80 assert.Greater(t, api.status.Metrics.TotalAccounts, int64(0))
81 assert.Greater(t, api.status.Metrics.TotalBJJs, int64(0))
82 assert.Greater(t, api.status.Metrics.AvgTransactionFee, float64(0))
83}
84
85func TestUpdateRecommendedFee(t *testing.T) {
86 err := api.UpdateRecommendedFee()
87 assert.NoError(t, err)
88 assert.Greater(t, api.status.RecommendedFee.ExistingAccount, float64(0))
89 assert.Equal(t, api.status.RecommendedFee.CreatesAccount,
90 api.status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
91 assert.Equal(t, api.status.RecommendedFee.CreatesAccountAndRegister,
92 api.status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
93}
94
95func TestGetState(t *testing.T) {
96 lastBlock := tc.blocks[3]
97 lastBatchNum := common.BatchNum(3)
98 currentSlotNum := int64(1)
99 api.SetRollupVariables(tc.rollupVars)
100 api.SetWDelayerVariables(tc.wdelayerVars)
101 api.SetAuctionVariables(tc.auctionVars)
102 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
103 assert.NoError(t, err)
104 err = api.UpdateMetrics()
105 assert.NoError(t, err)
106 err = api.UpdateRecommendedFee()
107 assert.NoError(t, err)
108
109 endpoint := apiURL + "state"
110 var status testStatus
111
112 assert.NoError(t, doGoodReq("GET", endpoint, nil, &status))
113
114 // SC vars
115 assert.Equal(t, tc.rollupVars, status.Rollup)
116 assert.Equal(t, tc.auctionVars, status.Auction)
117 assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
118 // Network
119 assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
120 assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
121 // TODO: assert all the batch, not just the batch num
122 assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
123 assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
124 assertNextForgers(t, tc.nextForgers, status.Network.NextForgers)
125 // Metrics
126 // TODO: perform real asserts (not just greater than 0)
127 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
128 assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
129 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
130 assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
131 assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
132 assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
133 // Recommended fee
134 // TODO: perform real asserts (not just greater than 0)
135 assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
136 assert.Equal(t, status.RecommendedFee.CreatesAccount,
137 status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
138 assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
139 status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
140}
141
142func assertNextForgers(t *testing.T, expected, actual []NextForger) {
143 assert.Equal(t, len(expected), len(actual))
144 for i := range expected {
145 // ignore timestamps and other metadata
146 actual[i].Period.FromTimestamp = expected[i].Period.FromTimestamp
147 actual[i].Period.ToTimestamp = expected[i].Period.ToTimestamp
148 actual[i].Coordinator.ItemID = expected[i].Coordinator.ItemID
149 actual[i].Coordinator.EthBlockNum = expected[i].Coordinator.EthBlockNum
150 assert.Equal(t, expected[i], actual[i])
151 }
152}