using System.IO; using System.Xml; using Xunit; using PSProxmoxVE.Core.Models.Vms; namespace PSProxmoxVE.Core.Tests.Models { public class OvfMetadataTests { private const string OvfHeader = ""; private static string BuildDescriptor(string href, int controllerResourceType) { return OvfHeader + "" + "" + "" + "" + "" + "1" + "" + controllerResourceType + "" + "" + "" + "2" + "17" + "1" + "ovf:/disk/vmdisk1" + "" + "" + "" + ""; } [Fact] public void ParseOvfXml_VMwareScsiController_ResourceType6_MapsToScsi() { var xml = BuildDescriptor("disk1.vmdk", 6); var metadata = OvfMetadata.ParseOvfXml(xml); Assert.Single(metadata.Disks); Assert.Equal("scsi", metadata.Disks[0].BusType); } [Fact] public void ParseOvfXml_VMwareSataController_ResourceType20_MapsToSata() { var xml = BuildDescriptor("disk1.vmdk", 20); var metadata = OvfMetadata.ParseOvfXml(xml); Assert.Single(metadata.Disks); Assert.Equal("sata", metadata.Disks[0].BusType); } [Fact] public void ParseOvfXml_HrefWithEmbeddedProperty_Throws() { var xml = BuildDescriptor("d.vmdk,cache=unsafe", 6); Assert.Throws(() => OvfMetadata.ParseOvfXml(xml)); } [Fact] public void ParseOvfXml_HrefWithPathTraversal_Throws() { var xml = BuildDescriptor("../x.vmdk", 6); Assert.Throws(() => OvfMetadata.ParseOvfXml(xml)); } [Fact] public void ParseOvfXml_HrefIsDotDot_Throws() { var xml = BuildDescriptor("..", 6); Assert.Throws(() => OvfMetadata.ParseOvfXml(xml)); } [Fact] public void ParseOvfXml_HrefIsDot_Throws() { var xml = BuildDescriptor(".", 6); Assert.Throws(() => OvfMetadata.ParseOvfXml(xml)); } [Fact] public void ParseOvfXml_DescriptorWithInternalEntity_Throws() { var xml = "" + "]>" + OvfHeader + "" + ""; Assert.ThrowsAny(() => OvfMetadata.ParseOvfXml(xml)); } } }