github.com/vmware/govmomi@v0.37.1/simulator/object_test.go (about)

     1  /*
     2  Copyright (c) 2017 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 simulator
    18  
    19  import (
    20  	"context"
    21  	"testing"
    22  
    23  	"github.com/vmware/govmomi"
    24  	"github.com/vmware/govmomi/object"
    25  	"github.com/vmware/govmomi/simulator/esx"
    26  	"github.com/vmware/govmomi/vim25/types"
    27  )
    28  
    29  func TestObjectCustomFields(t *testing.T) {
    30  	ctx := context.Background()
    31  
    32  	m := VPX()
    33  	defer m.Remove()
    34  	err := m.Create()
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  
    39  	s := m.Service.NewServer()
    40  	defer s.Close()
    41  
    42  	c, err := govmomi.NewClient(ctx, s.URL, true)
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  
    47  	cfm, err := object.GetCustomFieldsManager(c.Client)
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  
    52  	vm := Map.Any("VirtualMachine").(*VirtualMachine)
    53  	vmm := object.NewVirtualMachine(c.Client, vm.Reference())
    54  
    55  	fieldName := "testField"
    56  	fieldValue := "12345"
    57  	updatedFieldValue := "67890"
    58  
    59  	// Test that field is not created
    60  	err = vmm.SetCustomValue(ctx, fieldName, fieldValue)
    61  	if err == nil {
    62  		t.Fatalf("expected error")
    63  	}
    64  
    65  	if len(vm.AvailableField) != 0 {
    66  		t.Fatalf("vm.AvailableField length expected 0, got %d", len(vm.AvailableField))
    67  	}
    68  
    69  	// Create field
    70  	field, err := cfm.Add(ctx, fieldName, vm.Reference().Type, nil, nil)
    71  	if err != nil {
    72  		t.Fatal(err)
    73  	}
    74  
    75  	if len(vm.AvailableField) != 1 {
    76  		t.Fatalf("len(vm.AvailableField) expected 1, got %d", len(vm.AvailableField))
    77  	}
    78  
    79  	if vm.AvailableField[0].Key != field.Key {
    80  		t.Fatalf("vm.AvailableField[0].Key expected %d, got %d", field.Key, vm.AvailableField[0].Key)
    81  	}
    82  	if vm.AvailableField[0].Name != field.Name {
    83  		t.Fatalf("vm.AvailableField[0].Name expected %s, got %s", field.Name, vm.AvailableField[0].Name)
    84  	}
    85  	if vm.AvailableField[0].Type != field.Type {
    86  		t.Fatalf("vm.AvailableField[0].Type expected %s, got %s", field.Type, vm.AvailableField[0].Type)
    87  	}
    88  	if vm.AvailableField[0].ManagedObjectType != field.ManagedObjectType {
    89  		t.Fatalf("vm.AvailableField[0].ManagedObjectType expected %s, got %s",
    90  			field.ManagedObjectType, vm.AvailableField[0].ManagedObjectType)
    91  	}
    92  	if vm.AvailableField[0].FieldDefPrivileges != field.FieldDefPrivileges {
    93  		t.Fatalf("vm.AvailableField[0].FieldDefPrivileges expected %s, got %s",
    94  			field.FieldDefPrivileges, vm.AvailableField[0].FieldDefPrivileges)
    95  	}
    96  	if vm.AvailableField[0].FieldInstancePrivileges != field.FieldInstancePrivileges {
    97  		t.Fatalf("vm.AvailableField[0].FieldInstancePrivileges expected %s, got %s",
    98  			field.FieldInstancePrivileges, vm.AvailableField[0].FieldInstancePrivileges)
    99  	}
   100  
   101  	// Test that field with duplicate name can't be created
   102  	_, err = cfm.Add(ctx, fieldName, vm.Reference().Type, nil, nil)
   103  	if err == nil {
   104  		t.Fatalf("expected error")
   105  	}
   106  
   107  	// Create second field
   108  	_, err = cfm.Add(ctx, fieldName+"2", vm.Reference().Type, nil, nil)
   109  	if err != nil {
   110  		t.Fatal(err)
   111  	}
   112  
   113  	if len(vm.AvailableField) != 2 {
   114  		t.Fatalf("len(vm.AvailableField) expected 2, got %d", len(vm.AvailableField))
   115  	}
   116  
   117  	testFieldValues := func(want string) {
   118  		if len(vm.CustomValue) != 1 {
   119  			t.Fatalf("len(vm.CustomValue) expected 1, got %d", len(vm.CustomValue))
   120  		}
   121  
   122  		if len(vm.Value) != 1 {
   123  			t.Fatalf("len(vm.Value) expected 1, got %d", len(vm.Value))
   124  		}
   125  
   126  		if vm.CustomValue[0].(*types.CustomFieldStringValue).Key != field.Key {
   127  			t.Fatalf("vm.CustomValue[0].Key expected %d, got %d",
   128  				field.Key, vm.CustomValue[0].(*types.CustomFieldStringValue).Key)
   129  		}
   130  		if vm.CustomValue[0].(*types.CustomFieldStringValue).Value != want {
   131  			t.Fatalf("vm.CustomValue[0].Value expected %s, got %s",
   132  				want, vm.CustomValue[0].(*types.CustomFieldStringValue).Value)
   133  		}
   134  
   135  		if vm.Value[0].(*types.CustomFieldStringValue).Key != field.Key {
   136  			t.Fatalf("vm.Value[0].Key expected %d, got %d",
   137  				field.Key, vm.Value[0].(*types.CustomFieldStringValue).Key)
   138  		}
   139  		if vm.Value[0].(*types.CustomFieldStringValue).Value != want {
   140  			t.Fatalf("vm.Value[0].Value expected %s, got %s",
   141  				want, vm.Value[0].(*types.CustomFieldStringValue).Value)
   142  		}
   143  	}
   144  
   145  	// Set field
   146  	err = vmm.SetCustomValue(ctx, fieldName, fieldValue)
   147  	if err != nil {
   148  		t.Fatal(err)
   149  	}
   150  	testFieldValues(fieldValue)
   151  
   152  	// Update field
   153  	err = vmm.SetCustomValue(ctx, fieldName, updatedFieldValue)
   154  	if err != nil {
   155  		t.Fatal(err)
   156  	}
   157  	testFieldValues(updatedFieldValue)
   158  
   159  	// Rename field
   160  	newName := field.Name + "_renamed"
   161  	err = cfm.Rename(ctx, field.Key, newName)
   162  	if err != nil {
   163  		t.Fatal(err)
   164  	}
   165  
   166  	if vm.AvailableField[0].Name != newName {
   167  		t.Fatalf("vm.AvailableField[0].Name expected %s, got %s", newName, vm.AvailableField[0].Name)
   168  	}
   169  
   170  	// Remove field
   171  	err = cfm.Remove(ctx, field.Key)
   172  	if err != nil {
   173  		t.Fatal(err)
   174  	}
   175  
   176  	if len(vm.AvailableField) != 1 {
   177  		t.Fatalf("len(vm.AvailableField) expected 1, got %d", len(vm.AvailableField))
   178  	}
   179  
   180  	if len(vm.CustomValue) != 0 {
   181  		t.Fatalf("len(vm.CustomValue) expected 0, got %d", len(vm.CustomValue))
   182  	}
   183  
   184  	if len(vm.Value) != 0 {
   185  		t.Fatalf("len(vm.Value) expected 0, got %d", len(vm.Value))
   186  	}
   187  
   188  	// Test that remaining field key is different from removed field
   189  	if vm.AvailableField[0].Key == field.Key {
   190  		t.Fatalf("vm.AvailableField[0].Key expected to not be equal %d", field.Key)
   191  	}
   192  
   193  	// Remove remaining field
   194  	err = cfm.Remove(ctx, vm.AvailableField[0].Key)
   195  	if err != nil {
   196  		t.Fatal(err)
   197  	}
   198  
   199  	if len(vm.AvailableField) != 0 {
   200  		t.Fatalf("len(vm.AvailableField) expected 0, got %d", len(vm.AvailableField))
   201  	}
   202  }
   203  
   204  func BenchmarkDeepCopy(b *testing.B) {
   205  	for i := 0; i < b.N; i++ {
   206  		config := new(types.HostConfigInfo)
   207  		deepCopy(esx.HostConfigInfo, config)
   208  	}
   209  }