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 }