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 // Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
68 lastBlock := tc.blocks[3]
69 lastBatchNum := common.BatchNum(3)
70 currentSlotNum := int64(1)
71 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
72 assert.NoError(t, err)
73
74 err = api.UpdateMetrics()
75 assert.NoError(t, err)
76 assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
77 assert.Greater(t, api.status.Metrics.BatchFrequency, float64(0))
78 assert.Greater(t, api.status.Metrics.TransactionsPerSecond, float64(0))
79 assert.Greater(t, api.status.Metrics.TotalAccounts, int64(0))
80 assert.Greater(t, api.status.Metrics.TotalBJJs, int64(0))
81 assert.Greater(t, api.status.Metrics.AvgTransactionFee, float64(0))
82}
83
84func TestUpdateRecommendedFee(t *testing.T) {
85 err := api.UpdateRecommendedFee()
86 assert.NoError(t, err)
87 assert.Greater(t, api.status.RecommendedFee.ExistingAccount, float64(0))
88 assert.Equal(t, api.status.RecommendedFee.CreatesAccount,
89 api.status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
90 assert.Equal(t, api.status.RecommendedFee.CreatesAccountAndRegister,
91 api.status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
92}
93
94func TestGetState(t *testing.T) {
95 lastBlock := tc.blocks[3]
96 lastBatchNum := common.BatchNum(3)
97 currentSlotNum := int64(1)
98 api.SetRollupVariables(tc.rollupVars)
99 api.SetWDelayerVariables(tc.wdelayerVars)
100 api.SetAuctionVariables(tc.auctionVars)
101 err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
102 assert.NoError(t, err)
103 err = api.UpdateMetrics()
104 assert.NoError(t, err)
105 err = api.UpdateRecommendedFee()
106 assert.NoError(t, err)
107
108 endpoint := apiURL + "state"
109 var status testStatus
110
111 assert.NoError(t, doGoodReq("GET", endpoint, nil, &status))
112
113 // SC vars
114 assert.Equal(t, tc.rollupVars, status.Rollup)
115 assert.Equal(t, tc.auctionVars, status.Auction)
116 assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
117 // Network
118 assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
119 assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
120 // TODO: assert all the batch, not just the batch num
121 assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
122 assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
123 assertNextForgers(t, tc.nextForgers, status.Network.NextForgers)
124 // Metrics
125 // TODO: perform real asserts (not just greater than 0)
126 assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
127 assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
128 assert.Greater(t, status.Metrics.TransactionsPerSecond, float64(0))
129 assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
130 assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
131 assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
132 // Recommended fee
133 // TODO: perform real asserts (not just greater than 0)
134 assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
135 assert.Equal(t, status.RecommendedFee.CreatesAccount,
136 status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
137 assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
138 status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
139}
140
141func assertNextForgers(t *testing.T, expected, actual []NextForger) {
142 assert.Equal(t, len(expected), len(actual))
143 for i := range expected {
144 // ignore timestamps and other metadata
145 actual[i].Period.FromTimestamp = expected[i].Period.FromTimestamp
146 actual[i].Period.ToTimestamp = expected[i].Period.ToTimestamp
147 actual[i].Coordinator.ItemID = expected[i].Coordinator.ItemID
148 actual[i].Coordinator.EthBlockNum = expected[i].Coordinator.EthBlockNum
149 assert.Equal(t, expected[i], actual[i])
150 }
151}