diff --git a/vim/property_value.go b/vim/property_value.go index 36523b7..eaccc83 100644 --- a/vim/property_value.go +++ b/vim/property_value.go @@ -17,11 +17,14 @@ type PropertyValue struct { func (pv *PropertyValue) Value() (interface{}, error) { vimType := pv.Type - if getTypeInstance, ok := registry[vimType]; ok { - v := getTypeInstance() + if getInstance, ok := registry[vimType]; ok { + v := getInstance() - data := []byte("" + pv.Xml + "") - err := xml.Unmarshal(data, v) + // We need to make sure the unmarshalled value has its vSphere type + // when it is not an actual XML document + valueXml := fmt.Sprintf(`%s`, pv.Type, pv.Xml) + valueBytes := []byte(valueXml) + err := xml.Unmarshal(valueBytes, v) if err != nil { return nil, err } diff --git a/vim/property_value_test.go b/vim/property_value_test.go index 4a55ae1..1e83653 100644 --- a/vim/property_value_test.go +++ b/vim/property_value_test.go @@ -1,6 +1,7 @@ package vim import ( + "encoding/xml" "fmt" "path/filepath" "reflect" @@ -63,3 +64,60 @@ func TestArrayOfString(t *testing.T) { assert(t, objs[0] == "Datacenter", fmt.Sprintf("%s != %s\n", objs[0], "Datacenter")) assert(t, objs[1] == "Alarm", fmt.Sprintf("%s != %s\n", objs[1], "Alarm")) } + +func TestUnmarshalPropertyValue(t *testing.T) { + tests := []struct { + value string + expType string + expValue string + }{ + {` + ha-datacenter + + vmFolder + ha-folder-vm + + `, + "Folder", + "ha-folder-vm", + }, + {` + ha-folder-vm + + childEntity + 1 + + `, + "ArrayOfManagedObjectReference", + `1`, + }, + } + + for _, tt := range tests { + var obj ObjectContent + err := xml.Unmarshal([]byte(tt.value), &obj) + ok(t, err) + + motype := obj.PropSet[0].Val.Type + movalue := obj.PropSet[0].Val.Xml + assert(t, motype == tt.expType, "%s != %s", motype, tt.expType) + assert(t, movalue == tt.expValue, "%s != %s", movalue, tt.expValue) + } +} + +func TestFixForIssue14(t *testing.T) { + data := ` + ha-datacenter + + vmFolder + ha-folder-vm + + ` + var obj ObjectContent + err := xml.Unmarshal([]byte(data), &obj) + ok(t, err) + value, err := obj.PropSet[0].Val.Value() + ok(t, err) + folder := value.(*Folder) + assert(t, folder.Type == "Folder", "%s != %s", folder.Type, "Folder") +}