github.com/prysmaticlabs/prysm@v1.4.4/validator/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  	"github.com/prysmaticlabs/prysm/shared/cmd"
    12  	"github.com/prysmaticlabs/prysm/shared/params"
    13  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    14  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    15  	"github.com/prysmaticlabs/prysm/validator/db/kv"
    16  	logTest "github.com/sirupsen/logrus/hooks/test"
    17  	"github.com/urfave/cli/v2"
    18  )
    19  
    20  func TestRestore(t *testing.T) {
    21  	logHook := logTest.NewGlobal()
    22  	ctx := context.Background()
    23  
    24  	backupDb, err := kv.NewKVStore(ctx, t.TempDir(), &kv.Config{})
    25  	defer func() {
    26  		require.NoError(t, backupDb.Close())
    27  	}()
    28  	require.NoError(t, err)
    29  	root := [32]byte{1}
    30  	require.NoError(t, backupDb.SaveGenesisValidatorsRoot(ctx, root[:]))
    31  	require.NoError(t, backupDb.Close())
    32  	// We rename the backup file so that we can later verify
    33  	// whether the restored db has been renamed correctly.
    34  	require.NoError(t, os.Rename(
    35  		path.Join(backupDb.DatabasePath(), kv.ProtectionDbFileName),
    36  		path.Join(backupDb.DatabasePath(), "backup.db")))
    37  
    38  	restoreDir := t.TempDir()
    39  	require.NoError(t, os.Chmod(restoreDir, params.BeaconIoConfig().ReadWriteExecutePermissions))
    40  	app := cli.App{}
    41  	set := flag.NewFlagSet("test", 0)
    42  	set.String(cmd.RestoreSourceFileFlag.Name, "", "")
    43  	set.String(cmd.RestoreTargetDirFlag.Name, "", "")
    44  	require.NoError(t, set.Set(cmd.RestoreSourceFileFlag.Name, path.Join(backupDb.DatabasePath(), "backup.db")))
    45  	require.NoError(t, set.Set(cmd.RestoreTargetDirFlag.Name, restoreDir))
    46  	cliCtx := cli.NewContext(&app, set, nil)
    47  
    48  	assert.NoError(t, Restore(cliCtx))
    49  
    50  	files, err := ioutil.ReadDir(restoreDir)
    51  	require.NoError(t, err)
    52  	assert.Equal(t, 1, len(files))
    53  	assert.Equal(t, kv.ProtectionDbFileName, files[0].Name())
    54  	restoredDb, err := kv.NewKVStore(ctx, restoreDir, &kv.Config{})
    55  	defer func() {
    56  		require.NoError(t, restoredDb.Close())
    57  	}()
    58  	require.NoError(t, err)
    59  	genesisRoot, err := restoredDb.GenesisValidatorsRoot(ctx)
    60  	require.NoError(t, err)
    61  	require.DeepEqual(t, root[:], genesisRoot, "Restored database has incorrect data")
    62  	assert.LogsContain(t, logHook, "Restore completed successfully")
    63  }