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  }