github.com/Finschia/finschia-sdk@v0.49.1/x/genutil/client/cli/init_test.go (about)

     1  package cli_test
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"fmt"
     7  	"io"
     8  	"os"
     9  	"reflect"
    10  	"testing"
    11  	"time"
    12  
    13  	abci_server "github.com/Finschia/ostracon/abci/server"
    14  	"github.com/Finschia/ostracon/libs/cli"
    15  	"github.com/Finschia/ostracon/libs/log"
    16  	"github.com/spf13/viper"
    17  	"github.com/stretchr/testify/require"
    18  
    19  	"github.com/Finschia/finschia-sdk/client"
    20  	"github.com/Finschia/finschia-sdk/codec"
    21  	"github.com/Finschia/finschia-sdk/codec/types"
    22  	cryptocodec "github.com/Finschia/finschia-sdk/crypto/codec"
    23  	ed255192 "github.com/Finschia/finschia-sdk/crypto/keys/ed25519"
    24  	"github.com/Finschia/finschia-sdk/server"
    25  	"github.com/Finschia/finschia-sdk/server/mock"
    26  	"github.com/Finschia/finschia-sdk/testutil"
    27  	sdk "github.com/Finschia/finschia-sdk/types"
    28  	"github.com/Finschia/finschia-sdk/types/module"
    29  	"github.com/Finschia/finschia-sdk/x/genutil"
    30  	genutilcli "github.com/Finschia/finschia-sdk/x/genutil/client/cli"
    31  	genutiltest "github.com/Finschia/finschia-sdk/x/genutil/client/testutil"
    32  )
    33  
    34  var testMbm = module.NewBasicManager(genutil.AppModuleBasic{})
    35  
    36  func TestInitCmd(t *testing.T) {
    37  	tests := []struct {
    38  		name      string
    39  		flags     func(dir string) []string
    40  		shouldErr bool
    41  		err       error
    42  	}{
    43  		{
    44  			name: "happy path",
    45  			flags: func(dir string) []string {
    46  				return []string{
    47  					"appnode-test",
    48  				}
    49  			},
    50  			shouldErr: false,
    51  			err:       nil,
    52  		},
    53  	}
    54  
    55  	for _, tt := range tests {
    56  		t.Run(tt.name, func(t *testing.T) {
    57  			home := t.TempDir()
    58  			logger := log.NewNopLogger()
    59  			cfg, err := genutiltest.CreateDefaultTendermintConfig(home)
    60  			require.NoError(t, err)
    61  
    62  			serverCtx := server.NewContext(viper.New(), cfg, logger)
    63  			interfaceRegistry := types.NewInterfaceRegistry()
    64  			marshaler := codec.NewProtoCodec(interfaceRegistry)
    65  			clientCtx := client.Context{}.
    66  				WithCodec(marshaler).
    67  				WithLegacyAmino(makeCodec()).
    68  				WithHomeDir(home)
    69  
    70  			ctx := context.Background()
    71  			ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx)
    72  			ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx)
    73  
    74  			cmd := genutilcli.InitCmd(testMbm, home)
    75  			cmd.SetArgs(
    76  				tt.flags(home),
    77  			)
    78  
    79  			if tt.shouldErr {
    80  				err := cmd.ExecuteContext(ctx)
    81  				require.EqualError(t, err, tt.err.Error())
    82  			} else {
    83  				require.NoError(t, cmd.ExecuteContext(ctx))
    84  			}
    85  		})
    86  	}
    87  }
    88  
    89  func TestInitRecover(t *testing.T) {
    90  	home := t.TempDir()
    91  	logger := log.NewNopLogger()
    92  	cfg, err := genutiltest.CreateDefaultTendermintConfig(home)
    93  	require.NoError(t, err)
    94  
    95  	serverCtx := server.NewContext(viper.New(), cfg, logger)
    96  	interfaceRegistry := types.NewInterfaceRegistry()
    97  	marshaler := codec.NewProtoCodec(interfaceRegistry)
    98  	clientCtx := client.Context{}.
    99  		WithCodec(marshaler).
   100  		WithLegacyAmino(makeCodec()).
   101  		WithHomeDir(home)
   102  
   103  	ctx := context.Background()
   104  	ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx)
   105  	ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx)
   106  
   107  	cmd := genutilcli.InitCmd(testMbm, home)
   108  	mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
   109  
   110  	cmd.SetArgs([]string{
   111  		"appnode-test",
   112  		fmt.Sprintf("--%s=true", genutilcli.FlagRecover),
   113  	})
   114  
   115  	// use valid mnemonic and complete recovery key generation successfully
   116  	mockIn.Reset("decide praise business actor peasant farm drastic weather extend front hurt later song give verb rhythm worry fun pond reform school tumble august one\n")
   117  	require.NoError(t, cmd.ExecuteContext(ctx))
   118  }
   119  
   120  func TestEmptyState(t *testing.T) {
   121  	home := t.TempDir()
   122  	logger := log.NewNopLogger()
   123  	cfg, err := genutiltest.CreateDefaultTendermintConfig(home)
   124  	require.NoError(t, err)
   125  
   126  	serverCtx := server.NewContext(viper.New(), cfg, logger)
   127  	interfaceRegistry := types.NewInterfaceRegistry()
   128  	marshaler := codec.NewProtoCodec(interfaceRegistry)
   129  	clientCtx := client.Context{}.
   130  		WithCodec(marshaler).
   131  		WithLegacyAmino(makeCodec()).
   132  		WithHomeDir(home)
   133  
   134  	ctx := context.Background()
   135  	ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx)
   136  	ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx)
   137  
   138  	cmd := genutilcli.InitCmd(testMbm, home)
   139  	cmd.SetArgs([]string{"appnode-test", fmt.Sprintf("--%s=%s", cli.HomeFlag, home)})
   140  
   141  	require.NoError(t, cmd.ExecuteContext(ctx))
   142  
   143  	old := os.Stdout
   144  	r, w, _ := os.Pipe()
   145  	os.Stdout = w
   146  
   147  	cmd = server.ExportCmd(nil, home)
   148  	cmd.SetArgs([]string{fmt.Sprintf("--%s=%s", cli.HomeFlag, home)})
   149  	require.NoError(t, cmd.ExecuteContext(ctx))
   150  
   151  	outC := make(chan string)
   152  	go func() {
   153  		var buf bytes.Buffer
   154  		_, err := io.Copy(&buf, r)
   155  		require.NoError(t, err)
   156  		outC <- buf.String()
   157  	}()
   158  
   159  	w.Close()
   160  	os.Stdout = old
   161  	out := <-outC
   162  
   163  	require.Contains(t, out, "genesis_time")
   164  	require.Contains(t, out, "chain_id")
   165  	require.Contains(t, out, "consensus_params")
   166  	require.Contains(t, out, "app_hash")
   167  	require.Contains(t, out, "app_state")
   168  }
   169  
   170  func TestStartStandAlone(t *testing.T) {
   171  	home := t.TempDir()
   172  	logger := log.NewNopLogger()
   173  	interfaceRegistry := types.NewInterfaceRegistry()
   174  	marshaler := codec.NewProtoCodec(interfaceRegistry)
   175  	err := genutiltest.ExecInitCmd(testMbm, home, marshaler)
   176  	require.NoError(t, err)
   177  
   178  	app, err := mock.NewApp(home, logger)
   179  	require.NoError(t, err)
   180  
   181  	svrAddr, _, err := server.FreeTCPAddr()
   182  	require.NoError(t, err)
   183  
   184  	svr, err := abci_server.NewServer(svrAddr, "grpc", app)
   185  	require.NoError(t, err, "error creating listener")
   186  
   187  	svr.SetLogger(logger.With("module", "abci-server"))
   188  	err = svr.Start()
   189  	require.NoError(t, err)
   190  
   191  	timer := time.NewTimer(time.Duration(2) * time.Second)
   192  	for range timer.C {
   193  		err = svr.Stop()
   194  		require.NoError(t, err)
   195  		break
   196  	}
   197  }
   198  
   199  func TestInitNodeValidatorFiles(t *testing.T) {
   200  	home := t.TempDir()
   201  	cfg, err := genutiltest.CreateDefaultTendermintConfig(home)
   202  	require.NoError(t, err)
   203  	nodeID, valPubKey, err := genutil.InitializeNodeValidatorFiles(cfg)
   204  
   205  	require.Nil(t, err)
   206  	require.NotEqual(t, "", nodeID)
   207  	require.Equal(t, 32, len(valPubKey.Bytes()))
   208  	require.EqualValues(t, reflect.TypeOf(&ed255192.PubKey{}), reflect.TypeOf(valPubKey))
   209  }
   210  
   211  // custom tx codec
   212  func makeCodec() *codec.LegacyAmino {
   213  	cdc := codec.NewLegacyAmino()
   214  	sdk.RegisterLegacyAminoCodec(cdc)
   215  	cryptocodec.RegisterCrypto(cdc)
   216  	return cdc
   217  }