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  }