github.com/vmware/govmomi@v0.51.0/vim25/types/esxi_version_test.go (about) 1 // © Broadcom. All Rights Reserved. 2 // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 3 // SPDX-License-Identifier: Apache-2.0 4 5 package types 6 7 import ( 8 "fmt" 9 "sort" 10 "strconv" 11 "testing" 12 ) 13 14 func TestESXiVersion(t *testing.T) { 15 16 var uniqueExpectedVersions []ESXiVersion 17 18 type testCase struct { 19 name string 20 in string 21 expectedIsValid bool 22 expectedVersion ESXiVersion 23 expectedString string 24 expectedHardwareVersion HardwareVersion 25 } 26 27 testCasesForMajorVersion := func( 28 major int, 29 expectedVersion ESXiVersion, 30 expectedString string, 31 expectedHardwareVersion HardwareVersion) []testCase { 32 33 uniqueExpectedVersions = append(uniqueExpectedVersions, MustParseESXiVersion(expectedString)) 34 35 szMajor := strconv.Itoa(major) 36 return []testCase{ 37 { 38 name: szMajor, 39 in: szMajor, 40 expectedIsValid: true, 41 expectedVersion: expectedVersion, 42 expectedString: expectedString, 43 expectedHardwareVersion: expectedHardwareVersion, 44 }, 45 { 46 name: szMajor + ".0", 47 in: szMajor + ".0", 48 expectedIsValid: true, 49 expectedVersion: expectedVersion, 50 expectedString: expectedString, 51 expectedHardwareVersion: expectedHardwareVersion, 52 }, 53 { 54 name: szMajor + ".0.0", 55 in: szMajor + ".0.0", 56 expectedIsValid: true, 57 expectedVersion: expectedVersion, 58 expectedString: expectedString, 59 expectedHardwareVersion: expectedHardwareVersion, 60 }, 61 } 62 } 63 64 testCasesForMajorMinorVersion := func( 65 major, minor int, 66 expectedVersion ESXiVersion, 67 expectedString string, 68 expectedHardwareVersion HardwareVersion) []testCase { 69 70 uniqueExpectedVersions = append(uniqueExpectedVersions, MustParseESXiVersion(expectedString)) 71 72 szMajor := strconv.Itoa(major) 73 szMinor := strconv.Itoa(minor) 74 75 return []testCase{ 76 { 77 name: szMajor + "." + szMinor, 78 in: szMajor + "." + szMinor, 79 expectedIsValid: true, 80 expectedVersion: expectedVersion, 81 expectedString: expectedString, 82 expectedHardwareVersion: expectedHardwareVersion, 83 }, 84 { 85 name: szMajor + "." + szMinor + ".0", 86 in: szMajor + "." + szMinor + ".0", 87 expectedIsValid: true, 88 expectedVersion: expectedVersion, 89 expectedString: expectedString, 90 expectedHardwareVersion: expectedHardwareVersion, 91 }, 92 } 93 } 94 95 testCasesForMajorMinorUpdateVersion := func( 96 major, minor, update int, 97 expectedVersion ESXiVersion, 98 expectedString string, 99 expectedHardwareVersion HardwareVersion) []testCase { 100 101 uniqueExpectedVersions = append(uniqueExpectedVersions, MustParseESXiVersion(expectedString)) 102 103 szMajor := strconv.Itoa(major) 104 szMinor := strconv.Itoa(minor) 105 szUpdate := strconv.Itoa(update) 106 107 return []testCase{ 108 { 109 name: szMajor + "." + szMinor + "." + szUpdate, 110 in: szMajor + "." + szMinor + "." + szUpdate, 111 expectedIsValid: true, 112 expectedVersion: expectedVersion, 113 expectedString: expectedString, 114 expectedHardwareVersion: expectedHardwareVersion, 115 }, 116 { 117 name: szMajor + "." + szMinor + "u" + szUpdate, 118 in: szMajor + "." + szMinor + "u" + szUpdate, 119 expectedIsValid: true, 120 expectedVersion: expectedVersion, 121 expectedString: expectedString, 122 expectedHardwareVersion: expectedHardwareVersion, 123 }, 124 { 125 name: szMajor + "." + szMinor + "U" + szUpdate, 126 in: szMajor + "." + szMinor + "U" + szUpdate, 127 expectedIsValid: true, 128 expectedVersion: expectedVersion, 129 expectedString: expectedString, 130 expectedHardwareVersion: expectedHardwareVersion, 131 }, 132 { 133 name: szMajor + "." + szMinor + " u" + szUpdate, 134 in: szMajor + "." + szMinor + " u" + szUpdate, 135 expectedIsValid: true, 136 expectedVersion: expectedVersion, 137 expectedString: expectedString, 138 expectedHardwareVersion: expectedHardwareVersion, 139 }, 140 { 141 name: szMajor + "." + szMinor + " U" + szUpdate, 142 in: szMajor + "." + szMinor + " U" + szUpdate, 143 expectedIsValid: true, 144 expectedVersion: expectedVersion, 145 expectedString: expectedString, 146 expectedHardwareVersion: expectedHardwareVersion, 147 }, 148 } 149 } 150 151 testCases := []testCase{ 152 { 153 name: "EmptyString", 154 in: "", 155 }, 156 { 157 name: "InvalidMajorVersion", 158 in: "1", 159 }, 160 { 161 name: "ValidMajorInvalidMinorVersion", 162 in: "2.1", 163 }, 164 { 165 name: "ValidMajorValidMinorInvalidPatchVersion", 166 in: "7.0.5", 167 }, 168 { 169 name: "ValidMajorValidMinorInvalidUpdateVersion", 170 in: "7.0U5", 171 }, 172 { 173 name: "ValidMajorValidMinorValidPatchInvalidUpdateVersion", 174 in: "7.0.0U5", 175 }, 176 } 177 178 testCases = append(testCases, testCasesForMajorVersion(2, ESXi2000, "2", VMX3)...) 179 testCases = append(testCases, testCasesForMajorVersion(3, ESXi3000, "3", VMX4)...) 180 testCases = append(testCases, testCasesForMajorVersion(4, ESXi4000, "4", VMX7)...) 181 testCases = append(testCases, testCasesForMajorVersion(5, ESXi5000, "5.0", VMX8)...) 182 testCases = append(testCases, testCasesForMajorMinorVersion(5, 1, ESXi5100, "5.1", VMX9)...) 183 testCases = append(testCases, testCasesForMajorMinorVersion(5, 5, ESXi5500, "5.5", VMX10)...) 184 testCases = append(testCases, testCasesForMajorVersion(6, ESXi6000, "6.0", VMX11)...) 185 testCases = append(testCases, testCasesForMajorMinorVersion(6, 5, ESXi6500, "6.5", VMX13)...) 186 testCases = append(testCases, testCasesForMajorMinorVersion(6, 7, ESXi6700, "6.7", VMX14)...) 187 testCases = append(testCases, testCasesForMajorMinorUpdateVersion(6, 7, 2, ESXi6720, "6.7.2", VMX15)...) 188 testCases = append(testCases, testCasesForMajorVersion(7, ESXi7000, "7.0", VMX17)...) 189 testCases = append(testCases, testCasesForMajorMinorUpdateVersion(7, 0, 1, ESXi7010, "7.0.1", VMX18)...) 190 testCases = append(testCases, testCasesForMajorMinorUpdateVersion(7, 0, 2, ESXi7020, "7.0.2", VMX19)...) 191 testCases = append(testCases, testCasesForMajorVersion(8, ESXi8000, "8.0", VMX20)...) 192 testCases = append(testCases, testCasesForMajorMinorUpdateVersion(8, 0, 1, ESXi8010, "8.0.1", VMX20)...) 193 testCases = append(testCases, testCasesForMajorMinorUpdateVersion(8, 0, 2, ESXi8020, "8.0.2", VMX21)...) 194 195 t.Run("GetESXiVersions", func(t *testing.T) { 196 a, e := uniqueExpectedVersions, GetESXiVersions() 197 sort.Slice(a, func(i, j int) bool { return a[i] < a[j] }) 198 sort.Slice(e, func(i, j int) bool { return e[i] < e[j] }) 199 if a, e := len(a), len(e); a != e { 200 t.Errorf("unexpected number of versions: a=%d, e=%d", a, e) 201 } 202 for i := range a { 203 if a[i] != e[i] { 204 t.Errorf("unexpected version: i=%d, a=%s, e=%s", i, a, e) 205 } 206 } 207 }) 208 209 t.Run("ParseESXiVersion", func(t *testing.T) { 210 for i := range testCases { 211 tc := testCases[i] 212 t.Run(tc.name, func(t *testing.T) { 213 v, err := ParseESXiVersion(tc.in) 214 if err != nil && tc.expectedIsValid { 215 t.Fatalf("unexpected error: %v", err) 216 } 217 if a, e := v.IsValid(), tc.expectedIsValid; a != e { 218 t.Errorf("unexpected invalid value: a=%v, e=%v", a, e) 219 } 220 if tc.expectedIsValid { 221 if a, e := v, tc.expectedVersion; a != e { 222 t.Errorf("unexpected value: a=%v, e=%v", a, e) 223 } 224 if a, e := v.String(), tc.expectedString; a != e { 225 t.Errorf("unexpected string: a=%v, e=%v", a, e) 226 } 227 if a, e := v.IsHardwareVersionSupported(tc.expectedHardwareVersion), true; a != e { 228 t.Errorf("is hardware version supported failed for %s", tc.expectedHardwareVersion) 229 } 230 if a, e := v.HardwareVersion(), tc.expectedHardwareVersion; a != e { 231 t.Errorf("unexpected hardware version: a=%s, e=%s", a, e) 232 } 233 } 234 }) 235 } 236 }) 237 t.Run("MarshalText", func(t *testing.T) { 238 for i := range testCases { 239 tc := testCases[i] 240 t.Run(tc.name, func(t *testing.T) { 241 data, err := tc.expectedVersion.MarshalText() 242 if err != nil { 243 t.Fatalf("unexpected error marshaling text: %v", err) 244 } 245 if a, e := string(data), tc.expectedString; a != e { 246 t.Errorf("unexpected data marshaling text: %s", a) 247 } 248 }) 249 } 250 }) 251 252 t.Run("UnmarshalText", func(t *testing.T) { 253 for i := range testCases { 254 tc := testCases[i] 255 t.Run(tc.name, func(t *testing.T) { 256 var ( 257 data = []byte(tc.in) 258 v ESXiVersion 259 ) 260 if err := v.UnmarshalText(data); err != nil { 261 if !tc.expectedIsValid { 262 if a, e := err.Error(), fmt.Sprintf("invalid version: %q", tc.in); a != e { 263 t.Errorf("unexpected error unmarshaling text: %q", a) 264 } 265 } else { 266 t.Errorf("unexpected error unmarshaling text: %v", err) 267 } 268 } else if a, e := v, v; a != e { 269 t.Errorf("unexpected data unmarshaling text: %s", a) 270 } 271 }) 272 } 273 }) 274 }