This is an automated email from the ASF dual-hosted git repository. ppkarwasz pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/commons-xml.git
commit be1cb5df2a6611bc04a0d3a792003b9d508b5368 Author: Piotr P. Karwasz <[email protected]> AuthorDate: Sat Apr 25 20:24:41 2026 +0200 Tag tests according to JAXP interface (#4) This change tags each test by the JAXP interface it exercises so that each surefire run can include only the tags the provider under test actually contributes. The stock-JDK run stays the catch-all and runs everything except xpath3, which needs Saxon on the classpath. --- pom.xml | 15 ++++++++------- .../commons/xml/factory/attacks/BillionLaughsTest.java | 15 +++++++++++++++ .../commons/xml/factory/attacks/ExternalDtdTest.java | 15 +++++++++++++++ .../xml/factory/attacks/ExternalGeneralEntityTest.java | 15 +++++++++++++++ .../factory/attacks/ExternalParameterEntityTest.java | 15 +++++++++++++++ .../commons/xml/factory/attacks/ExternalSchemaTest.java | 2 ++ .../xml/factory/attacks/ExternalStylesheetTest.java | 2 ++ .../factory/attacks/SaxonXPathExternalCallsTest.java | 17 ++++------------- 8 files changed, 76 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index 17c033e..8fef604 100644 --- a/pom.xml +++ b/pom.xml @@ -113,6 +113,8 @@ <goals><goal>test</goal></goals> <configuration> <reportsDirectory>${project.build.directory}/surefire-reports/stockjdk</reportsDirectory> + <!-- Run every tagged and untagged test except xpath3, which needs Saxon on the classpath. --> + <excludedGroups>xpath3</excludedGroups> <classpathDependencyExcludes> <exclude>net.sf.saxon:Saxon-HE</exclude> </classpathDependencyExcludes> @@ -123,6 +125,8 @@ <goals><goal>test</goal></goals> <configuration> <reportsDirectory>${project.build.directory}/surefire-reports/xerces</reportsDirectory> + <!-- Xerces only contributes DOM/SAX/Schema; the rest is JDK-bundled and already covered by test-stockjdk. --> + <groups>dom,sax,schema</groups> <additionalClasspathDependencies> <dependency> <groupId>xerces</groupId> @@ -140,6 +144,8 @@ <goals><goal>test</goal></goals> <configuration> <reportsDirectory>${project.build.directory}/surefire-reports/woodstox</reportsDirectory> + <!-- Woodstox only contributes StAX. --> + <groups>stax</groups> <additionalClasspathDependencies> <dependency> <groupId>com.fasterxml.woodstox</groupId> @@ -157,13 +163,8 @@ <goals><goal>test</goal></goals> <configuration> <reportsDirectory>${project.build.directory}/surefire-reports/saxon</reportsDirectory> - <additionalClasspathDependencies> - <dependency> - <groupId>net.sf.saxon</groupId> - <artifactId>Saxon-HE</artifactId> - <version>${commons.saxon.version}</version> - </dependency> - </additionalClasspathDependencies> + <!-- Saxon contributes TrAX (transformer + stylesheet) and XPath; xpath3 covers Saxon-only XPath 3.1 functions. --> + <groups>trax,xpath3</groups> </configuration> </execution> </executions> diff --git a/src/test/java/org/apache/commons/xml/factory/attacks/BillionLaughsTest.java b/src/test/java/org/apache/commons/xml/factory/attacks/BillionLaughsTest.java index 15cde3f..dda89fc 100644 --- a/src/test/java/org/apache/commons/xml/factory/attacks/BillionLaughsTest.java +++ b/src/test/java/org/apache/commons/xml/factory/attacks/BillionLaughsTest.java @@ -16,6 +16,7 @@ */ package org.apache.commons.xml.factory.attacks; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; /** @@ -69,71 +70,85 @@ private static String xsltPayload() { } @Test + @Tag("dom") void hardenedDomBlocksBillionLaughs() { AttackTestSupport.assertDomBlocks(xmlPayload()); } @Test + @Tag("sax") void hardenedSaxBlocksBillionLaughs() { AttackTestSupport.assertSaxBlocks(xmlPayload()); } @Test + @Tag("schema") void hardenedSchemaBlocksBillionLaughs() { AttackTestSupport.assertSchemaCompilationBlocks(xsdPayload()); } @Test + @Tag("stax") void hardenedStaxBlocksBillionLaughs() { AttackTestSupport.assertStaxBlocks(xmlPayload()); } @Test + @Tag("trax") void hardenedStylesheetBlocksBillionLaughs() { AttackTestSupport.assertStylesheetCompilationBlocks(xsltPayload()); } @Test + @Tag("trax") void hardenedTransformerBlocksBillionLaughs() { AttackTestSupport.assertTransformerBlocks(xmlPayload()); } @Test + @Tag("schema") void hardenedValidatorBlocksBillionLaughs() { AttackTestSupport.assertValidatorBlocks(xmlPayload()); } @Test + @Tag("dom") void unconfiguredDomResolvesBillionLaughs() { AttackTestSupport.assertDomResolves(xmlPayload()); } @Test + @Tag("sax") void unconfiguredSaxResolvesBillionLaughs() { AttackTestSupport.assertSaxResolves(xmlPayload()); } @Test + @Tag("schema") void unconfiguredSchemaCompilesBillionLaughs() { AttackTestSupport.assertSchemaCompilationSucceeds(xsdPayload()); } @Test + @Tag("stax") void unconfiguredStaxResolvesBillionLaughs() { AttackTestSupport.assertStaxResolves(xmlPayload()); } @Test + @Tag("trax") void unconfiguredStylesheetCompilesBillionLaughs() { AttackTestSupport.assertStylesheetCompilationSucceeds(xsltPayload()); } @Test + @Tag("trax") void unconfiguredTransformerSucceedsBillionLaughs() { AttackTestSupport.assertTransformerSucceeds(xmlPayload()); } @Test + @Tag("schema") void unconfiguredValidatorAcceptsBillionLaughs() { AttackTestSupport.assertValidatorAccepts(xmlPayload()); } diff --git a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalDtdTest.java b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalDtdTest.java index c817aea..958ceb7 100644 --- a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalDtdTest.java +++ b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalDtdTest.java @@ -16,6 +16,7 @@ */ package org.apache.commons.xml.factory.attacks; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; /** @@ -58,71 +59,85 @@ private static String xsltPayload() { } @Test + @Tag("dom") void hardenedDomBlocks() { AttackTestSupport.assertDomBlocks(xmlPayload()); } @Test + @Tag("sax") void hardenedSaxBlocks() { AttackTestSupport.assertSaxBlocks(xmlPayload()); } @Test + @Tag("schema") void hardenedSchemaBlocks() { AttackTestSupport.assertSchemaCompilationBlocks(xsdPayload()); } @Test + @Tag("stax") void hardenedStaxBlocks() { AttackTestSupport.assertStaxBlocks(xmlPayload()); } @Test + @Tag("trax") void hardenedStylesheetBlocks() { AttackTestSupport.assertStylesheetCompilationBlocks(xsltPayload()); } @Test + @Tag("trax") void hardenedTransformerBlocks() { AttackTestSupport.assertTransformerBlocks(xmlPayload()); } @Test + @Tag("schema") void hardenedValidatorBlocks() { AttackTestSupport.assertValidatorBlocks(xmlPayload()); } @Test + @Tag("dom") void unconfiguredDomResolves() { AttackTestSupport.assertDomResolves(xmlPayload()); } @Test + @Tag("sax") void unconfiguredSaxResolves() { AttackTestSupport.assertSaxResolves(xmlPayload()); } @Test + @Tag("schema") void unconfiguredSchemaCompiles() { AttackTestSupport.assertSchemaCompilationSucceeds(xsdPayload()); } @Test + @Tag("stax") void unconfiguredStaxResolves() { AttackTestSupport.assertStaxResolves(xmlPayload()); } @Test + @Tag("trax") void unconfiguredStylesheetCompiles() { AttackTestSupport.assertStylesheetCompilationSucceeds(xsltPayload()); } @Test + @Tag("trax") void unconfiguredTransformerSucceeds() { AttackTestSupport.assertTransformerSucceeds(xmlPayload()); } @Test + @Tag("schema") void unconfiguredValidatorAccepts() { AttackTestSupport.assertValidatorAccepts(xmlPayload()); } diff --git a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalGeneralEntityTest.java b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalGeneralEntityTest.java index 8047bba..853b5bb 100644 --- a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalGeneralEntityTest.java +++ b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalGeneralEntityTest.java @@ -16,6 +16,7 @@ */ package org.apache.commons.xml.factory.attacks; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; /** @@ -60,71 +61,85 @@ private static String xsltPayload() { } @Test + @Tag("dom") void hardenedDomBlocks() { AttackTestSupport.assertDomBlocks(xmlPayload()); } @Test + @Tag("sax") void hardenedSaxBlocks() { AttackTestSupport.assertSaxBlocks(xmlPayload()); } @Test + @Tag("schema") void hardenedSchemaBlocks() { AttackTestSupport.assertSchemaCompilationBlocks(xsdPayload()); } @Test + @Tag("stax") void hardenedStaxBlocks() { AttackTestSupport.assertStaxBlocks(xmlPayload()); } @Test + @Tag("trax") void hardenedStylesheetBlocks() { AttackTestSupport.assertStylesheetCompilationBlocks(xsltPayload()); } @Test + @Tag("trax") void hardenedTransformerBlocks() { AttackTestSupport.assertTransformerBlocks(xmlPayload()); } @Test + @Tag("schema") void hardenedValidatorBlocks() { AttackTestSupport.assertValidatorBlocks(xmlPayload()); } @Test + @Tag("dom") void unconfiguredDomResolves() { AttackTestSupport.assertDomResolves(xmlPayload()); } @Test + @Tag("sax") void unconfiguredSaxResolves() { AttackTestSupport.assertSaxResolves(xmlPayload()); } @Test + @Tag("schema") void unconfiguredSchemaCompiles() { AttackTestSupport.assertSchemaCompilationSucceeds(xsdPayload()); } @Test + @Tag("stax") void unconfiguredStaxResolves() { AttackTestSupport.assertStaxResolves(xmlPayload()); } @Test + @Tag("trax") void unconfiguredStylesheetCompiles() { AttackTestSupport.assertStylesheetCompilationSucceeds(xsltPayload()); } @Test + @Tag("trax") void unconfiguredTransformerSucceeds() { AttackTestSupport.assertTransformerSucceeds(xmlPayload()); } @Test + @Tag("schema") void unconfiguredValidatorAccepts() { AttackTestSupport.assertValidatorAccepts(xmlPayload()); } diff --git a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalParameterEntityTest.java b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalParameterEntityTest.java index d1ae0f1..0072493 100644 --- a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalParameterEntityTest.java +++ b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalParameterEntityTest.java @@ -16,6 +16,7 @@ */ package org.apache.commons.xml.factory.attacks; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; /** @@ -62,71 +63,85 @@ private static String xsltPayload() { } @Test + @Tag("dom") void hardenedDomBlocks() { AttackTestSupport.assertDomBlocks(xmlPayload()); } @Test + @Tag("sax") void hardenedSaxBlocks() { AttackTestSupport.assertSaxBlocks(xmlPayload()); } @Test + @Tag("schema") void hardenedSchemaBlocks() { AttackTestSupport.assertSchemaCompilationBlocks(xsdPayload()); } @Test + @Tag("stax") void hardenedStaxBlocks() { AttackTestSupport.assertStaxBlocks(xmlPayload()); } @Test + @Tag("trax") void hardenedStylesheetBlocks() { AttackTestSupport.assertStylesheetCompilationBlocks(xsltPayload()); } @Test + @Tag("trax") void hardenedTransformerBlocks() { AttackTestSupport.assertTransformerBlocks(xmlPayload()); } @Test + @Tag("schema") void hardenedValidatorBlocks() { AttackTestSupport.assertValidatorBlocks(xmlPayload()); } @Test + @Tag("dom") void unconfiguredDomResolves() { AttackTestSupport.assertDomResolves(xmlPayload()); } @Test + @Tag("sax") void unconfiguredSaxResolves() { AttackTestSupport.assertSaxResolves(xmlPayload()); } @Test + @Tag("schema") void unconfiguredSchemaCompiles() { AttackTestSupport.assertSchemaCompilationSucceeds(xsdPayload()); } @Test + @Tag("stax") void unconfiguredStaxResolves() { AttackTestSupport.assertStaxResolves(xmlPayload()); } @Test + @Tag("trax") void unconfiguredStylesheetCompiles() { AttackTestSupport.assertStylesheetCompilationSucceeds(xsltPayload()); } @Test + @Tag("trax") void unconfiguredTransformerSucceeds() { AttackTestSupport.assertTransformerSucceeds(xmlPayload()); } @Test + @Tag("schema") void unconfiguredValidatorAccepts() { AttackTestSupport.assertValidatorAccepts(xmlPayload()); } diff --git a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalSchemaTest.java b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalSchemaTest.java index 632335e..bf9589a 100644 --- a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalSchemaTest.java +++ b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalSchemaTest.java @@ -26,6 +26,7 @@ import javax.xml.validation.SchemaFactory; import org.apache.commons.xml.factory.XmlFactories; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; /** @@ -53,6 +54,7 @@ * <li>{@code xs:redefine schemaLocation="included.xsd"} that extends a complex type from the sibling schema.</li> * </ul> */ +@Tag("schema") class ExternalSchemaTest { private static void assertSchemaCompileFails(final String resource) { diff --git a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalStylesheetTest.java b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalStylesheetTest.java index 4a835ee..135c8d3 100644 --- a/src/test/java/org/apache/commons/xml/factory/attacks/ExternalStylesheetTest.java +++ b/src/test/java/org/apache/commons/xml/factory/attacks/ExternalStylesheetTest.java @@ -27,6 +27,7 @@ import javax.xml.transform.stream.StreamSource; import org.apache.commons.xml.factory.XmlFactories; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; /** @@ -44,6 +45,7 @@ * <li>{@code document()} call referencing a sibling XML file, resolved at transform time.</li> * </ul> */ +@Tag("trax") class ExternalStylesheetTest { private static final String INPUT = "<root/>"; diff --git a/src/test/java/org/apache/commons/xml/factory/attacks/SaxonXPathExternalCallsTest.java b/src/test/java/org/apache/commons/xml/factory/attacks/SaxonXPathExternalCallsTest.java index e4c1bc0..254fe63 100644 --- a/src/test/java/org/apache/commons/xml/factory/attacks/SaxonXPathExternalCallsTest.java +++ b/src/test/java/org/apache/commons/xml/factory/attacks/SaxonXPathExternalCallsTest.java @@ -19,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assumptions.assumeTrue; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -27,7 +26,7 @@ import javax.xml.xpath.XPathFactory; import org.apache.commons.xml.factory.internal.CompositeProvider; -import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; /** @@ -48,9 +47,10 @@ * <li>{@code unparsed-text(uri)} reading {@code referenced.txt}.</li> * </ul> * - * <p>The JDK's built-in XPathFactory and Xalan have no equivalent vectors. Skipped when Saxon is not on the classpath; only runs under the {@code test-saxon} - * surefire execution.</p> + * <p>The JDK's built-in XPathFactory and Xalan have no equivalent vectors. The class is tagged {@code xpath3}, so under the surefire group filters it only + * runs in the {@code test-saxon} execution where Saxon is on the classpath.</p> */ +@Tag("xpath3") class SaxonXPathExternalCallsTest { private static final String MARKER = "All your base are belong to us"; @@ -97,15 +97,6 @@ private static String jsonDocExpression() { return "json-doc('" + AttackTestSupport.resourceUrl("referenced.json") + "')?leaked"; } - @BeforeAll - static void requireSaxon() { - try { - Class.forName(SAXON_XPATH_FACTORY_CLASS); - } catch (final ClassNotFoundException e) { - assumeTrue(false, "Saxon not on the classpath; skipping Saxon XPath external-call tests"); - } - } - /** * Instantiates Saxon's {@code XPathFactoryImpl} reflectively. *
