github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/kv/backup_test.go (about) 1 package kv 2 3 import ( 4 "context" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "testing" 9 10 types "github.com/prysmaticlabs/eth2-types" 11 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper" 12 "github.com/prysmaticlabs/prysm/shared/testutil" 13 "github.com/prysmaticlabs/prysm/shared/testutil/require" 14 ) 15 16 func TestStore_Backup(t *testing.T) { 17 db, err := NewKVStore(context.Background(), t.TempDir(), &Config{}) 18 require.NoError(t, err, "Failed to instantiate DB") 19 ctx := context.Background() 20 21 head := testutil.NewBeaconBlock() 22 head.Block.Slot = 5000 23 24 require.NoError(t, db.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(head))) 25 root, err := head.Block.HashTreeRoot() 26 require.NoError(t, err) 27 st, err := testutil.NewBeaconState() 28 require.NoError(t, err) 29 require.NoError(t, db.SaveState(ctx, st, root)) 30 require.NoError(t, db.SaveHeadBlockRoot(ctx, root)) 31 32 require.NoError(t, db.Backup(ctx, "", false)) 33 34 backupsPath := filepath.Join(db.databasePath, backupsDirectoryName) 35 files, err := ioutil.ReadDir(backupsPath) 36 require.NoError(t, err) 37 require.NotEqual(t, 0, len(files), "No backups created") 38 require.NoError(t, db.Close(), "Failed to close database") 39 40 oldFilePath := filepath.Join(backupsPath, files[0].Name()) 41 newFilePath := filepath.Join(backupsPath, DatabaseFileName) 42 // We rename the file to match the database file name 43 // our NewKVStore function expects when opening a database. 44 require.NoError(t, os.Rename(oldFilePath, newFilePath)) 45 46 backedDB, err := NewKVStore(ctx, backupsPath, &Config{}) 47 require.NoError(t, err, "Failed to instantiate DB") 48 t.Cleanup(func() { 49 require.NoError(t, backedDB.Close(), "Failed to close database") 50 }) 51 require.Equal(t, true, backedDB.HasState(ctx, root)) 52 } 53 54 func TestStore_BackupMultipleBuckets(t *testing.T) { 55 db, err := NewKVStore(context.Background(), t.TempDir(), &Config{}) 56 require.NoError(t, err, "Failed to instantiate DB") 57 ctx := context.Background() 58 59 startSlot := types.Slot(5000) 60 61 for i := startSlot; i < 5200; i++ { 62 head := testutil.NewBeaconBlock() 63 head.Block.Slot = i 64 require.NoError(t, db.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(head))) 65 root, err := head.Block.HashTreeRoot() 66 require.NoError(t, err) 67 st, err := testutil.NewBeaconState() 68 require.NoError(t, st.SetSlot(i)) 69 require.NoError(t, err) 70 require.NoError(t, db.SaveState(ctx, st, root)) 71 require.NoError(t, db.SaveHeadBlockRoot(ctx, root)) 72 } 73 74 require.NoError(t, db.Backup(ctx, "", false)) 75 76 backupsPath := filepath.Join(db.databasePath, backupsDirectoryName) 77 files, err := ioutil.ReadDir(backupsPath) 78 require.NoError(t, err) 79 require.NotEqual(t, 0, len(files), "No backups created") 80 require.NoError(t, db.Close(), "Failed to close database") 81 82 oldFilePath := filepath.Join(backupsPath, files[0].Name()) 83 newFilePath := filepath.Join(backupsPath, DatabaseFileName) 84 // We rename the file to match the database file name 85 // our NewKVStore function expects when opening a database. 86 require.NoError(t, os.Rename(oldFilePath, newFilePath)) 87 88 backedDB, err := NewKVStore(ctx, backupsPath, &Config{}) 89 require.NoError(t, err, "Failed to instantiate DB") 90 t.Cleanup(func() { 91 require.NoError(t, backedDB.Close(), "Failed to close database") 92 }) 93 for i := startSlot; i < 5200; i++ { 94 head := testutil.NewBeaconBlock() 95 head.Block.Slot = i 96 root, err := head.Block.HashTreeRoot() 97 require.NoError(t, err) 98 nBlock, err := backedDB.Block(ctx, root) 99 require.NoError(t, err) 100 require.NotNil(t, nBlock) 101 require.Equal(t, nBlock.Block().Slot(), i) 102 nState, err := backedDB.State(ctx, root) 103 require.NoError(t, err) 104 require.NotNil(t, nState) 105 require.Equal(t, nState.Slot(), i) 106 } 107 }