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.
      *

Reply via email to