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