github.com/MetalBlockchain/subnet-evm@v0.4.9/eth/gasprice/fee_info_provider_test.go (about)

     1  // (c) 2022, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package gasprice
     5  
     6  import (
     7  	"context"
     8  	"math/big"
     9  	"sync"
    10  	"testing"
    11  
    12  	"github.com/MetalBlockchain/subnet-evm/core"
    13  	"github.com/MetalBlockchain/subnet-evm/core/types"
    14  	"github.com/MetalBlockchain/subnet-evm/params"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestFeeInfoProvider(t *testing.T) {
    19  	backend := newTestBackend(t, params.TestChainConfig, 2, testGenBlock(t, 55, 370))
    20  	f, err := newFeeInfoProvider(backend, 1, 2)
    21  	require.NoError(t, err)
    22  
    23  	// check that accepted event was subscribed
    24  	require.NotNil(t, backend.acceptedEvent)
    25  
    26  	// check fee infos were cached
    27  	require.Equal(t, 2, f.cache.Len())
    28  
    29  	// some block that extends the current chain
    30  	var wg sync.WaitGroup
    31  	wg.Add(1)
    32  	f.newHeaderAdded = func() { wg.Done() }
    33  	header := &types.Header{Number: big.NewInt(3), ParentHash: backend.LastAcceptedBlock().Hash()}
    34  	block := types.NewBlockWithHeader(header)
    35  	backend.acceptedEvent <- core.ChainEvent{Block: block}
    36  
    37  	// wait for the event to process before validating the new header was added.
    38  	wg.Wait()
    39  	feeInfo, ok := f.get(3)
    40  	require.True(t, ok)
    41  	require.NotNil(t, feeInfo)
    42  }
    43  
    44  func TestFeeInfoProviderCacheSize(t *testing.T) {
    45  	size := 5
    46  	overflow := 3
    47  	backend := newTestBackend(t, params.TestChainConfig, 0, testGenBlock(t, 55, 370))
    48  	f, err := newFeeInfoProvider(backend, 1, size)
    49  	require.NoError(t, err)
    50  
    51  	// add [overflow] more elements than what will fit in the cache
    52  	// to test eviction behavior.
    53  	for i := 0; i < size+feeCacheExtraSlots+overflow; i++ {
    54  		header := &types.Header{Number: big.NewInt(int64(i))}
    55  		_, err := f.addHeader(context.Background(), header)
    56  		require.NoError(t, err)
    57  	}
    58  
    59  	// these numbers should be evicted
    60  	for i := 0; i < overflow; i++ {
    61  		feeInfo, ok := f.get(uint64(i))
    62  		require.False(t, ok)
    63  		require.Nil(t, feeInfo)
    64  	}
    65  
    66  	// these numbers should be present
    67  	for i := overflow; i < size+feeCacheExtraSlots+overflow; i++ {
    68  		feeInfo, ok := f.get(uint64(i))
    69  		require.True(t, ok)
    70  		require.NotNil(t, feeInfo)
    71  	}
    72  }