github.com/vmware/govmomi@v0.37.2/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  }