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 }