github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/powchain/block_cache_test.go (about)

     1  package powchain
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"github.com/ethereum/go-ethereum/common"
     8  	gethTypes "github.com/ethereum/go-ethereum/core/types"
     9  	"github.com/prysmaticlabs/prysm/beacon-chain/powchain/types"
    10  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    11  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    12  )
    13  
    14  func TestHashKeyFn_OK(t *testing.T) {
    15  	hInfo := &types.HeaderInfo{
    16  		Hash: common.HexToHash("0x0123456"),
    17  	}
    18  
    19  	key, err := hashKeyFn(hInfo)
    20  	require.NoError(t, err)
    21  	assert.Equal(t, hInfo.Hash.Hex(), key)
    22  }
    23  
    24  func TestHashKeyFn_InvalidObj(t *testing.T) {
    25  	_, err := hashKeyFn("bad")
    26  	assert.Equal(t, ErrNotAHeaderInfo, err)
    27  }
    28  
    29  func TestHeightKeyFn_OK(t *testing.T) {
    30  	hInfo := &types.HeaderInfo{
    31  		Number: big.NewInt(555),
    32  	}
    33  
    34  	key, err := heightKeyFn(hInfo)
    35  	require.NoError(t, err)
    36  	assert.Equal(t, hInfo.Number.String(), key)
    37  }
    38  
    39  func TestHeightKeyFn_InvalidObj(t *testing.T) {
    40  	_, err := heightKeyFn("bad")
    41  	assert.Equal(t, ErrNotAHeaderInfo, err)
    42  }
    43  
    44  func TestBlockCache_byHash(t *testing.T) {
    45  	cache := newHeaderCache()
    46  
    47  	header := &gethTypes.Header{
    48  		ParentHash: common.HexToHash("0x12345"),
    49  		Number:     big.NewInt(55),
    50  	}
    51  
    52  	exists, _, err := cache.HeaderInfoByHash(header.Hash())
    53  	require.NoError(t, err)
    54  	assert.Equal(t, false, exists, "Expected block info not to exist in empty cache")
    55  
    56  	err = cache.AddHeader(header)
    57  	require.NoError(t, err)
    58  
    59  	exists, fetchedInfo, err := cache.HeaderInfoByHash(header.Hash())
    60  	require.NoError(t, err)
    61  	assert.Equal(t, true, exists, "Expected headerInfo to exist")
    62  	assert.Equal(t, 0, fetchedInfo.Number.Cmp(header.Number), "Expected fetched info number to be equal")
    63  	assert.Equal(t, header.Hash(), fetchedInfo.Hash, "Expected hash to be equal")
    64  
    65  }
    66  
    67  func TestBlockCache_byHeight(t *testing.T) {
    68  	cache := newHeaderCache()
    69  
    70  	header := &gethTypes.Header{
    71  		ParentHash: common.HexToHash("0x12345"),
    72  		Number:     big.NewInt(55),
    73  	}
    74  
    75  	exists, _, err := cache.HeaderInfoByHeight(header.Number)
    76  	require.NoError(t, err)
    77  	assert.Equal(t, false, exists, "Expected block info not to exist in empty cache")
    78  
    79  	err = cache.AddHeader(header)
    80  	require.NoError(t, err)
    81  
    82  	exists, fetchedInfo, err := cache.HeaderInfoByHeight(header.Number)
    83  	require.NoError(t, err)
    84  	assert.Equal(t, true, exists, "Expected headerInfo to exist")
    85  
    86  	assert.Equal(t, 0, fetchedInfo.Number.Cmp(header.Number), "Expected fetched info number to be equal")
    87  	assert.Equal(t, header.Hash(), fetchedInfo.Hash, "Expected hash to be equal")
    88  
    89  }
    90  
    91  func TestBlockCache_maxSize(t *testing.T) {
    92  	cache := newHeaderCache()
    93  
    94  	for i := int64(0); i < int64(maxCacheSize+10); i++ {
    95  		header := &gethTypes.Header{
    96  			Number: big.NewInt(i),
    97  		}
    98  		err := cache.AddHeader(header)
    99  		require.NoError(t, err)
   100  
   101  	}
   102  
   103  	assert.Equal(t, int(maxCacheSize), len(cache.hashCache.ListKeys()))
   104  	assert.Equal(t, int(maxCacheSize), len(cache.heightCache.ListKeys()))
   105  }