arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
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}