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 }