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