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

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

XMLValidator: check tyre dimension when validating wheels

parent d7b83f4e
No related branches found
No related tags found
No related merge requests found
......@@ -32,13 +32,18 @@
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 Ninject;
using System.Xml.Xsl;
using NUnit.Framework;
using TUGraz.VectoCommon.Hashing;
using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore;
using TUGraz.VectoCore.InputData.FileIO.XML;
using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
......@@ -655,5 +660,207 @@ namespace VectoHashingTest
Assert.AreEqual(hashReadInterim3, inputDataProvider.MultistageJobInputData.JobInputData.ManufacturingStages[3].HashPreviousStep.DigestValue);
}
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();
//}
}
}
......@@ -36,7 +36,9 @@ using System.Linq;
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
{
......@@ -85,10 +87,27 @@ namespace TUGraz.VectoCore.Utils
if (_doc.SchemaInfo.Validity != XmlSchemaValidity.Valid ||
_doc.DocumentElement?.SchemaInfo == null ||
_doc.DocumentElement.SchemaInfo.SchemaType == null) {
ValidationCallBack(null, null);
_validationErrors.Add( 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;
}
_validationErrors.Add($"Invalid tyre dimension '{dimension.Trim()}'. Please check Wheels.csv for valid tyre dimensions.");
ValidationCallBack(this, null);
}
}
return _valid;
}
......@@ -96,8 +115,14 @@ namespace TUGraz.VectoCore.Utils
{
_resultAction(false);
_valid = false;
_validationErrors.Add(args?.Message ?? "no schema found");
_validationErrorAction(args?.Severity ?? XmlSeverityType.Error, new ValidationEvent { ValidationEventArgs = args });
var validationEvent = new ValidationEvent { ValidationEventArgs = args };
if (sender == this) {
//validationEvent = new ValidationEvent() { };
} else {
_validationErrors.Add(args?.Message ?? "no schema found");
_validationErrorAction(args?.Severity ?? XmlSeverityType.Error, new ValidationEvent { ValidationEventArgs = args });
}
_validationErrorAction(args?.Severity ?? XmlSeverityType.Error, validationEvent);
}
public string ValidationError => _validationErrors.Any() ? _validationErrors.Join(Environment.NewLine) : null;
......
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