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 }