diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cb0126524..d6deb0bff8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Reject unsupported `net-info --output` formats instead of falling back to text output [#3360](https://github.com/evstack/ev-node/pull/3360). + ## v1.1.3 ### Fixed diff --git a/pkg/cmd/p2p.go b/pkg/cmd/p2p.go index 578112211e..4963e077e6 100644 --- a/pkg/cmd/p2p.go +++ b/pkg/cmd/p2p.go @@ -40,6 +40,16 @@ var NetInfoCmd = &cobra.Command{ return fmt.Errorf("RPC address not found in node configuration") } + outputFormat, err := cmd.Flags().GetString(flagOutput) + if err != nil { + return err + } + switch outputFormat { + case "text", "json": + default: + return fmt.Errorf("unsupported output format %q (supported: text, json)", outputFormat) + } + // Create HTTP client httpClient := http.Client{ Transport: http.DefaultTransport, @@ -75,11 +85,6 @@ var NetInfoCmd = &cobra.Command{ return fmt.Errorf("GetPeerInfo RPC: %w", err) } - outputFormat, err := cmd.Flags().GetString(flagOutput) - if err != nil { - return err - } - if outputFormat == "json" { return formatJson(cmd.OutOrStdout(), netInfo, peerResp) } diff --git a/pkg/cmd/p2p_test.go b/pkg/cmd/p2p_test.go index a36895a0f9..baf344b1ae 100644 --- a/pkg/cmd/p2p_test.go +++ b/pkg/cmd/p2p_test.go @@ -199,3 +199,33 @@ func TestNetInfoCmd_NoPeers(t *testing.T) { mockP2P.AssertExpectations(t) } + +func TestNetInfoCmd_InvalidOutputFormat(t *testing.T) { + require := require.New(t) + + tempDir, err := os.MkdirTemp("", "evolve-test-home-invalid-output-*") + require.NoError(err) + defer os.RemoveAll(tempDir) + + rpcAddr := "127.0.0.1:1" + v := viper.New() + v.Set(config.FlagRPCAddress, rpcAddr) + v.Set(config.FlagRootDir, tempDir) + + rootCmd := &cobra.Command{Use: "root"} + rootCmd.PersistentFlags().String(config.FlagRootDir, tempDir, "Root directory for config and data") + rootCmd.PersistentFlags().String(config.FlagRPCAddress, rpcAddr, "RPC listen address") + + err = v.BindPFlag(config.FlagRootDir, rootCmd.PersistentFlags().Lookup(config.FlagRootDir)) + require.NoError(err) + err = v.BindPFlag(config.FlagRPCAddress, rootCmd.PersistentFlags().Lookup(config.FlagRPCAddress)) + require.NoError(err) + + NetInfoCmd.SetContext(context.WithValue(context.Background(), viperKey, v)) + rootCmd.AddCommand(NetInfoCmd) + + output, err := executeCommandC(rootCmd, "net-info", "--evnode.rpc.address="+rpcAddr, "--output", "yaml") + + require.Error(err, "Command should reject unsupported output format: %s", output) + require.Contains(err.Error(), `unsupported output format "yaml"`) +}