Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 6616bec9 authored by Markus QUARITSCH's avatar Markus QUARITSCH
Browse files

extending xml validation to check it the tyre dimension is valid

parent aa6d2d5f
No related branches found
No related tags found
No related merge requests found
......@@ -32,11 +32,16 @@
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml.XPath;
using System.Xml.Xsl;
using NUnit.Framework;
using TUGraz.VectoCommon.Hashing;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Utils;
using TUGraz.VectoHashing;
using VectoHashingTest.Utils;
......@@ -523,5 +528,207 @@ namespace VectoHashingTest
var h = VectoHash.Load(file);
Assert.IsTrue(h.ValidateHash());
}
private const string WheelsFileToHash25 = @"Testdata\XML\ToHash\Tyre_v25.xml";
[TestCase(WheelsFileToHash25)]
public void TestTyreValidDimension(string file)
{
var validDimensions = DeclarationData.Wheels.GetWheelsDimensions();
foreach (var dimension in validDimensions) {
var modified = GetModifiedXML(file, dimension);
var xmlDoc = new XmlDocument();
xmlDoc.Load(modified);
var h = VectoHash.Load(xmlDoc);
var hashed = h.AddHash();
var validator = new XMLValidator(XmlReader.Create(new StringReader(hashed.ToString())));
Assert.IsTrue(validator.ValidateXML(XmlDocumentType.DeclarationComponentData));
}
}
[
TestCase(WheelsFileToHash25, "255/70 R22.5", "255/70 R22.5"),
TestCase(WheelsFileToHash25, "255/70 R22.5", " 255/70 R22.5"),
TestCase(WheelsFileToHash25, "255/70 R22.5", "255/70 R22.5 "),
TestCase(WheelsFileToHash25, "255/70 R22.5", "255/70 R22.5"),
TestCase(WheelsFileToHash25, " 255/70 R22.5", "255/70 R22.5"),
TestCase(WheelsFileToHash25, "255/70 R22.5 ", "255/70 R22.5"),
]
public void TestTyreValidDimensionVariationHash(string file, string dimension, string dimensionVaried)
{
// create XML with dimension string and hash it
var reference = GetModifiedXML(file, dimension);
var xmlDoc = new XmlDocument();
xmlDoc.Load(reference);
var h = VectoHash.Load(xmlDoc);
var hashed = h.AddHash();
// created XML needs to be valid
var validator = new XMLValidator(XmlReader.Create(new StringReader(hashed.ToString())));
Assert.IsTrue(validator.ValidateXML(XmlDocumentType.DeclarationComponentData));
// change the dimension string to something else and load the modified XML
var variation = GetModifiedXML(hashed, dimensionVaried);
var xmlDocV = new XmlDocument();
xmlDocV.Load(variation);
var h2 = VectoHash.Load(xmlDocV);
// the hash has to be valid
var variationValid = h2.ValidateHash();
Assert.IsTrue(variationValid);
var validatorV = new XMLValidator(xmlDocV);
Assert.IsTrue(validatorV.ValidateXML(XmlDocumentType.DeclarationComponentData));
}
[
TestCase(WheelsFileToHash25, "255/70 R22.5 ", "255/70 R22.5"), // the hash is still the same but the tyre dimension is invalid
//TestCase(WheelsFileToHash25, "255/70 R22.5 ", "255/70 R 22.5"),
//TestCase(WheelsFileToHash25, "255/70 R22.5 ", "255 / 70 R 22.5"),
]
public void TestTyreInvalidDimensionVariationHash(string file, string dimension, string dimensionVaried)
{
// create XML with dimension string and hash it
var reference = GetModifiedXML(file, dimension);
var xmlDoc = new XmlDocument();
xmlDoc.Load(reference);
var h = VectoHash.Load(xmlDoc);
var hashed = h.AddHash();
// created XML needs to be valid
var validator = new XMLValidator(XmlReader.Create(new StringReader(hashed.ToString())));
Assert.IsTrue(validator.ValidateXML(XmlDocumentType.DeclarationComponentData));
// change the dimension string to something else and load the modified XML
var variation = GetModifiedXML(hashed, dimensionVaried);
var xmlDocV = new XmlDocument();
xmlDocV.Load(variation);
var h2 = VectoHash.Load(xmlDocV);
// the hash has to be valid
var variationValid = h2.ValidateHash();
Assert.IsTrue(variationValid);
var message = "";
var validatorV = new XMLValidator(xmlDocV, validationErrorAction: (s, ve) => message = ve.Exception.Message);
var result = validatorV.ValidateXML(XmlDocumentType.DeclarationComponentData);
Assert.IsFalse(result);
Assert.IsTrue(message.Contains("Invalid tyre dimension"));
}
[
TestCase(WheelsFileToHash25, "255/70 R22.5", "255/70 R 22.5"),
TestCase(WheelsFileToHash25, "255/70 R22.5", "255 / 70 R 22.5"),
]
public void TestTyreIDimensionVariationInvalidHash(string file, string dimension, string dimensionVaried)
{
// create XML with dimension string and hash it
var reference = GetModifiedXML(file, dimension);
var xmlDoc = new XmlDocument();
xmlDoc.Load(reference);
var h = VectoHash.Load(xmlDoc);
var hashed = h.AddHash();
// created XML needs to be valid
var validator = new XMLValidator(XmlReader.Create(new StringReader(hashed.ToString())));
Assert.IsTrue(validator.ValidateXML(XmlDocumentType.DeclarationComponentData));
// change the dimension string to something else and load the modified XML
var variation = GetModifiedXML(hashed, dimensionVaried);
var xmlDocV = new XmlDocument();
xmlDocV.Load(variation);
var h2 = VectoHash.Load(xmlDocV);
// the hash is no longer valid
var variationValid = h2.ValidateHash();
Assert.IsFalse(variationValid);
}
[
TestCase(WheelsFileToHash25, "asdf"),
TestCase(WheelsFileToHash25, "250/70R14XX"),
TestCase(WheelsFileToHash25, "V425/55 R19.5"),
TestCase(WheelsFileToHash25, "425 / 55 R 19.5"),
TestCase(WheelsFileToHash25, "255 / 70 R22.5"),
TestCase(WheelsFileToHash25, "255/70 R22.5"),
TestCase(WheelsFileToHash25, " 255/70 R22.5 "),
TestCase(WheelsFileToHash25, " 255/70 R22.5 "),
TestCase(WheelsFileToHash25, "255/70 R22.5"),
]
public void TestTyreInValidDimension(string file, string dimension)
{
var modified = GetModifiedXML(file, dimension);
var xmlDoc = new XmlDocument();
xmlDoc.Load(modified);
var h = VectoHash.Load(xmlDoc);
var hashed = h.AddHash();
string message = "";
var validator = new XMLValidator(XmlReader.Create(new StringReader(hashed.ToString())),
validationErrorAction: (s, ve) => message = ve.Exception.Message);
var result = validator.ValidateXML(XmlDocumentType.DeclarationComponentData);
Assert.IsFalse(result);
Assert.IsTrue(message.Contains("Invalid tyre dimension"));
}
private XmlReader GetModifiedXML(XDocument doc, string dimension)
{
var tyreDimension = doc.XPathSelectElement("//*[local-name()='Dimension']");
Assert.NotNull(tyreDimension);
tyreDimension.Value = dimension;
var xmlString = "";
using (MemoryStream ms = new MemoryStream()) {
using (XmlWriter xw = XmlWriter.Create(ms, new XmlWriterSettings { Indent = true })) {
doc.WriteTo(xw);
xw.Flush();
}
ms.Flush();
ms.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(ms)) {
xmlString = reader.ReadToEnd();
}
}
var modified = XmlReader.Create(new StringReader(xmlString));
return modified;
}
private XmlReader GetModifiedXML(string file, string dimension)
{
var inputXml = new XmlDocument();
inputXml.Load(file);
var tyreDimension = inputXml.SelectSingleNode("//*[local-name()='Dimension']");
Assert.NotNull(tyreDimension);
tyreDimension.InnerText = dimension;
var modified = XmlReader.Create(new StringReader(inputXml.OuterXml));
return modified;
}
// [TestCase()]
//public void TestXSLTransform()
//{
// var dimension = " 425 / 55 R 19.5 ";
// var modified = GetModifiedXML(WheelsFileToHash25, dimension);
// var xmlDoc = new XmlDocument();
// xmlDoc.Load(modified);
// var transform = new XmlDsigExcC14NTransform();
// transform.LoadInput(xmlDoc);
// var output = transform.GetOutput() as Stream;
// var sr = new StreamReader(output);
// var xml = sr.ReadToEnd();
//}
}
}
......@@ -38,7 +38,9 @@ using System.Threading.Tasks;
using System.Xml;
using System.Xml.Schema;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Resources;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Declaration;
namespace TUGraz.VectoCore.Utils
{
......@@ -74,6 +76,7 @@ namespace TUGraz.VectoCore.Utils
public bool ValidateXML(XmlDocumentType docType)
{
_valid = true;
InternalValidationMessage = "";
if (_doc.DocumentElement == null) {
throw new Exception("empty XML document");
}
......@@ -84,18 +87,43 @@ namespace TUGraz.VectoCore.Utils
if (_doc.SchemaInfo.Validity != XmlSchemaValidity.Valid || _doc.DocumentElement?.SchemaInfo == null ||
_doc.DocumentElement.SchemaInfo.SchemaType == null) {
ValidationCallBack(null, null);
InternalValidationMessage = string.Format("XML file does not validate against a supported version of {0}", docType);
ValidationCallBack(this, null);
_valid = false;
}
var tyreNodes = _doc.SelectNodes(XMLHelper.QueryLocalName(XMLNames.AxleWheels_Axles_Axle_Tyre,
XMLNames.ComponentDataWrapper, XMLNames.AxleWheels_Axles_Axle_Dimension));
if (tyreNodes != null) {
foreach (XmlNode tyreNode in tyreNodes) {
var dimension = tyreNode.InnerText;
var validDimension = DeclarationData.Wheels.GetWheelsDimensions().Contains(dimension.Trim());
if (validDimension) {
continue;
}
InternalValidationMessage =
$"Invalid tyre dimension '{dimension.Trim()}'. Please check Wheels.csv for valid tyre dimensions.";
ValidationCallBack(this, null);
}
}
return _valid;
}
protected string InternalValidationMessage { get; set; }
private void ValidationCallBack(object sender, ValidationEventArgs args)
{
_resultAction(false);
_valid = false;
_validationErrorAction(args?.Severity ?? XmlSeverityType.Error, new ValidationEvent { ValidationEventArgs = args });
var validationEvent = new ValidationEvent { ValidationEventArgs = args };
if (sender == this) {
validationEvent = new ValidationEvent()
{ Exception = new VectoXMLException(InternalValidationMessage) };
}
_validationErrorAction(args?.Severity ?? XmlSeverityType.Error, validationEvent);
}
public static void CallBackExceptionOnError(XmlSeverityType severity, ValidationEvent evt)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment