// // MonoTests.System.Xml.XsdValidatingReaderTests.cs // // Author: // Atsushi Enomoto // // (C)2003 Atsushi Enomoto // (C)2005-2007 Novell, Inc. // using System; using System.IO; using System.Net; using System.Xml; using System.Xml.Schema; using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] public class XsdValidatingReaderTests { public XsdValidatingReaderTests () { } XmlReader xtr; XmlValidatingReader xvr; private XmlValidatingReader PrepareXmlReader (string xml) { XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null); // XmlDocument doc = new XmlDocument (); // doc.LoadXml (xml); // XmlReader reader = new XmlNodeReader (doc); return new XmlValidatingReader (reader); } [Test] public void TestEmptySchema () { string xml = ""; xvr = PrepareXmlReader (xml); xvr.ValidationType = ValidationType.Schema; xvr.Read (); // Is is missing schema component. } [Test] public void TestSimpleValidation () { string xml = ""; xvr = PrepareXmlReader (xml); Assert.AreEqual (ValidationType.Auto, xvr.ValidationType); XmlSchema schema = new XmlSchema (); XmlSchemaElement elem = new XmlSchemaElement (); elem.Name = "root"; schema.Items.Add (elem); xvr.Schemas.Add (schema); xvr.Read (); // root Assert.AreEqual (ValidationType.Auto, xvr.ValidationType); xvr.Read (); // EOF xml = ""; xvr = PrepareXmlReader (xml); xvr.Schemas.Add (schema); try { xvr.Read (); Assert.Fail ("element mismatch is incorrectly allowed"); } catch (XmlSchemaException) { } xml = ""; xvr = PrepareXmlReader (xml); xvr.Schemas.Add (schema); try { xvr.Read (); Assert.Fail ("Element in different namespace is incorrectly allowed."); } catch (XmlSchemaException) { } } [Test] public void TestReadTypedValueSimple () { string xml = "12"; XmlSchema schema = new XmlSchema (); XmlSchemaElement elem = new XmlSchemaElement (); elem.Name = "root"; elem.SchemaTypeName = new XmlQualifiedName ("integer", XmlSchema.Namespace); schema.Items.Add (elem); // Lap 1: xvr = PrepareXmlReader (xml); xvr.Schemas.Add (schema); // Read directly from root. object o = xvr.ReadTypedValue (); Assert.AreEqual (ReadState.Initial, xvr.ReadState); Assert.IsNull (o); xvr.Read (); // element root Assert.AreEqual (XmlNodeType.Element, xvr.NodeType); Assert.IsNotNull (xvr.SchemaType); Assert.IsTrue (xvr.SchemaType is XmlSchemaDatatype); o = xvr.ReadTypedValue (); // read "12" Assert.AreEqual (XmlNodeType.EndElement, xvr.NodeType); Assert.IsNotNull (o); Assert.AreEqual (typeof (decimal), o.GetType ()); decimal n = (decimal) o; Assert.AreEqual (12, n); Assert.IsTrue (!xvr.EOF); Assert.AreEqual ("root", xvr.Name); Assert.IsNull (xvr.SchemaType); // EndElement's type // Lap 2: xvr = PrepareXmlReader (xml); xvr.Schemas.Add (schema); xvr.Read (); // root XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype; Assert.IsNotNull (dt); Assert.AreEqual (typeof (decimal), dt.ValueType); Assert.AreEqual (XmlTokenizedType.None, dt.TokenizedType); xvr.Read (); // text "12" Assert.IsNull (xvr.SchemaType); o = xvr.ReadTypedValue (); // ReadTypedValue is different from ReadString(). Assert.IsNull (o); } [Test] [Ignore ("XML Schema validator should not be available for validating non namespace-aware XmlReader that handled colon as a name character")] public void TestNamespacesFalse () { // This tests if Namespaces=false is specified, then // the reader's NamespaceURI should be always string.Empty and // validation should be done against such schema that has target ns as "". string xml = ""; xvr = PrepareXmlReader (xml); xvr.Namespaces = false; Assert.AreEqual (ValidationType.Auto, xvr.ValidationType); XmlSchema schema = new XmlSchema (); schema.TargetNamespace = "urn:foo"; XmlSchemaElement elem = new XmlSchemaElement (); elem.Name = "root"; schema.Items.Add (elem); xvr.Schemas.Add (schema); xvr.Read (); // root Assert.IsTrue (!xvr.Namespaces); Assert.AreEqual ("x:root", xvr.Name); // LocalName may contain colons. Assert.AreEqual ("x:root", xvr.LocalName); // NamespaceURI is not supplied. Assert.AreEqual ("", xvr.NamespaceURI); } [Test] public void TestReadTypedAttributeValue () { string xml = ""; XmlSchema schema = new XmlSchema (); XmlSchemaElement elem = new XmlSchemaElement (); elem.Name = "root"; XmlSchemaComplexType ct = new XmlSchemaComplexType (); XmlSchemaAttribute attr = new XmlSchemaAttribute (); attr.Name = "attr"; attr.SchemaTypeName = new XmlQualifiedName ("int", XmlSchema.Namespace); ct.Attributes.Add (attr); elem.SchemaType = ct; schema.Items.Add (elem); xvr = PrepareXmlReader (xml); xvr.Schemas.Add (schema); xvr.Read (); Assert.AreEqual ("root", xvr.Name); Assert.IsTrue (xvr.MoveToNextAttribute ()); // attr Assert.AreEqual ("attr", xvr.Name); XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype; Assert.IsNotNull (dt); Assert.AreEqual (typeof (int), dt.ValueType); Assert.AreEqual (XmlTokenizedType.None, dt.TokenizedType); object o = xvr.ReadTypedValue (); Assert.AreEqual (XmlNodeType.Attribute, xvr.NodeType); Assert.AreEqual (typeof (int), o.GetType ()); int n = (int) o; Assert.AreEqual (12, n); Assert.IsTrue (xvr.ReadAttributeValue ()); // can read = seems not proceed. } [Test] public void DuplicateSchemaAssignment () { string xml = @""; string xsd = @" "; string xmlns = "http://www.test.com/schemas/"; XmlValidatingReader xvr = new XmlValidatingReader ( xml, XmlNodeType.Document, null); XmlSchemaCollection schemas = new XmlSchemaCollection (); schemas.Add (XmlSchema.Read (new XmlTextReader ( xsd, XmlNodeType.Document, null), null)); xvr.Schemas.Add (schemas); while (!xvr.EOF) xvr.Read (); } [Test] // bug #76234 public void DTDValidatorNamespaceHandling () { string xml = " "; XmlValidatingReader vr = new XmlValidatingReader ( xml, XmlNodeType.Document, null); vr.Read (); vr.Read (); // whitespace Assert.AreEqual (String.Empty, vr.NamespaceURI, "#1"); vr.Read (); // foo Assert.AreEqual ("urn:a", vr.NamespaceURI, "#2"); vr.Read (); // whitespace vr.Read (); // a:bar Assert.AreEqual ("urn:a", vr.NamespaceURI, "#3"); vr.Read (); // whitespace vr.Read (); // bug Assert.AreEqual ("urn:a", vr.NamespaceURI, "#4"); } [Test] public void MultipleSchemaInSchemaLocation () { XmlTextReader xtr = new XmlTextReader ("Test/XmlFiles/xsd/multi-schemaLocation.xml"); XmlValidatingReader vr = new XmlValidatingReader (xtr); while (!vr.EOF) vr.Read (); } [Test] public void ReadTypedValueSimpleTypeRestriction () { string xml = "xx"; string xsd = @" "; XmlTextReader xir = new XmlTextReader (xml, XmlNodeType.Document, null); XmlTextReader xsr = new XmlTextReader (xsd, XmlNodeType.Document, null); XmlValidatingReader vr = new XmlValidatingReader (xir); vr.Schemas.Add (XmlSchema.Read (xsr, null)); vr.Read (); // root Assert.AreEqual ("xx", vr.ReadTypedValue ()); Assert.AreEqual (XmlNodeType.EndElement, vr.NodeType); } // If we normalize string before validating with facets, // this test will fail. It will also fail if ReadTypedValue() // ignores whitespace nodes. [Test] public void ReadTypedValueWhitespaces () { string xml = " "; string xsd = @" "; XmlTextReader xir = new XmlTextReader (xml, XmlNodeType.Document, null); XmlTextReader xsr = new XmlTextReader (xsd, XmlNodeType.Document, null); XmlValidatingReader vr = new XmlValidatingReader (xir); vr.Schemas.Add (XmlSchema.Read (xsr, null)); vr.Read (); // root Assert.AreEqual (" ", vr.ReadTypedValue ()); Assert.AreEqual (XmlNodeType.EndElement, vr.NodeType); } [Test] // bug #77241 public void EmptyContentAllowWhitespace () { string doc = @" "; string schema = @" "; XmlValidatingReader reader = new XmlValidatingReader ( new XmlTextReader (new StringReader (doc))); reader.Schemas.Add (null, new XmlTextReader (new StringReader (schema))); while (reader.Read ()) ; } [Test] // bug #79650 #if NET_2_0 // annoyance [ExpectedException (typeof (XmlSchemaValidationException))] #else [ExpectedException (typeof (XmlSchemaException))] #endif public void EnumerationFacetOnAttribute () { string xml = ""; XmlSchema schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/79650.xsd"), null); XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); xvr.ValidationType = ValidationType.Schema; xvr.Schemas.Add (schema); while (!xvr.EOF) xvr.Read (); } class XmlErrorResolver : XmlResolver { public override ICredentials Credentials { set { } } public override object GetEntity (Uri uri, string role, Type type) { throw new Exception (); } } [Test] // bug #79924 public void ValidationTypeNoneIgnoreSchemaLocations () { string xml = ""; XmlValidatingReader vr = new XmlValidatingReader ( new XmlTextReader (new StringReader (xml))); vr.ValidationType = ValidationType.None; vr.XmlResolver = new XmlErrorResolver (); while (!vr.EOF) vr.Read (); } [Test] // bug #336625 public void ValidationTypeNoneIgnoreLocatedSchemaErrors () { string xml = ""; XmlValidatingReader vr = new XmlValidatingReader ( new XmlTextReader (new StringReader (xml))); vr.ValidationType = ValidationType.None; while (!vr.EOF) vr.Read (); } [Test] public void Bug81360 () { string schemaFile = "Test/XmlFiles/xsd/81360.xsd"; XmlTextReader treader = new XmlTextReader (schemaFile); XmlSchema sc = XmlSchema.Read (treader, null); sc.Compile (null); string xml = @"
"; XmlTextReader reader = new XmlTextReader (new StringReader (xml)); XmlValidatingReader validator = new XmlValidatingReader (reader); validator.Schemas.Add (sc); validator.ValidationType = ValidationType.Schema; while (!validator.EOF) validator.Read (); } #if NET_2_0 [Test] public void Bug81460 () { string xsd = ""; string xml = ""; XmlReaderSettings s = new XmlReaderSettings (); s.ValidationType = ValidationType.Schema; s.Schemas.Add (XmlSchema.Read (new StringReader (xsd), null)); XmlReader r = XmlReader.Create (new StringReader (xml), s); r.Read (); r.MoveToFirstAttribute (); // default attribute Assert.AreEqual (String.Empty, r.Prefix); } #endif [Test] #if NET_2_0 // annoyance [ExpectedException (typeof (XmlSchemaValidationException))] #else [ExpectedException (typeof (XmlSchemaException))] #endif public void Bug82099 () { string xsd = @" "; XmlSchema schema = XmlSchema.Read (new StringReader (xsd), null); string xml = " "; #if NET_2_0 XmlReaderSettings settings = new XmlReaderSettings (); settings.Schemas.Add (schema); settings.ValidationType = ValidationType.Schema; XmlReader reader = XmlReader.Create (new StringReader (xml), settings); #else XmlValidatingReader reader = new XmlValidatingReader (xml, XmlNodeType.Document, null); reader.Schemas.Add (schema); reader.ValidationType = ValidationType.Schema; #endif reader.Read (); reader.Read (); reader.Read (); } [Test] public void Bug82010 () { string xmlfile = "Test/XmlFiles/xsd/82010.xml"; string xsdfile = "Test/XmlFiles/xsd/82010.xsd"; XmlTextReader xr = null, xr2 = null; try { xr = new XmlTextReader (xsdfile); xr2 = new XmlTextReader (xmlfile); XmlValidatingReader xvr = new XmlValidatingReader (xr2); xvr.Schemas.Add (XmlSchema.Read (xr, null)); while (!xvr.EOF) xvr.Read (); } finally { if (xr2 != null) xr2.Close (); if (xr != null) xr.Close (); } } [Test] public void Bug376395 () { string xmlfile = "Test/XmlFiles/xsd/376395.xml"; string xsdfile = "Test/XmlFiles/xsd/376395.xsd"; XmlTextReader xr = null, xr2 = null; try { xr = new XmlTextReader (xsdfile); xr2 = new XmlTextReader (xmlfile); XmlValidatingReader xvr = new XmlValidatingReader (xr2); xvr.Schemas.Add (XmlSchema.Read (xr, null)); while (!xvr.EOF) xvr.Read (); } finally { if (xr2 != null) xr2.Close (); if (xr != null) xr.Close (); } } [Test] public void ValidateMixedInsideXsdAny () { string xml = @" text text "; string xsd = @" "; XmlTextReader xtr = new XmlTextReader (new StringReader (xml)); XmlValidatingReader xvr = new XmlValidatingReader (xtr); XmlReader xsr = new XmlTextReader (new StringReader (xsd)); xvr.Schemas.Add (XmlSchema.Read (xsr, null)); while (!xvr.EOF) xvr.Read (); #if NET_2_0 xtr = new XmlTextReader (new StringReader (xml)); xsr = new XmlTextReader (new StringReader (xsd)); var s = new XmlReaderSettings (); s.Schemas.Add (XmlSchema.Read (xsr, null)); s.ValidationType = ValidationType.Schema; XmlReader xvr2 = XmlReader.Create (xtr, s); while (!xvr2.EOF) xvr2.Read (); #endif } #if NET_2_0 [Test] public void WhitespaceAndElementOnly () { string xsd = @" "; string xml = @" "; RunValidation (xml, xsd); } [Test] [ExpectedException (typeof (XmlSchemaValidationException))] public void EnumerationFacet () { // bug #339934 string xsd = @" "; string xml = @""; RunValidation (xml, xsd); } [Test] public void Bug501763 () { string xsd1 = @" "; string xsd2 = @" "; XmlDocument doc = new XmlDocument (); XmlSchema schema1 = XmlSchema.Read (XmlReader.Create (new StringReader (xsd1)), null); XmlSchema schema2 = XmlSchema.Read (XmlReader.Create (new StringReader (xsd2)), null); doc.LoadXml (@" "); doc.Schemas.Add (schema2); doc.Validate (null); doc = new XmlDocument(); doc.LoadXml(@" "); doc.Schemas.Add (schema2); doc.Schemas.Add (schema1); doc.Validate (null); } void RunValidation (string xml, string xsd) { XmlReaderSettings s = new XmlReaderSettings (); s.ValidationType = ValidationType.Schema; s.Schemas.Add (XmlSchema.Read (XmlReader.Create (new StringReader (xsd)), null)); XmlReader r = XmlReader.Create (new StringReader (xml), s); while (!r.EOF) r.Read (); } #endif } }