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  }