github.com/evdatsion/aphelion-dpos-bft@v0.32.1/scripts/privValUpgrade_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 "github.com/evdatsion/aphelion-dpos-bft/privval" 12 ) 13 14 const oldPrivvalContent = `{ 15 "address": "1D8089FAFDFAE4A637F3D616E17B92905FA2D91D", 16 "pub_key": { 17 "type": "tendermint/PubKeyEd25519", 18 "value": "r3Yg2AhDZ745CNTpavsGU+mRZ8WpRXqoJuyqjN8mJq0=" 19 }, 20 "last_height": "5", 21 "last_round": "0", 22 "last_step": 3, 23 "last_signature": "CTr7b9ZQlrJJf+12rPl5t/YSCUc/KqV7jQogCfFJA24e7hof69X6OMT7eFLVQHyodPjD/QTA298XHV5ejxInDQ==", 24 "last_signbytes": "750802110500000000000000220B08B398F3E00510F48DA6402A480A20FC258973076512999C3E6839A22E9FBDB1B77CF993E8A9955412A41A59D4CAD312240A20C971B286ACB8AAA6FCA0365EB0A660B189EDC08B46B5AF2995DEFA51A28D215B10013211746573742D636861696E2D533245415533", 25 "priv_key": { 26 "type": "tendermint/PrivKeyEd25519", 27 "value": "7MwvTGEWWjsYwjn2IpRb+GYsWi9nnFsw8jPLLY1UtP6vdiDYCENnvjkI1Olq+wZT6ZFnxalFeqgm7KqM3yYmrQ==" 28 } 29 }` 30 31 func TestLoadAndUpgrade(t *testing.T) { 32 33 oldFilePath := initTmpOldFile(t) 34 defer os.Remove(oldFilePath) 35 newStateFile, err := ioutil.TempFile("", "priv_validator_state*.json") 36 defer os.Remove(newStateFile.Name()) 37 require.NoError(t, err) 38 newKeyFile, err := ioutil.TempFile("", "priv_validator_key*.json") 39 defer os.Remove(newKeyFile.Name()) 40 require.NoError(t, err) 41 emptyOldFile, err := ioutil.TempFile("", "priv_validator_empty*.json") 42 require.NoError(t, err) 43 defer os.Remove(emptyOldFile.Name()) 44 45 type args struct { 46 oldPVPath string 47 newPVKeyPath string 48 newPVStatePath string 49 } 50 tests := []struct { 51 name string 52 args args 53 wantErr bool 54 wantPanic bool 55 }{ 56 {"successful upgrade", 57 args{oldPVPath: oldFilePath, newPVKeyPath: newKeyFile.Name(), newPVStatePath: newStateFile.Name()}, 58 false, false, 59 }, 60 {"unsuccessful upgrade: empty old privval file", 61 args{oldPVPath: emptyOldFile.Name(), newPVKeyPath: newKeyFile.Name(), newPVStatePath: newStateFile.Name()}, 62 true, false, 63 }, 64 {"unsuccessful upgrade: invalid new paths (1/3)", 65 args{oldPVPath: oldFilePath, newPVKeyPath: "", newPVStatePath: newStateFile.Name()}, 66 false, true, 67 }, 68 {"unsuccessful upgrade: invalid new paths (2/3)", 69 args{oldPVPath: oldFilePath, newPVKeyPath: newKeyFile.Name(), newPVStatePath: ""}, 70 false, true, 71 }, 72 {"unsuccessful upgrade: invalid new paths (3/3)", 73 args{oldPVPath: oldFilePath, newPVKeyPath: "", newPVStatePath: ""}, 74 false, true, 75 }, 76 } 77 for _, tt := range tests { 78 t.Run(tt.name, func(t *testing.T) { 79 // need to re-write the file everytime because upgrading renames it 80 err := ioutil.WriteFile(oldFilePath, []byte(oldPrivvalContent), 0600) 81 require.NoError(t, err) 82 if tt.wantPanic { 83 require.Panics(t, func() { loadAndUpgrade(tt.args.oldPVPath, tt.args.newPVKeyPath, tt.args.newPVStatePath) }) 84 } else { 85 err = loadAndUpgrade(tt.args.oldPVPath, tt.args.newPVKeyPath, tt.args.newPVStatePath) 86 if tt.wantErr { 87 assert.Error(t, err) 88 fmt.Println("ERR", err) 89 } else { 90 assert.NoError(t, err) 91 upgradedPV := privval.LoadFilePV(tt.args.newPVKeyPath, tt.args.newPVStatePath) 92 oldPV, err := privval.LoadOldFilePV(tt.args.oldPVPath + ".bak") 93 require.NoError(t, err) 94 95 assert.Equal(t, oldPV.Address, upgradedPV.Key.Address) 96 assert.Equal(t, oldPV.Address, upgradedPV.GetAddress()) 97 assert.Equal(t, oldPV.PubKey, upgradedPV.Key.PubKey) 98 assert.Equal(t, oldPV.PubKey, upgradedPV.GetPubKey()) 99 assert.Equal(t, oldPV.PrivKey, upgradedPV.Key.PrivKey) 100 101 assert.Equal(t, oldPV.LastHeight, upgradedPV.LastSignState.Height) 102 assert.Equal(t, oldPV.LastRound, upgradedPV.LastSignState.Round) 103 assert.Equal(t, oldPV.LastSignature, upgradedPV.LastSignState.Signature) 104 assert.Equal(t, oldPV.LastSignBytes, upgradedPV.LastSignState.SignBytes) 105 assert.Equal(t, oldPV.LastStep, upgradedPV.LastSignState.Step) 106 107 } 108 } 109 }) 110 } 111 } 112 113 func initTmpOldFile(t *testing.T) string { 114 tmpfile, err := ioutil.TempFile("", "priv_validator_*.json") 115 require.NoError(t, err) 116 t.Logf("created test file %s", tmpfile.Name()) 117 _, err = tmpfile.WriteString(oldPrivvalContent) 118 require.NoError(t, err) 119 120 return tmpfile.Name() 121 }