github.com/mirantis/virtlet@v1.5.2-0.20191204181327-1659b8a48e9b/pkg/tools/version_test.go (about) 1 /* 2 Copyright 2018 Mirantis 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package tools 18 19 import ( 20 "bytes" 21 "testing" 22 23 "github.com/Mirantis/virtlet/pkg/version" 24 "github.com/Mirantis/virtlet/tests/gm" 25 "strings" 26 ) 27 28 var ( 29 clientVersionInfo = version.Info{ 30 Major: "1", 31 Minor: "0", 32 GitVersion: "v1.0.0-6+318faff6ad0609-dirty", 33 GitCommit: "318faff6ad060954387c1ff594bcbb4bb128577a", 34 GitTreeState: "dirty", 35 BuildDate: "2018-04-16T21:02:05Z", 36 GoVersion: "go1.8.3", 37 Compiler: "gc", 38 Platform: "darwin/amd64", 39 ImageTag: "ivan4th_version", 40 } 41 nodeVersionInfo = version.Info{ 42 Major: "1", 43 Minor: "0", 44 GitVersion: "v1.0.0-6+318faff6ad0609", 45 GitCommit: "318faff6ad060954387c1ff594bcbb4bb128577a", 46 GitTreeState: "clean", 47 BuildDate: "2018-04-16T21:02:05Z", 48 GoVersion: "go1.8.3", 49 Compiler: "gc", 50 Platform: "linux/amd64", 51 } 52 nodeVersionInfo1 = version.Info{ 53 Major: "1", 54 Minor: "0", 55 GitVersion: "v1.0.0-6+318faff6ad0609", 56 GitCommit: "318faff6ad060954387c1ff594bcbb4bb128577a", 57 GitTreeState: "clean", 58 // different build date 59 BuildDate: "2018-04-17T07:16:01Z", 60 GoVersion: "go1.8.3", 61 Compiler: "gc", 62 Platform: "linux/amd64", 63 } 64 ) 65 66 func versionInfoToString(v version.Info) string { 67 out, err := v.ToBytes("json") 68 if err != nil { 69 panic("version info marshalling failed") 70 } 71 return string(out) 72 } 73 74 func TestVersionCommand(t *testing.T) { 75 for _, tc := range []struct { 76 name string 77 args string 78 virtletPods map[string]string 79 expectedCommands map[string]string 80 errSubstring string 81 wrap func([]byte) gm.Verifier 82 noOutput bool 83 }{ 84 { 85 name: "text", 86 virtletPods: map[string]string{ 87 "kube-node-1": "virtlet-foo42", 88 "kube-node-2": "virtlet-bar42", 89 }, 90 expectedCommands: map[string]string{ 91 "virtlet-foo42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 92 "virtlet-bar42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 93 }, 94 }, 95 { 96 name: "text/empty", 97 }, 98 { 99 name: "short", 100 args: "--short", 101 virtletPods: map[string]string{ 102 "kube-node-1": "virtlet-foo42", 103 "kube-node-2": "virtlet-bar42", 104 }, 105 expectedCommands: map[string]string{ 106 "virtlet-foo42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 107 "virtlet-bar42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 108 }, 109 }, 110 { 111 name: "json", 112 args: "-o json", 113 virtletPods: map[string]string{ 114 "kube-node-1": "virtlet-foo42", 115 "kube-node-2": "virtlet-bar42", 116 }, 117 expectedCommands: map[string]string{ 118 "virtlet-foo42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 119 "virtlet-bar42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 120 }, 121 wrap: func(bs []byte) gm.Verifier { return gm.NewJSONVerifier(bs) }, 122 }, 123 { 124 name: "yaml", 125 args: "-o yaml", 126 virtletPods: map[string]string{ 127 "kube-node-1": "virtlet-foo42", 128 "kube-node-2": "virtlet-bar42", 129 }, 130 expectedCommands: map[string]string{ 131 "virtlet-foo42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 132 "virtlet-bar42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 133 }, 134 wrap: func(bs []byte) gm.Verifier { return gm.NewYamlVerifier(bs) }, 135 }, 136 { 137 name: "client", 138 args: "--client", 139 virtletPods: map[string]string{ 140 "kube-node-1": "virtlet-foo42", 141 "kube-node-2": "virtlet-bar42", 142 }, 143 }, 144 { 145 name: "client+short", 146 args: "--client --short", 147 virtletPods: map[string]string{ 148 "kube-node-1": "virtlet-foo42", 149 "kube-node-2": "virtlet-bar42", 150 }, 151 }, 152 { 153 name: "client+json", 154 args: "--client -o json", 155 virtletPods: map[string]string{ 156 "kube-node-1": "virtlet-foo42", 157 "kube-node-2": "virtlet-bar42", 158 }, 159 wrap: func(bs []byte) gm.Verifier { return gm.NewJSONVerifier(bs) }, 160 }, 161 { 162 name: "client+yaml", 163 args: "--client -o yaml", 164 virtletPods: map[string]string{ 165 "kube-node-1": "virtlet-foo42", 166 "kube-node-2": "virtlet-bar42", 167 }, 168 wrap: func(bs []byte) gm.Verifier { return gm.NewYamlVerifier(bs) }, 169 }, 170 { 171 name: "inconsistent", 172 virtletPods: map[string]string{ 173 "kube-node-1": "virtlet-foo42", 174 "kube-node-2": "virtlet-bar42", 175 }, 176 expectedCommands: map[string]string{ 177 "virtlet-foo42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo), 178 "virtlet-bar42/virtlet/kube-system: virtlet --version --version-format json": versionInfoToString(nodeVersionInfo1), 179 }, 180 errSubstring: "some of the nodes have inconsistent Virtlet builds", 181 }, 182 { 183 name: "bad", 184 args: "-o foobar", 185 errSubstring: "bad version format", 186 noOutput: true, 187 }, 188 } { 189 t.Run(tc.name, func(t *testing.T) { 190 c := &fakeKubeClient{ 191 t: t, 192 virtletPods: tc.virtletPods, 193 expectedCommands: tc.expectedCommands, 194 } 195 var out bytes.Buffer 196 cmd := NewVersionCommand(c, &out, &clientVersionInfo) 197 if tc.args != "" { 198 cmd.SetArgs(strings.Split(tc.args, " ")) 199 } 200 cmd.SilenceUsage = true 201 cmd.SilenceErrors = true 202 switch err := cmd.Execute(); { 203 case err != nil && tc.errSubstring == "": 204 t.Fatalf("virsh command returned an unexpected error: %v", err) 205 case err == nil && tc.errSubstring != "": 206 t.Fatalf("Didn't get expected error (substring %q), output: %q", tc.errSubstring, out.String()) 207 case err != nil && !strings.Contains(err.Error(), tc.errSubstring): 208 t.Fatalf("Didn't get expected substring %q in the error: %v", tc.errSubstring, err) 209 case !tc.noOutput: 210 // ok 211 case tc.wrap != nil: 212 gm.Verify(t, tc.wrap(out.Bytes())) 213 default: 214 gm.Verify(t, out.Bytes()) 215 } 216 }) 217 } 218 }