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	// TODO: Improve checks when til is integrated
101	// Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
102	lastBlock := tc.blocks[3]
103	lastBatchNum := common.BatchNum(3)
104	currentSlotNum := int64(1)
105	err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
106	assert.NoError(t, err)
107
108	err = api.UpdateMetrics()
109	assert.NoError(t, err)
110	assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
111	assert.Greater(t, api.status.Metrics.BatchFrequency, float64(0))
112	assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
113	assert.Greater(t, api.status.Metrics.TotalAccounts, int64(0))
114	assert.Greater(t, api.status.Metrics.TotalBJJs, int64(0))
115	assert.Greater(t, api.status.Metrics.AvgTransactionFee, float64(0))
116}
117
118func TestUpdateRecommendedFee(t *testing.T) {
119	err := api.UpdateRecommendedFee()
120	assert.NoError(t, err)
121	assert.Greater(t, api.status.RecommendedFee.ExistingAccount, float64(0))
122	assert.Equal(t, api.status.RecommendedFee.CreatesAccount,
123		api.status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
124	assert.Equal(t, api.status.RecommendedFee.CreatesAccountAndRegister,
125		api.status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
126}
127
128func TestGetState(t *testing.T) {
129	lastBlock := tc.blocks[3]
130	lastBatchNum := common.BatchNum(3)
131	currentSlotNum := int64(1)
132	api.SetRollupVariables(tc.rollupVars)
133	api.SetWDelayerVariables(tc.wdelayerVars)
134	api.SetAuctionVariables(tc.auctionVars)
135	err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
136	assert.NoError(t, err)
137	err = api.UpdateMetrics()
138	assert.NoError(t, err)
139	err = api.UpdateRecommendedFee()
140	assert.NoError(t, err)
141
142	endpoint := apiURL + "state"
143	var status testStatus
144
145	assert.NoError(t, doGoodReq("GET", endpoint, nil, &status))
146	assert.Equal(t, tc.rollupVars, status.Rollup)
147	assert.Equal(t, tc.auctionVars, status.Auction)
148	assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
149	assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
150	assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
151	assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
152	assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
153	assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(status.Network.NextForgers))
154	assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
155	assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
156	assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
157	assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
158	assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
159	assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
160	assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
161	assert.Equal(t, status.RecommendedFee.CreatesAccount,
162		status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
163	assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
164		status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
165}