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/apitypes"
  8	"github.com/hermeznetwork/hermez-node/common"
  9	"github.com/hermeznetwork/hermez-node/db/historydb"
 10	"github.com/stretchr/testify/assert"
 11	"github.com/stretchr/testify/require"
 12)
 13
 14type testStatus struct {
 15	Network           testNetwork                  `json:"network"`
 16	Metrics           historydb.Metrics            `json:"metrics"`
 17	Rollup            historydb.RollupVariablesAPI `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	assertEqualRollupVariables(t, *rollupVars, api.status.Rollup, true)
 34	api.SetRollupVariables(tc.rollupVars)
 35	assertEqualRollupVariables(t, tc.rollupVars, api.status.Rollup, true)
 36}
 37
 38func assertEqualRollupVariables(t *testing.T, rollupVariables common.RollupVariables, apiVariables historydb.RollupVariablesAPI, checkBuckets bool) {
 39	assert.Equal(t, apitypes.NewBigIntStr(rollupVariables.FeeAddToken), apiVariables.FeeAddToken)
 40	assert.Equal(t, rollupVariables.ForgeL1L2BatchTimeout, apiVariables.ForgeL1L2BatchTimeout)
 41	assert.Equal(t, rollupVariables.WithdrawalDelay, apiVariables.WithdrawalDelay)
 42	assert.Equal(t, rollupVariables.SafeMode, apiVariables.SafeMode)
 43	if checkBuckets {
 44		for i, bucket := range rollupVariables.Buckets {
 45			assert.Equal(t, apitypes.NewBigIntStr(bucket.BlockWithdrawalRate), apiVariables.Buckets[i].BlockWithdrawalRate)
 46			assert.Equal(t, apitypes.NewBigIntStr(bucket.CeilUSD), apiVariables.Buckets[i].CeilUSD)
 47			assert.Equal(t, apitypes.NewBigIntStr(bucket.MaxWithdrawals), apiVariables.Buckets[i].MaxWithdrawals)
 48			assert.Equal(t, apitypes.NewBigIntStr(bucket.Withdrawals), apiVariables.Buckets[i].Withdrawals)
 49		}
 50	}
 51}
 52
 53func TestSetWDelayerVariables(t *testing.T) {
 54	wdelayerVars := &common.WDelayerVariables{}
 55	assert.Equal(t, *wdelayerVars, api.status.WithdrawalDelayer)
 56	api.SetWDelayerVariables(tc.wdelayerVars)
 57	assert.Equal(t, tc.wdelayerVars, api.status.WithdrawalDelayer)
 58}
 59
 60func TestSetAuctionVariables(t *testing.T) {
 61	auctionVars := &common.AuctionVariables{}
 62	assert.Equal(t, *auctionVars, api.status.Auction)
 63	api.SetAuctionVariables(tc.auctionVars)
 64	assert.Equal(t, tc.auctionVars, api.status.Auction)
 65}
 66
 67func TestUpdateNetworkInfo(t *testing.T) {
 68	status := &Network{}
 69	assert.Equal(t, status.LastSyncBlock, api.status.Network.LastSyncBlock)
 70	assert.Equal(t, status.LastBatch, api.status.Network.LastBatch)
 71	assert.Equal(t, status.CurrentSlot, api.status.Network.CurrentSlot)
 72	assert.Equal(t, status.NextForgers, api.status.Network.NextForgers)
 73	lastBlock := tc.blocks[3]
 74	lastBatchNum := common.BatchNum(3)
 75	currentSlotNum := int64(1)
 76
 77	// Generate some bucket_update data
 78	bucketUpdates := []common.BucketUpdate{
 79		{
 80			EthBlockNum: 4,
 81			NumBucket:   0,
 82			BlockStamp:  4,
 83			Withdrawals: big.NewInt(123),
 84		},
 85		{
 86			EthBlockNum: 5,
 87			NumBucket:   2,
 88			BlockStamp:  5,
 89			Withdrawals: big.NewInt(42),
 90		},
 91		{
 92			EthBlockNum: 5,
 93			NumBucket:   2, // Repeated bucket
 94			BlockStamp:  5,
 95			Withdrawals: big.NewInt(43),
 96		},
 97	}
 98	err := api.h.AddBucketUpdatesTest(api.h.DB(), bucketUpdates)
 99	require.NoError(t, err)
100
101	err = api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
102	assert.NoError(t, err)
103	assert.Equal(t, lastBlock.Num, api.status.Network.LastSyncBlock)
104	assert.Equal(t, lastBatchNum, api.status.Network.LastBatch.BatchNum)
105	assert.Equal(t, currentSlotNum, api.status.Network.CurrentSlot)
106	assert.Equal(t, int(api.status.Auction.ClosedAuctionSlots)+1, len(api.status.Network.NextForgers))
107	assert.Equal(t, api.status.Rollup.Buckets[0].Withdrawals, apitypes.NewBigIntStr(big.NewInt(123)))
108	assert.Equal(t, api.status.Rollup.Buckets[2].Withdrawals, apitypes.NewBigIntStr(big.NewInt(43)))
109}
110
111func TestUpdateMetrics(t *testing.T) {
112	// Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
113	lastBlock := tc.blocks[3]
114	lastBatchNum := common.BatchNum(3)
115	currentSlotNum := int64(1)
116	err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
117	assert.NoError(t, err)
118
119	err = api.UpdateMetrics()
120	assert.NoError(t, err)
121	assert.Greater(t, api.status.Metrics.TransactionsPerBatch, float64(0))
122	assert.Greater(t, api.status.Metrics.BatchFrequency, float64(0))
123	assert.Greater(t, api.status.Metrics.TransactionsPerSecond, float64(0))
124	assert.Greater(t, api.status.Metrics.TotalAccounts, int64(0))
125	assert.Greater(t, api.status.Metrics.TotalBJJs, int64(0))
126	assert.Greater(t, api.status.Metrics.AvgTransactionFee, float64(0))
127}
128
129func TestUpdateRecommendedFee(t *testing.T) {
130	err := api.UpdateRecommendedFee()
131	assert.NoError(t, err)
132	assert.Greater(t, api.status.RecommendedFee.ExistingAccount, float64(0))
133	assert.Equal(t, api.status.RecommendedFee.CreatesAccount,
134		api.status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
135	assert.Equal(t, api.status.RecommendedFee.CreatesAccountAndRegister,
136		api.status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
137}
138
139func TestGetState(t *testing.T) {
140	lastBlock := tc.blocks[3]
141	lastBatchNum := common.BatchNum(3)
142	currentSlotNum := int64(1)
143	api.SetRollupVariables(tc.rollupVars)
144	api.SetWDelayerVariables(tc.wdelayerVars)
145	api.SetAuctionVariables(tc.auctionVars)
146	err := api.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
147	assert.NoError(t, err)
148	err = api.UpdateMetrics()
149	assert.NoError(t, err)
150	err = api.UpdateRecommendedFee()
151	assert.NoError(t, err)
152
153	endpoint := apiURL + "state"
154	var status testStatus
155
156	assert.NoError(t, doGoodReq("GET", endpoint, nil, &status))
157
158	// SC vars
159	// UpdateNetworkInfo will overwrite buckets withdrawal values
160	// So they won't be checked here, they are checked at
161	// TestUpdateNetworkInfo
162	assertEqualRollupVariables(t, tc.rollupVars, status.Rollup, false)
163	assert.Equal(t, tc.auctionVars, status.Auction)
164	assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
165	// Network
166	assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
167	assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
168	// TODO: assert all the batch, not just the batch num
169	assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
170	assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
171	assertNextForgers(t, tc.nextForgers, status.Network.NextForgers)
172	// Metrics
173	// TODO: perform real asserts (not just greater than 0)
174	assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
175	assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
176	assert.Greater(t, status.Metrics.TransactionsPerSecond, float64(0))
177	assert.Greater(t, status.Metrics.TotalAccounts, int64(0))
178	assert.Greater(t, status.Metrics.TotalBJJs, int64(0))
179	assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
180	// Recommended fee
181	// TODO: perform real asserts (not just greater than 0)
182	assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
183	assert.Equal(t, status.RecommendedFee.CreatesAccount,
184		status.RecommendedFee.ExistingAccount*createAccountExtraFeePercentage)
185	assert.Equal(t, status.RecommendedFee.CreatesAccountAndRegister,
186		status.RecommendedFee.ExistingAccount*createAccountInternalExtraFeePercentage)
187}
188
189func assertNextForgers(t *testing.T, expected, actual []NextForger) {
190	assert.Equal(t, len(expected), len(actual))
191	for i := range expected {
192		// ignore timestamps and other metadata
193		actual[i].Period.FromTimestamp = expected[i].Period.FromTimestamp
194		actual[i].Period.ToTimestamp = expected[i].Period.ToTimestamp
195		actual[i].Coordinator.ItemID = expected[i].Coordinator.ItemID
196		actual[i].Coordinator.EthBlockNum = expected[i].Coordinator.EthBlockNum
197		assert.Equal(t, expected[i], actual[i])
198	}
199}