-
Notifications
You must be signed in to change notification settings - Fork 4.8k
Determine the anyAttribute Namespace based on the NamespaceList #37409
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -5,6 +5,7 @@ | |
| using Xunit; | ||
| using Xunit.Abstractions; | ||
| using System.IO; | ||
| using System.Linq; | ||
| using System.Xml.Schema; | ||
|
|
||
| namespace System.Xml.Tests | ||
|
|
@@ -121,14 +122,28 @@ public XmlSchema GetIntersectionSchema(string ns1, string ns2, string attrNs) | |
| return XmlSchema.Read(new StringReader(xsd), null); | ||
| } | ||
|
|
||
| public XmlSchema GetSimpleSchema(string ns, string attrNs) | ||
| { | ||
| var xsd = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='" + attrNs + @"' xmlns='" + attrNs + @"'> | ||
| <xs:complexType name = 't'> | ||
| <xs:sequence > | ||
| <xs:element name = 'e1' type = 'xs:string' /> | ||
| </xs:sequence > | ||
| <xs:anyAttribute namespace='" + ns + @"'/> | ||
| </xs:complexType> | ||
| </xs:schema>"; | ||
|
|
||
| return XmlSchema.Read(new StringReader(xsd), null); | ||
| } | ||
|
|
||
| //Intersection namespaces | ||
| [Theory] | ||
| //[Variation(Desc = "complextype Any ns - ##any, attrgroup Any ns2, allow ns2 attribute")] | ||
| [InlineData("##any", "ns2", "ns2", 0)] | ||
| [InlineData("##any", "ns2", "ns2", 0, "##targetNamespace")] | ||
| //[Variation(Desc = "complextype Any ns - ##any, attrgroup Any ns2, not allow ns1 attribute")] | ||
| [InlineData("##any", "ns2", "ns1", 1)] | ||
| //[Variation(Desc = "complextype Any ns - ns2, attrgroup Any ##any, allow ns2 attribute")] | ||
| [InlineData("ns2", "##any", "ns2", 0)] | ||
| [InlineData("ns2", "##any", "ns2", 0, "##targetNamespace")] | ||
| //[Variation(Desc = "complextype Any ns - ns2, attrgroup Any ##any, not allow ns1 attribute")] | ||
| [InlineData("ns2", "##any", "ns1", 1)] | ||
| //[Variation(Desc = "complextype Any ns - ns1 ns2, attrgroup Any ##other, not allow ns1 attribute")] | ||
|
|
@@ -148,10 +163,10 @@ public XmlSchema GetIntersectionSchema(string ns1, string ns2, string attrNs) | |
| //[Variation(Desc = "complextype Any ns - ns1 ns3, attrgroup Any ns1 ns2, not allow ns2 attribute")] | ||
| [InlineData("ns1 ns3", "ns1 ns2", "ns2", 1)] | ||
| //[Variation(Desc = "complextype Any ns - ns1 ns3, attrgroup Any ns1 ns2, allow ns1 attribute")] | ||
| [InlineData("ns1 ns3", "ns1 ns2", "ns1", 0)] | ||
| [InlineData("ns1 ns3", "ns1 ns2", "ns1", 0, "ns1")] | ||
| //[Variation(Desc = "complextype Any ns - ##other, attrgroup Any ##other, not allow ns1 attribute")] | ||
| [InlineData("##other", "##other", "ns1", 1)] | ||
| public void v1(string ns1, string ns2, string attrNs, int expectedError) | ||
| public void v1(string ns1, string ns2, string attrNs, int expectedError, string expectedNs = null) | ||
| { | ||
| XmlSchemaSet xss = new XmlSchemaSet(); | ||
| xss.XmlResolver = new XmlUrlResolver(); | ||
|
|
@@ -160,26 +175,33 @@ public void v1(string ns1, string ns2, string attrNs, int expectedError) | |
| xss.Compile(); | ||
|
|
||
| Assert.Equal(expectedError, _errorCount); | ||
|
|
||
| // Full framework does not set the namespace property for intersections and unions | ||
| if (!PlatformDetection.IsFullFramework && expectedNs != null) | ||
| { | ||
| XmlSchemaAnyAttribute attributeWildcard = ((XmlSchemaComplexType)xss.GlobalTypes[new XmlQualifiedName("t", attrNs)]).AttributeWildcard; | ||
| CompareWildcardNamespaces(expectedNs, attributeWildcard.Namespace); | ||
| } | ||
| } | ||
|
|
||
| [Theory] | ||
| //[Variation(Desc = "basetype Any ns - ##any, derivedType Any ns - ns1, allow ns2 attribute")] | ||
| [InlineData("##any", "ns1", "ns2", 0)] | ||
| [InlineData("##any", "ns1", "ns2", 0, "##any")] | ||
| //[Variation(Desc = "basetype Any ns - ns1, derivedType Any ns - ##any, allow ns2 attribute")] | ||
| [InlineData("ns1", "##any", "ns2", 0)] | ||
| [InlineData("ns1", "##any", "ns2", 0, "##any")] | ||
| //[Variation(Desc = "basetype Any ns - ns1 ns2, derivedType Any ns - ns2 ns3 , allow ns3 attribute")] | ||
| [InlineData("ns1 ns2", "ns2 ns3", "ns3", 0)] | ||
| [InlineData("ns1 ns2", "ns2 ns3", "ns3", 0, "ns1 ns2 ##targetNamespace")] | ||
| //[Variation(Desc = "basetype Any ns - ##other, derivedType Any ns - ##other , not allow current ns")] | ||
| [InlineData("##other", "##other", "ns1", 1)] | ||
| //[Variation(Desc = "basetype Any ns - ns1 ns2, derivedType Any ns - ##other , allow ns1")] | ||
| [InlineData("ns1 ns2", "##other", "ns1", 0)] | ||
| [InlineData("ns1 ns2", "##other", "ns1", 0, "##other")] | ||
| //[Variation(Desc = "basetype Any ns - ns1 ns2, derivedType Any ns - ##other , allow ns2")] | ||
| [InlineData("ns1 ns2", "##other", "ns2", 0)] | ||
| [InlineData("ns1 ns2", "##other", "ns2", 0, "##other")] | ||
| //[Variation(Desc = "basetype Any ns - ##other, derivedType Any ns - ns1 ns2 , allow ns2")] | ||
| [InlineData("##other", "ns1 ns2", "ns1", 0)] | ||
| [InlineData("##other", "ns1 ns2", "ns1", 0, "##other")] | ||
| //[Variation(Desc = "basetype Any ns - ##other, derivedType Any ns - ns1 ns2 , allow ns2")] | ||
| [InlineData("##other", "ns1 ns2", "ns2", 0)] | ||
| public void v2(string ns1, string ns2, string attrNs, int expectedError) | ||
| [InlineData("##other", "ns1 ns2", "ns2", 0, "##other")] | ||
| public void v2(string ns1, string ns2, string attrNs, int expectedError, string expectedNs = null) | ||
| { | ||
| XmlSchemaSet xss = new XmlSchemaSet(); | ||
| xss.XmlResolver = new XmlUrlResolver(); | ||
|
|
@@ -188,6 +210,42 @@ public void v2(string ns1, string ns2, string attrNs, int expectedError) | |
| xss.Compile(); | ||
|
|
||
| Assert.Equal(expectedError, _errorCount); | ||
|
|
||
| // Full framework does not set the namespace property for intersections and unions | ||
| if (!PlatformDetection.IsFullFramework && expectedNs != null) | ||
| { | ||
| XmlSchemaAnyAttribute attributeWildcard = ((XmlSchemaComplexType)xss.GlobalTypes[new XmlQualifiedName("t1", attrNs)]).AttributeWildcard; | ||
| CompareWildcardNamespaces(expectedNs, attributeWildcard.Namespace); | ||
| } | ||
| } | ||
|
|
||
| [Theory] | ||
| //[Variation(Desc = "ns - ##any, allow any attribute")] | ||
| [InlineData("##any", "ns1", "##any")] | ||
| //[Variation(Desc = "ns - ##other, not allow ns1 attribute")] | ||
| [InlineData("##other", "ns1", "##other")] | ||
| //[Variation(Desc = "ns - ns1 ns2, allow ns1 and ns2 attribute")] | ||
| [InlineData("ns1 ns2", "ns1", "ns1 ns2")] | ||
| //[Variation(Desc = "##targetNamespace, allow current ns")] | ||
| [InlineData("##targetNamespace", "ns1", "##targetNamespace")] | ||
| public void v3(string ns, string attrNs, string expectedNs) | ||
| { | ||
| XmlSchemaSet xss = new XmlSchemaSet(); | ||
| xss.XmlResolver = new XmlUrlResolver(); | ||
| xss.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); | ||
| xss.Add(GetSimpleSchema(ns, attrNs)); | ||
| xss.Compile(); | ||
|
|
||
| XmlSchemaAnyAttribute attributeWildcard = ((XmlSchemaComplexType)xss.GlobalTypes[new XmlQualifiedName("t", attrNs)]).AttributeWildcard; | ||
| CompareWildcardNamespaces(expectedNs, attributeWildcard.Namespace); | ||
| } | ||
|
|
||
| private static void CompareWildcardNamespaces(string expected, string actual) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. would it make sense to instead split, order and join back to string and compare strings instead? Alternatively Split, order and just compare IEnumerable with Assert.Equal which I believe should correctly compare elementwise
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fair point. I've rewritten it to string compares which does improve readability.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The failing tests are now in |
||
| { | ||
| var orderedExpected = string.Join(" ", expected.Split(' ').OrderBy(ns => ns)); | ||
| var orderedActual = string.Join(" ", actual.Split(' ').OrderBy(ns => ns)); | ||
|
|
||
| Assert.Equal(orderedExpected, orderedActual); | ||
| } | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
since the behavior is now different on full framework and corefx you might solve it in two ways:
throw new SkipTestException()some usage examples:
corefx/src/Microsoft.Win32.SystemEvents/tests/SystemEvents.CreateTimer.cs
Line 50 in 8c7771a
corefx/src/System.Reflection/tests/AssemblyTests.cs
Line 148 in 5ae3c56
corefx/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.Cookies.cs
Line 217 in 421bcd0
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the pointers, made it easy to fix.
I'll try to look at the failing Linux arm64 tests tomorrow.