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 }