arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/api/state_test.go
api/state_test.goRaw
  1package api
  2
  3import (
  4	"math/big"
  5	"testing"
  6
  7	"github.com/hermeznetwork/hermez-node/common"
  8	"github.com/hermeznetwork/hermez-node/db/historydb"
  9	"github.com/stretchr/testify/assert"
 10	"github.com/stretchr/testify/require"
 11)
 12
 13type testStatus struct {
 14	Network           testNetwork              `json:"network"`
 15	Metrics           historydb.Metrics        `json:"metrics"`
 16	Rollup            common.RollupVariables   `json:"rollup"`
 17	Auction           common.AuctionVariables  `json:"auction"`
 18	WithdrawalDelayer common.WDelayerVariables `json:"withdrawalDelayer"`
 19	RecommendedFee    common.RecommendedFee    `json:"recommendedFee"`
 20}
 21
 22type testNetwork struct {
 23	LastEthBlock  int64        `json:"lastEthereumBlock"`
 24	LastSyncBlock int64        `json:"lastSynchedBlock"`
 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 TestUpdateNetworkInfo(t *testing.T) {
 52	status := &Network{}
 53	assert.Equal(t, status.LastSyncBlock, api.status.Network.LastSyncBlock)
 54	assert.Equal(t, status.LastBatch, api.status.Network.LastBatch)
 55	assert.Equal(t, status.CurrentSlot, api.status.Network.CurrentSlot)
 56	assert.Equal(t, status.NextForgers, api.status.Network.NextForgers)
 57	lastBlock := tc.blocks[3]
 58	lastBatchNum := common.BatchNum(3)
 59	currentSlotNum := int64(1)
 60
 61	// Generate some bucket_update data
 62	bucketUpdates := []common.BucketUpdate{
 63		{
 64			EthBlockNum: 4,
 65			NumBucket:   0,
 66			BlockStamp:  4,
 67			Withdrawals: big.NewInt(123),
 68		},
 69		{
 70			EthBlockNum: 5,
 71			NumBucket:   2,
 72			BlockStamp:  5,
 73			Withdrawals: big.NewInt(42),
 74		},
 75		{
 76			EthBlockNum: 5,
 77			NumBucket:   2, // Repeated bucket
 78			BlockStamp:  5,
 79			Withdrawals: big.NewInt(43),
 80		},
 81	}
 82	err := api.h.AddBucketUpdatesTest(api.h.DB(), bucketUpdates)
 83	require.NoError(t, err)
 84
 85	err = api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
 86	assert.NoError(t, err)
 87	assert.Equal(t, lastBlock.Num, api.status.Network.LastSyncBlock)
 88	assert.Equal(t, lastBatchNum, api.status.Network.LastBatch.BatchNum)
 89	assert.Equal(t, currentSlotNum, api.status.Network.CurrentSlot)
 90	assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(api.status.Network.NextForgers))
 91	assert.Equal(t, api.status.Rollup.Buckets[0].Withdrawals, big.NewInt(123))
 92	assert.Equal(t, api.status.Rollup.Buckets[2].Withdrawals, big.NewInt(43))
 93}
 94
 95func TestUpdateMetrics(t *testing.T) {
 96	// Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
 97	lastBlock := tc.blocks[3]
 98	lastBatchNum := common.BatchNum(3)
 99	currentSlotNum := int64(1)
100	err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
101	assert.NoError(t, err)
102
103	err = api.UpdateMetrics()
104	assert.NoError(t, err)
105	assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
106	assert.Greater(t, api.status.Metrics.BatchFrequency, float64(0))
107	assert.Greater(t, api.status.Metrics.TransactionsPerSecond, float64(0))
108	assert.Greater(t, api.status.Metrics.TotalAccounts, int64(0))
109	assert.Greater(t, api.status.Metrics.TotalBJJs, int64(0))
110	assert.Greater(t, api.status.Metrics.AvgTransactionFee, float64(0))
111}
112
113func TestUpdateRecommendedFee(t *testing.T) {
114	err := api.UpdateRecommendedFee()
115	assert.NoError(t, err)
116	assert.Greater(t, api.status.RecommendedFee.ExistingAccount, float64(0))
117	assert.Equal(t, api.status.RecommendedFee.CreatesAccount,
118		api.status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
119	assert.Equal(t, api.status.RecommendedFee.CreatesAccountAndRegister,
120		api.status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
121}
122
123func TestGetState(t *testing.T) {
124	lastBlock := tc.blocks[3]
125	lastBatchNum := common.BatchNum(3)
126	currentSlotNum := int64(1)
127	api.SetRollupVariables(tc.rollupVars)
128	api.SetWDelayerVariables(tc.wdelayerVars)
129	api.SetAuctionVariables(tc.auctionVars)
130	err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
131	assert.NoError(t, err)
132	err = api.UpdateMetrics()
133	assert.NoError(t, err)
134	err = api.UpdateRecommendedFee()
135	assert.NoError(t, err)
136
137	endpoint := apiURL + "state"
138	var status testStatus
139
140	assert.NoError(t, doGoodReq("GET", endpoint, nil, &status))
141
142	// SC vars
143	// UpdateNetworkInfo will overwrite buckets withdrawal values
144	// So we restore them before comparing, they are checked at
145	// TestUpdateNetworkInfo
146	status.Rollup.Buckets = tc.rollupVars.Buckets
147	assert.Equal(t, tc.rollupVars, status.Rollup)
148	assert.Equal(t, tc.auctionVars, status.Auction)
149	assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
150	// Network
151	assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
152	assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
153	// TODO: assert all the batch, not just the batch num
154	assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
155	assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
156	assertNextForgers(t, tc.nextForgers, status.Network.NextForgers)
157	// Metrics
158	// TODO: perform real asserts (not just greater than 0)
159	assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
160	assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
161	assert.Greater(t, status.Metrics.TransactionsPerSecond, float64(0))
162	assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
163	assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
164	assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
165	// Recommended fee
166	// TODO: perform real asserts (not just greater than 0)
167	assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
168	assert.Equal(t, status.RecommendedFee.CreatesAccount,
169		status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
170	assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
171		status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
172}
173
174func assertNextForgers(t *testing.T, expected, actual []NextForger) {
175	assert.Equal(t, len(expected), len(actual))
176	for i := range expected {
177		// ignore timestamps and other metadata
178		actual[i].Period.FromTimestamp = expected[i].Period.FromTimestamp
179		actual[i].Period.ToTimestamp = expected[i].Period.ToTimestamp
180		actual[i].Coordinator.ItemID = expected[i].Coordinator.ItemID
181		actual[i].Coordinator.EthBlockNum = expected[i].Coordinator.EthBlockNum
182		assert.Equal(t, expected[i], actual[i])
183	}
184}