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));
}
}
}