github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/kv/genesis_test.go (about)

     1  package kv
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/bazelbuild/rules_go/go/tools/bazel"
     9  	"github.com/prysmaticlabs/prysm/beacon-chain/db/iface"
    10  	"github.com/prysmaticlabs/prysm/shared/params"
    11  	"github.com/prysmaticlabs/prysm/shared/testutil"
    12  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    13  )
    14  
    15  func TestStore_SaveGenesisData(t *testing.T) {
    16  	ctx := context.Background()
    17  	db := setupDB(t)
    18  
    19  	gs, err := testutil.NewBeaconState()
    20  	assert.NoError(t, err)
    21  
    22  	assert.NoError(t, db.SaveGenesisData(ctx, gs))
    23  
    24  	testGenesisDataSaved(t, db)
    25  }
    26  
    27  func testGenesisDataSaved(t *testing.T, db iface.Database) {
    28  	ctx := context.Background()
    29  
    30  	gb, err := db.GenesisBlock(ctx)
    31  	assert.NoError(t, err)
    32  	assert.NotNil(t, gb)
    33  
    34  	gbHTR, err := gb.Block().HashTreeRoot()
    35  	assert.NoError(t, err)
    36  
    37  	gss, err := db.StateSummary(ctx, gbHTR)
    38  	assert.NoError(t, err)
    39  	assert.NotNil(t, gss)
    40  
    41  	head, err := db.HeadBlock(ctx)
    42  	assert.NoError(t, err)
    43  	assert.NotNil(t, head)
    44  
    45  	headHTR, err := head.Block().HashTreeRoot()
    46  	assert.NoError(t, err)
    47  	assert.Equal(t, gbHTR, headHTR, "head block does not match genesis block")
    48  }
    49  
    50  func TestLoadGenesisFromFile(t *testing.T) {
    51  	fp := "testdata/mainnet.genesis.ssz"
    52  	rfp, err := bazel.Runfile(fp)
    53  	if err == nil {
    54  		fp = rfp
    55  	}
    56  
    57  	r, err := os.Open(fp)
    58  	assert.NoError(t, err)
    59  	defer func() {
    60  		assert.NoError(t, r.Close())
    61  	}()
    62  
    63  	db := setupDB(t)
    64  	assert.NoError(t, db.LoadGenesis(context.Background(), r))
    65  	testGenesisDataSaved(t, db)
    66  
    67  	// Loading the same genesis again should not throw an error
    68  	_, err = r.Seek(0, 0)
    69  	assert.NoError(t, err)
    70  	assert.NoError(t, db.LoadGenesis(context.Background(), r))
    71  }
    72  
    73  func TestLoadGenesisFromFile_mismatchedForkVersion(t *testing.T) {
    74  	fp := "testdata/altona.genesis.ssz"
    75  	rfp, err := bazel.Runfile(fp)
    76  	if err == nil {
    77  		fp = rfp
    78  	}
    79  	r, err := os.Open(fp)
    80  	assert.NoError(t, err)
    81  	defer func() {
    82  		assert.NoError(t, r.Close())
    83  	}()
    84  
    85  	// Loading a genesis with the wrong fork version as beacon config should throw an error.
    86  	db := setupDB(t)
    87  	assert.ErrorContains(t, "does not match config genesis fork version", db.LoadGenesis(context.Background(), r))
    88  }
    89  
    90  func TestEnsureEmbeddedGenesis(t *testing.T) {
    91  	// Embedded Genesis works with Mainnet config
    92  	params.SetupTestConfigCleanup(t)
    93  	cfg := params.BeaconConfig()
    94  	cfg.ConfigName = params.ConfigNames[params.Mainnet]
    95  	params.OverrideBeaconConfig(cfg)
    96  
    97  	ctx := context.Background()
    98  	db := setupDB(t)
    99  
   100  	gb, err := db.GenesisBlock(ctx)
   101  	assert.NoError(t, err)
   102  	if gb != nil && !gb.IsNil() {
   103  		t.Fatal("Genesis block exists already")
   104  	}
   105  
   106  	gs, err := db.GenesisState(ctx)
   107  	assert.NoError(t, err)
   108  	assert.NotNil(t, gs, "an embedded genesis state does not exist")
   109  
   110  	assert.NoError(t, db.EnsureEmbeddedGenesis(ctx))
   111  
   112  	gb, err = db.GenesisBlock(ctx)
   113  	assert.NoError(t, err)
   114  	assert.NotNil(t, gb)
   115  
   116  	testGenesisDataSaved(t, db)
   117  }