github.com/Finschia/ostracon@v1.1.5/cmd/ostracon/commands/show_validator_test.go (about) 1 package commands 2 3 import ( 4 "bytes" 5 "os" 6 "strings" 7 "sync" 8 "testing" 9 10 "github.com/Finschia/ostracon/types" 11 12 cfg "github.com/Finschia/ostracon/config" 13 "github.com/Finschia/ostracon/crypto" 14 tmjson "github.com/Finschia/ostracon/libs/json" 15 tmos "github.com/Finschia/ostracon/libs/os" 16 "github.com/Finschia/ostracon/privval" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func TestShowValidator(t *testing.T) { 21 original := config 22 defer func() { 23 config = original 24 }() 25 26 setupEnv(t) 27 config = cfg.DefaultConfig() 28 err := RootCmd.PersistentPreRunE(RootCmd, nil) 29 require.NoError(t, err) 30 init := NewInitCmd() 31 err = init.RunE(init, nil) 32 require.NoError(t, err) 33 output, err := captureStdout(func() { 34 err = ShowValidatorCmd.RunE(ShowValidatorCmd, nil) 35 require.NoError(t, err) 36 }) 37 require.NoError(t, err) 38 39 // output must match the locally stored priv_validator key 40 privKey := loadFilePVKey(t, config.PrivValidatorKeyFile()) 41 bz, err := tmjson.Marshal(privKey.PubKey) 42 require.NoError(t, err) 43 require.Equal(t, string(bz), output) 44 } 45 46 func TestShowValidatorWithoutLocalKeyFile(t *testing.T) { 47 setupEnv(t) 48 config := cfg.DefaultConfig() 49 if tmos.FileExists(config.PrivValidatorKeyFile()) { 50 err := os.Remove(config.PrivValidatorKeyFile()) 51 require.NoError(t, err) 52 } 53 err := showValidator(ShowValidatorCmd, nil, config) 54 require.Error(t, err) 55 } 56 57 func TestShowValidatorWithKMS(t *testing.T) { 58 dir := setupEnv(t) 59 cfg.EnsureRoot(dir) 60 61 original := config 62 defer func() { 63 config = original 64 }() 65 66 config = cfg.DefaultConfig() 67 config.SetRoot(dir) 68 err := RootCmd.PersistentPreRunE(RootCmd, nil) 69 require.NoError(t, err) 70 init := NewInitCmd() 71 err = init.RunE(init, nil) 72 require.NoError(t, err) 73 74 chainID, err := loadChainID(config) 75 require.NoError(t, err) 76 77 if tmos.FileExists(config.PrivValidatorKeyFile()) { 78 err := os.Remove(config.PrivValidatorKeyFile()) 79 require.NoError(t, err) 80 } 81 privval.WithMockKMS(t, dir, chainID, func(addr string, privKey crypto.PrivKey) { 82 config.PrivValidatorListenAddr = addr 83 config.PrivValidatorRemoteAddresses = []string{addr[:strings.Index(addr, ":")]} 84 require.NoFileExists(t, config.PrivValidatorKeyFile()) 85 output, err := captureStdout(func() { 86 err := showValidator(ShowValidatorCmd, nil, config) 87 require.NoError(t, err) 88 }) 89 require.NoError(t, err) 90 91 // output must contains the KMS public key 92 bz, err := tmjson.Marshal(privKey.PubKey()) 93 require.NoError(t, err) 94 expected := string(bz) 95 require.Contains(t, output, expected) 96 }) 97 } 98 99 func TestShowValidatorWithInefficientKMSAddress(t *testing.T) { 100 dir := setupEnv(t) 101 cfg.EnsureRoot(dir) 102 103 original := config 104 defer func() { 105 config = original 106 }() 107 108 config = cfg.DefaultConfig() 109 config.SetRoot(dir) 110 err := RootCmd.PersistentPreRunE(RootCmd, nil) 111 require.NoError(t, err) 112 init := NewInitCmd() 113 err = init.RunE(init, nil) 114 require.NoError(t, err) 115 116 if tmos.FileExists(config.PrivValidatorKeyFile()) { 117 err := os.Remove(config.PrivValidatorKeyFile()) 118 require.NoError(t, err) 119 } 120 config.PrivValidatorListenAddr = "127.0.0.1:inefficient" 121 err = showValidator(ShowValidatorCmd, nil, config) 122 require.Error(t, err) 123 } 124 125 func TestLoadChainID(t *testing.T) { 126 expected := "c57861" 127 config := cfg.ResetTestRootWithChainID("TestLoadChainID", expected) 128 defer func() { 129 var _ = os.RemoveAll(config.RootDir) 130 }() 131 132 require.FileExists(t, config.GenesisFile()) 133 genDoc, err := types.GenesisDocFromFile(config.GenesisFile()) 134 require.NoError(t, err) 135 require.Equal(t, expected, genDoc.ChainID) 136 137 chainID, err := loadChainID(config) 138 require.NoError(t, err) 139 require.Equal(t, expected, chainID) 140 } 141 142 func TestLoadChainIDWithoutStateDB(t *testing.T) { 143 expected := "c34091" 144 config := cfg.ResetTestRootWithChainID("TestLoadChainID", expected) 145 defer func() { 146 var _ = os.RemoveAll(config.RootDir) 147 }() 148 149 config.DBBackend = "goleveldb" 150 config.DBPath = "/../path with containing chars that cannot be used\\/:*?\"<>|\x00" 151 152 _, err := loadChainID(config) 153 require.Error(t, err) 154 } 155 156 func loadFilePVKey(t *testing.T, file string) privval.FilePVKey { 157 // output must match the locally stored priv_validator key 158 keyJSONBytes, err := os.ReadFile(file) 159 require.NoError(t, err) 160 privKey := privval.FilePVKey{} 161 err = tmjson.Unmarshal(keyJSONBytes, &privKey) 162 require.NoError(t, err) 163 return privKey 164 } 165 166 var stdoutMutex sync.Mutex 167 168 func captureStdout(f func()) (string, error) { 169 r, w, err := os.Pipe() 170 if err != nil { 171 return "", err 172 } 173 174 stdoutMutex.Lock() 175 original := os.Stdout 176 defer func() { 177 stdoutMutex.Lock() 178 os.Stdout = original 179 stdoutMutex.Unlock() 180 }() 181 os.Stdout = w 182 stdoutMutex.Unlock() 183 184 f() 185 _ = w.Close() 186 var buffer bytes.Buffer 187 if _, err := buffer.ReadFrom(r); err != nil { 188 return "", err 189 } 190 output := buffer.String() 191 return output[:len(output)-1], nil 192 }