github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/cmd/ostracon/commands/show_validator_test.go (about) 1 package commands 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "os" 7 "sync" 8 "testing" 9 10 "github.com/line/ostracon/types" 11 12 cfg "github.com/line/ostracon/config" 13 "github.com/line/ostracon/crypto" 14 tmjson "github.com/line/ostracon/libs/json" 15 tmos "github.com/line/ostracon/libs/os" 16 "github.com/line/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 require.NoFileExists(t, config.PrivValidatorKeyFile()) 84 output, err := captureStdout(func() { 85 err := showValidator(ShowValidatorCmd, nil, config) 86 require.NoError(t, err) 87 }) 88 require.NoError(t, err) 89 90 // output must contains the KMS public key 91 bz, err := tmjson.Marshal(privKey.PubKey()) 92 require.NoError(t, err) 93 expected := string(bz) 94 require.Contains(t, output, expected) 95 }) 96 } 97 98 func TestShowValidatorWithInefficientKMSAddress(t *testing.T) { 99 dir := setupEnv(t) 100 cfg.EnsureRoot(dir) 101 102 original := config 103 defer func() { 104 config = original 105 }() 106 107 config = cfg.DefaultConfig() 108 config.SetRoot(dir) 109 err := RootCmd.PersistentPreRunE(RootCmd, nil) 110 require.NoError(t, err) 111 init := NewInitCmd() 112 err = init.RunE(init, nil) 113 require.NoError(t, err) 114 115 if tmos.FileExists(config.PrivValidatorKeyFile()) { 116 err := os.Remove(config.PrivValidatorKeyFile()) 117 require.NoError(t, err) 118 } 119 config.PrivValidatorListenAddr = "127.0.0.1:inefficient" 120 err = showValidator(ShowValidatorCmd, nil, config) 121 require.Error(t, err) 122 } 123 124 func TestLoadChainID(t *testing.T) { 125 expected := "c57861" 126 config := cfg.ResetTestRootWithChainID("TestLoadChainID", expected) 127 defer func() { 128 var _ = os.RemoveAll(config.RootDir) 129 }() 130 131 require.FileExists(t, config.GenesisFile()) 132 genDoc, err := types.GenesisDocFromFile(config.GenesisFile()) 133 require.NoError(t, err) 134 require.Equal(t, expected, genDoc.ChainID) 135 136 chainID, err := loadChainID(config) 137 require.NoError(t, err) 138 require.Equal(t, expected, chainID) 139 } 140 141 func TestLoadChainIDWithoutStateDB(t *testing.T) { 142 expected := "c34091" 143 config := cfg.ResetTestRootWithChainID("TestLoadChainID", expected) 144 defer func() { 145 var _ = os.RemoveAll(config.RootDir) 146 }() 147 148 config.DBBackend = "goleveldb" 149 config.DBPath = "/../path with containing chars that cannot be used\\/:*?\"<>|\x00" 150 151 _, err := loadChainID(config) 152 require.Error(t, err) 153 } 154 155 func loadFilePVKey(t *testing.T, file string) privval.FilePVKey { 156 // output must match the locally stored priv_validator key 157 keyJSONBytes, err := ioutil.ReadFile(file) 158 require.NoError(t, err) 159 privKey := privval.FilePVKey{} 160 err = tmjson.Unmarshal(keyJSONBytes, &privKey) 161 require.NoError(t, err) 162 return privKey 163 } 164 165 var stdoutMutex sync.Mutex 166 167 func captureStdout(f func()) (string, error) { 168 r, w, err := os.Pipe() 169 if err != nil { 170 return "", err 171 } 172 173 stdoutMutex.Lock() 174 original := os.Stdout 175 defer func() { 176 stdoutMutex.Lock() 177 os.Stdout = original 178 stdoutMutex.Unlock() 179 }() 180 os.Stdout = w 181 stdoutMutex.Unlock() 182 183 f() 184 _ = w.Close() 185 var buffer bytes.Buffer 186 if _, err := buffer.ReadFrom(r); err != nil { 187 return "", err 188 } 189 output := buffer.String() 190 return output[:len(output)-1], nil 191 }