github.com/Finschia/finschia-sdk@v0.48.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  	ed255192 "github.com/Finschia/finschia-sdk/crypto/keys/ed25519"
    20  
    21  	"github.com/Finschia/finschia-sdk/client"
    22  	"github.com/Finschia/finschia-sdk/codec"
    23  	"github.com/Finschia/finschia-sdk/codec/types"
    24  	cryptocodec "github.com/Finschia/finschia-sdk/crypto/codec"
    25  	"github.com/Finschia/finschia-sdk/server"
    26  	"github.com/Finschia/finschia-sdk/server/mock"
    27  	"github.com/Finschia/finschia-sdk/testutil"
    28  	sdk "github.com/Finschia/finschia-sdk/types"
    29  	"github.com/Finschia/finschia-sdk/types/module"
    30  	"github.com/Finschia/finschia-sdk/x/genutil"
    31  	genutilcli "github.com/Finschia/finschia-sdk/x/genutil/client/cli"
    32  	genutiltest "github.com/Finschia/finschia-sdk/x/genutil/client/testutil"
    33  )
    34  
    35  var testMbm = module.NewBasicManager(genutil.AppModuleBasic{})
    36  
    37  func TestInitCmd(t *testing.T) {
    38  	tests := []struct {
    39  		name      string
    40  		flags     func(dir string) []string
    41  		shouldErr bool
    42  		err       error
    43  	}{
    44  		{
    45  			name: "happy path",
    46  			flags: func(dir string) []string {
    47  				return []string{
    48  					"appnode-test",
    49  				}
    50  			},
    51  			shouldErr: false,
    52  			err:       nil,
    53  		},
    54  	}
    55  
    56  	for _, tt := range tests {
    57  		tt := tt
    58  		t.Run(tt.name, func(t *testing.T) {
    59  			home := t.TempDir()
    60  			logger := log.NewNopLogger()
    61  			cfg, err := genutiltest.CreateDefaultTendermintConfig(home)
    62  			require.NoError(t, err)
    63  
    64  			serverCtx := server.NewContext(viper.New(), cfg, logger)
    65  			interfaceRegistry := types.NewInterfaceRegistry()
    66  			marshaler := codec.NewProtoCodec(interfaceRegistry)
    67  			clientCtx := client.Context{}.
    68  				WithCodec(marshaler).
    69  				WithLegacyAmino(makeCodec()).
    70  				WithHomeDir(home)
    71  
    72  			ctx := context.Background()
    73  			ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx)
    74  			ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx)
    75  
    76  			cmd := genutilcli.InitCmd(testMbm, home)
    77  			cmd.SetArgs(
    78  				tt.flags(home),
    79  			)
    80  
    81  			if tt.shouldErr {
    82  				err := cmd.ExecuteContext(ctx)
    83  				require.EqualError(t, err, tt.err.Error())
    84  			} else {
    85  				require.NoError(t, cmd.ExecuteContext(ctx))
    86  			}
    87  		})
    88  	}
    89  }
    90  
    91  func TestInitRecover(t *testing.T) {
    92  	home := t.TempDir()
    93  	logger := log.NewNopLogger()
    94  	cfg, err := genutiltest.CreateDefaultTendermintConfig(home)
    95  	require.NoError(t, err)
    96  
    97  	serverCtx := server.NewContext(viper.New(), cfg, logger)
    98  	interfaceRegistry := types.NewInterfaceRegistry()
    99  	marshaler := codec.NewProtoCodec(interfaceRegistry)
   100  	clientCtx := client.Context{}.
   101  		WithCodec(marshaler).
   102  		WithLegacyAmino(makeCodec()).
   103  		WithHomeDir(home)
   104  
   105  	ctx := context.Background()
   106  	ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx)
   107  	ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx)
   108  
   109  	cmd := genutilcli.InitCmd(testMbm, home)
   110  	mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
   111  
   112  	cmd.SetArgs([]string{
   113  		"appnode-test",
   114  		fmt.Sprintf("--%s=true", genutilcli.FlagRecover),
   115  	})
   116  
   117  	// use valid mnemonic and complete recovery key generation successfully
   118  	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")
   119  	require.NoError(t, cmd.ExecuteContext(ctx))
   120  }
   121  
   122  func TestEmptyState(t *testing.T) {
   123  	home := t.TempDir()
   124  	logger := log.NewNopLogger()
   125  	cfg, err := genutiltest.CreateDefaultTendermintConfig(home)
   126  	require.NoError(t, err)
   127  
   128  	serverCtx := server.NewContext(viper.New(), cfg, logger)
   129  	interfaceRegistry := types.NewInterfaceRegistry()
   130  	marshaler := codec.NewProtoCodec(interfaceRegistry)
   131  	clientCtx := client.Context{}.
   132  		WithCodec(marshaler).
   133  		WithLegacyAmino(makeCodec()).
   134  		WithHomeDir(home)
   135  
   136  	ctx := context.Background()
   137  	ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx)
   138  	ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx)
   139  
   140  	cmd := genutilcli.InitCmd(testMbm, home)
   141  	cmd.SetArgs([]string{"appnode-test", fmt.Sprintf("--%s=%s", cli.HomeFlag, home)})
   142  
   143  	require.NoError(t, cmd.ExecuteContext(ctx))
   144  
   145  	old := os.Stdout
   146  	r, w, _ := os.Pipe()
   147  	os.Stdout = w
   148  
   149  	cmd = server.ExportCmd(nil, home)
   150  	cmd.SetArgs([]string{fmt.Sprintf("--%s=%s", cli.HomeFlag, home)})
   151  	require.NoError(t, cmd.ExecuteContext(ctx))
   152  
   153  	outC := make(chan string)
   154  	go func() {
   155  		var buf bytes.Buffer
   156  		io.Copy(&buf, r)
   157  		outC <- buf.String()
   158  	}()
   159  
   160  	w.Close()
   161  	os.Stdout = old
   162  	out := <-outC
   163  
   164  	require.Contains(t, out, "genesis_time")
   165  	require.Contains(t, out, "chain_id")
   166  	require.Contains(t, out, "consensus_params")
   167  	require.Contains(t, out, "app_hash")
   168  	require.Contains(t, out, "app_state")
   169  }
   170  
   171  func TestStartStandAlone(t *testing.T) {
   172  	home := t.TempDir()
   173  	logger := log.NewNopLogger()
   174  	interfaceRegistry := types.NewInterfaceRegistry()
   175  	marshaler := codec.NewProtoCodec(interfaceRegistry)
   176  	err := genutiltest.ExecInitCmd(testMbm, home, marshaler)
   177  	require.NoError(t, err)
   178  
   179  	app, err := mock.NewApp(home, logger)
   180  	require.NoError(t, err)
   181  
   182  	svrAddr, _, err := server.FreeTCPAddr()
   183  	require.NoError(t, err)
   184  
   185  	svr, err := abci_server.NewServer(svrAddr, "grpc", app)
   186  	require.NoError(t, err, "error creating listener")
   187  
   188  	svr.SetLogger(logger.With("module", "abci-server"))
   189  	err = svr.Start()
   190  	require.NoError(t, err)
   191  
   192  	timer := time.NewTimer(time.Duration(2) * time.Second)
   193  	for range timer.C {
   194  		err = svr.Stop()
   195  		require.NoError(t, err)
   196  		break
   197  	}
   198  }
   199  
   200  func TestInitNodeValidatorFiles(t *testing.T) {
   201  	home := t.TempDir()
   202  	cfg, err := genutiltest.CreateDefaultTendermintConfig(home)
   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  }