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	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}