github.com/cosmos/cosmos-sdk@v0.50.10/version/version_test.go (about)

     1  package version_test
     2  
     3  import (
     4  	context "context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"runtime"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/cosmos/cosmos-sdk/client/flags"
    14  	"github.com/cosmos/cosmos-sdk/testutil"
    15  	"github.com/cosmos/cosmos-sdk/testutil/cmdtest"
    16  	"github.com/cosmos/cosmos-sdk/version"
    17  )
    18  
    19  func TestNewInfo(t *testing.T) {
    20  	info := version.NewInfo()
    21  	want := fmt.Sprintf(`: 
    22  git commit: 
    23  build tags: 
    24  %s`, fmt.Sprintf("go version %s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH))
    25  	require.Equal(t, want, info.String())
    26  }
    27  
    28  func TestInfo_String(t *testing.T) {
    29  	info := version.Info{
    30  		Name:             "testapp",
    31  		AppName:          "testappd",
    32  		Version:          "1.0.0",
    33  		GitCommit:        "1b78457135a4104bc3af97f20654d49e2ea87454",
    34  		BuildTags:        "netgo,ledger",
    35  		GoVersion:        "go version go1.14 linux/amd64",
    36  		CosmosSdkVersion: "0.42.5",
    37  	}
    38  	want := `testapp: 1.0.0
    39  git commit: 1b78457135a4104bc3af97f20654d49e2ea87454
    40  build tags: netgo,ledger
    41  go version go1.14 linux/amd64`
    42  	require.Equal(t, want, info.String())
    43  }
    44  
    45  func TestCLI(t *testing.T) {
    46  	setVersionPackageVars(t)
    47  
    48  	sys := cmdtest.NewSystem()
    49  	sys.AddCommands(version.NewVersionCommand())
    50  
    51  	t.Run("no flags", func(t *testing.T) {
    52  		res := sys.MustRun(t, "version")
    53  
    54  		// Only prints the version, with a newline, to stdout.
    55  		require.Equal(t, testVersion+"\n", res.Stdout.String())
    56  		require.Empty(t, res.Stderr.String())
    57  	})
    58  
    59  	t.Run("--long flag", func(t *testing.T) {
    60  		res := sys.MustRun(t, "version", "--long")
    61  
    62  		out := res.Stdout.String()
    63  		lines := strings.Split(out, "\n")
    64  		require.Contains(t, lines, "name: testchain-app")
    65  		require.Contains(t, lines, "server_name: testchaind")
    66  		require.Contains(t, lines, `version: "3.14"`)
    67  		require.Contains(t, lines, "commit: abc123")
    68  		require.Contains(t, lines, "build_tags: mybuildtag")
    69  
    70  		require.Empty(t, res.Stderr.String())
    71  	})
    72  
    73  	t.Run("--output=json flag", func(t *testing.T) {
    74  		res := sys.MustRun(t, "version", "--output=json")
    75  
    76  		var info version.Info
    77  		require.NoError(t, json.Unmarshal(res.Stdout.Bytes(), &info))
    78  
    79  		// Assert against a couple fields that are difficult to predict in test
    80  		// without copying and pasting code.
    81  		require.NotEmpty(t, info.GoVersion)
    82  
    83  		// The SDK version appears to not be set during this test, so we'll ignore it here.
    84  
    85  		// Now clear out the non-empty fields, so we can compare against a fixed value.
    86  		info.GoVersion = ""
    87  
    88  		want := version.Info{
    89  			Name:      testName,
    90  			AppName:   testAppName,
    91  			Version:   testVersion,
    92  			GitCommit: testCommit,
    93  			BuildTags: testBuildTags,
    94  		}
    95  		require.Equal(t, want, info)
    96  
    97  		require.Empty(t, res.Stderr.String())
    98  	})
    99  
   100  	t.Run("positional args rejected", func(t *testing.T) {
   101  		res := sys.Run("version", "foo")
   102  		require.Error(t, res.Err)
   103  	})
   104  }
   105  
   106  const (
   107  	testName      = "testchain-app"
   108  	testAppName   = "testchaind"
   109  	testVersion   = "3.14"
   110  	testCommit    = "abc123"
   111  	testBuildTags = "mybuildtag"
   112  )
   113  
   114  // setVersionPackageVars temporarily overrides the package variables in the version package
   115  // so that we can assert meaningful output.
   116  func setVersionPackageVars(t *testing.T) {
   117  	t.Helper()
   118  
   119  	var (
   120  		origName      = version.Name
   121  		origAppName   = version.AppName
   122  		origVersion   = version.Version
   123  		origCommit    = version.Commit
   124  		origBuildTags = version.BuildTags
   125  	)
   126  
   127  	t.Cleanup(func() {
   128  		version.Name = origName
   129  		version.AppName = origAppName
   130  		version.Version = origVersion
   131  		version.Commit = origCommit
   132  		version.BuildTags = origBuildTags
   133  	})
   134  
   135  	version.Name = testName
   136  	version.AppName = testAppName
   137  	version.Version = testVersion
   138  	version.Commit = testCommit
   139  	version.BuildTags = testBuildTags
   140  }
   141  
   142  func Test_runVersionCmd(t *testing.T) {
   143  	cmd := version.NewVersionCommand()
   144  	_, mockOut := testutil.ApplyMockIO(cmd)
   145  
   146  	cmd.SetArgs([]string{
   147  		fmt.Sprintf("--%s=''", flags.FlagOutput),
   148  		"--long=false",
   149  	})
   150  
   151  	require.NoError(t, cmd.Execute())
   152  	require.Equal(t, "\n", mockOut.String())
   153  	mockOut.Reset()
   154  
   155  	cmd.SetArgs([]string{
   156  		fmt.Sprintf("--%s=json", flags.FlagOutput), "--long=true",
   157  	})
   158  
   159  	info := version.NewInfo()
   160  	stringInfo, err := json.Marshal(info)
   161  
   162  	extraInfo := &version.ExtraInfo{"key1": "value1"}
   163  	ctx := context.WithValue(context.Background(), version.ContextKey{}, extraInfo)
   164  
   165  	require.NoError(t, err)
   166  	require.NoError(t, cmd.Execute())
   167  
   168  	extraInfoFromContext := ctx.Value(version.ContextKey{})
   169  	require.NotNil(t, extraInfoFromContext)
   170  
   171  	castedExtraInfo, ok := extraInfoFromContext.(*version.ExtraInfo)
   172  	require.True(t, ok)
   173  
   174  	key1Value := (*castedExtraInfo)["key1"]
   175  	require.Equal(t, "value1", key1Value)
   176  
   177  	require.Equal(t, string(stringInfo)+"\n", mockOut.String())
   178  }