github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/restore_test.go (about) 1 package db 2 3 import ( 4 "context" 5 "flag" 6 "io/ioutil" 7 "os" 8 "path" 9 "testing" 10 11 types "github.com/prysmaticlabs/eth2-types" 12 "github.com/prysmaticlabs/prysm/beacon-chain/db/kv" 13 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper" 14 "github.com/prysmaticlabs/prysm/shared/cmd" 15 "github.com/prysmaticlabs/prysm/shared/testutil" 16 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 17 "github.com/prysmaticlabs/prysm/shared/testutil/require" 18 logTest "github.com/sirupsen/logrus/hooks/test" 19 "github.com/urfave/cli/v2" 20 ) 21 22 func TestRestore(t *testing.T) { 23 logHook := logTest.NewGlobal() 24 ctx := context.Background() 25 26 backupDb, err := kv.NewKVStore(context.Background(), t.TempDir(), &kv.Config{}) 27 require.NoError(t, err) 28 head := testutil.NewBeaconBlock() 29 head.Block.Slot = 5000 30 require.NoError(t, backupDb.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(head))) 31 root, err := head.Block.HashTreeRoot() 32 require.NoError(t, err) 33 st, err := testutil.NewBeaconState() 34 require.NoError(t, err) 35 require.NoError(t, backupDb.SaveState(ctx, st, root)) 36 require.NoError(t, backupDb.SaveHeadBlockRoot(ctx, root)) 37 require.NoError(t, err) 38 require.NoError(t, backupDb.Close()) 39 // We rename the backup file so that we can later verify 40 // whether the restored db has been renamed correctly. 41 require.NoError(t, os.Rename( 42 path.Join(backupDb.DatabasePath(), kv.DatabaseFileName), 43 path.Join(backupDb.DatabasePath(), "backup.db"))) 44 45 restoreDir := t.TempDir() 46 app := cli.App{} 47 set := flag.NewFlagSet("test", 0) 48 set.String(cmd.RestoreSourceFileFlag.Name, "", "") 49 set.String(cmd.RestoreTargetDirFlag.Name, "", "") 50 require.NoError(t, set.Set(cmd.RestoreSourceFileFlag.Name, path.Join(backupDb.DatabasePath(), "backup.db"))) 51 require.NoError(t, set.Set(cmd.RestoreTargetDirFlag.Name, restoreDir)) 52 cliCtx := cli.NewContext(&app, set, nil) 53 54 assert.NoError(t, Restore(cliCtx)) 55 56 files, err := ioutil.ReadDir(path.Join(restoreDir, kv.BeaconNodeDbDirName)) 57 require.NoError(t, err) 58 assert.Equal(t, 1, len(files)) 59 assert.Equal(t, kv.DatabaseFileName, files[0].Name()) 60 restoredDb, err := kv.NewKVStore(context.Background(), path.Join(restoreDir, kv.BeaconNodeDbDirName), &kv.Config{}) 61 defer func() { 62 require.NoError(t, restoredDb.Close()) 63 }() 64 require.NoError(t, err) 65 headBlock, err := restoredDb.HeadBlock(ctx) 66 require.NoError(t, err) 67 assert.Equal(t, types.Slot(5000), headBlock.Block().Slot(), "Restored database has incorrect data") 68 assert.LogsContain(t, logHook, "Restore completed successfully") 69 70 }