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  }