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