You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by pk...@apache.org on 2026/06/20 20:09:24 UTC
(commons-xml) 29/50: Tag tests according to JAXP interface (#4)
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 <pk...@apache.org>
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.
*