From ae91cc354dd3be9c9f869530ab33a66af3d0d430 Mon Sep 17 00:00:00 2001 From: Gabriel Belingueres Date: Thu, 21 Jan 2021 23:47:56 -0300 Subject: [PATCH] Fix MXParser failing to parse properly 'standalone' declaration attribute (#130) --- .../plexus/util/xml/pull/MXParser.java | 13 +- ...onformanceTestSuite_Production32_Test.java | 269 ++++++++++++++++++ .../xmlconf/ibm/not-wf/P32/ibm32n01.xml | 6 + .../xmlconf/ibm/not-wf/P32/ibm32n02.xml | 6 + .../xmlconf/ibm/not-wf/P32/ibm32n03.xml | 6 + .../xmlconf/ibm/not-wf/P32/ibm32n04.xml | 6 + .../xmlconf/ibm/not-wf/P32/ibm32n05.xml | 6 + .../xmlconf/ibm/not-wf/P32/ibm32n06.dtd | 1 + .../xmlconf/ibm/not-wf/P32/ibm32n06.xml | 4 + .../xmlconf/ibm/not-wf/P32/ibm32n07.xml | 4 + .../xmlconf/ibm/not-wf/P32/ibm32n08.xml | 6 + .../xmlconf/ibm/not-wf/P32/ibm32n09.dtd | 1 + .../xmlconf/ibm/not-wf/P32/ibm32n09.xml | 9 + 13 files changed, 325 insertions(+), 12 deletions(-) create mode 100644 src/test/java/org/codehaus/plexus/util/xml/pull/IBMXML10Tests_Test_IBMXMLConformanceTestSuite_not_wftests_Test_IBMXMLConformanceTestSuite_Production32_Test.java create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n01.xml create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n02.xml create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n03.xml create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n04.xml create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n05.xml create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n06.dtd create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n06.xml create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n07.xml create mode 100755 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n08.xml create mode 100644 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n09.dtd create mode 100644 src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n09.xml diff --git a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java index 40a12a21..ac32a52a 100644 --- a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java +++ b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java @@ -3325,9 +3325,9 @@ private void parseXmlDeclWithVersion( int versionStart, int versionEnd ) // TODO reconcile with setInput encodingName inputEncoding = newString( buf, encodingStart, encodingEnd - encodingStart ); - ch = more(); } + ch = more(); ch = skipS( ch ); // [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) if ( ch == 's' ) @@ -3860,17 +3860,6 @@ private char requireInput( char ch, char[] input ) return ch; } - private char requireNextS() - throws XmlPullParserException, IOException - { - final char ch = more(); - if ( !isS( ch ) ) - { - throw new XmlPullParserException( "white space is required and not " + printable( ch ), this, null ); - } - return skipS( ch ); - } - private char skipS( char ch ) throws XmlPullParserException, IOException { diff --git a/src/test/java/org/codehaus/plexus/util/xml/pull/IBMXML10Tests_Test_IBMXMLConformanceTestSuite_not_wftests_Test_IBMXMLConformanceTestSuite_Production32_Test.java b/src/test/java/org/codehaus/plexus/util/xml/pull/IBMXML10Tests_Test_IBMXMLConformanceTestSuite_not_wftests_Test_IBMXMLConformanceTestSuite_Production32_Test.java new file mode 100644 index 00000000..29ba3947 --- /dev/null +++ b/src/test/java/org/codehaus/plexus/util/xml/pull/IBMXML10Tests_Test_IBMXMLConformanceTestSuite_not_wftests_Test_IBMXMLConformanceTestSuite_Production32_Test.java @@ -0,0 +1,269 @@ +package org.codehaus.plexus.util.xml.pull; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; + +import org.junit.Before; +import org.junit.Test; + +/** + * Test class that execute a particular set of tests associated to a TESCASES tag from the XML W3C Conformance Tests. + * TESCASES PROFILE:
IBM XML Conformance Test Suite - Production 32
+ * XML test files base folder:
xmlconf/ibm/
+ * + * @author Gabriel Belingueres + */ +public class IBMXML10Tests_Test_IBMXMLConformanceTestSuite_not_wftests_Test_IBMXMLConformanceTestSuite_Production32_Test +{ + + final static File testResourcesDir = new File( "src/test/resources/", "xmlconf/ibm/" ); + + MXParser parser; + + @Before + public void setUp() + { + parser = new MXParser(); + } + + /** + * Test ID:
ibm-not-wf-P32-ibm32n01.xml
+ * Test URI:
not-wf/P32/ibm32n01.xml
+ * Comment:
Tests SDDecl with a required field missing. The leading white space     is missing with the SDDecl in the XMLDecl.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n01xml() + throws IOException + { + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n01.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "Tests SDDecl with a required field missing. The leading white space is missing with the SDDecl in the XMLDecl." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of ibm-not-wf-P32-ibm32n02.xml + * Test URI:
not-wf/P32/ibm32n02.xml
+ * Comment:
Tests SDDecl with a required field missing. The "=" sign is missing     in the SDDecl in the XMLDecl.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n02xml() + throws IOException + { + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n02.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "Tests SDDecl with a required field missing. The \"=\" sign is missing in the SDDecl in the XMLDecl." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of ibm-not-wf-P32-ibm32n03.xml + * Test URI:
not-wf/P32/ibm32n03.xml
+ * Comment:
Tests SDDecl with wrong key word. The word "Standalone" occurs in      the SDDecl in the XMLDecl.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n03xml() + throws IOException + { + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n03.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "Tests SDDecl with wrong key word. The word \"Standalone\" occurs in the SDDecl in the XMLDecl." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of ibm-not-wf-P32-ibm32n04.xml + * Test URI:
not-wf/P32/ibm32n04.xml
+ * Comment:
Tests SDDecl with wrong key word. The word "Yes" occurs in the     SDDecl in the XMLDecl.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n04xml() + throws IOException + { + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n04.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "Tests SDDecl with wrong key word. The word \"Yes\" occurs in the SDDecl in the XMLDecl." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of ibm-not-wf-P32-ibm32n05.xml + * Test URI:
not-wf/P32/ibm32n05.xml
+ * Comment:
Tests SDDecl with wrong key word. The word "YES" occurs in the     SDDecl in the XMLDecl.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n05xml() + throws IOException + { + + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n05.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "Tests SDDecl with wrong key word. The word \"YES\" occurs in the SDDecl in the XMLDecl." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of ibm-not-wf-P32-ibm32n06.xml + * Test URI:
not-wf/P32/ibm32n06.xml
+ * Comment:
Tests SDDecl with wrong key word. The word "No" occurs in the     SDDecl in the XMLDecl.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n06xml() + throws IOException + { + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n06.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "Tests SDDecl with wrong key word. The word \"No\" occurs in the SDDecl in the XMLDecl." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of ibm-not-wf-P32-ibm32n07.xml + * Test URI:
not-wf/P32/ibm32n07.xml
+ * Comment:
Tests SDDecl with wrong key word. The word "NO" occurs in the     SDDecl in the XMLDecl.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n07xml() + throws IOException + { + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n07.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "Tests SDDecl with wrong key word. The word \"NO\" occurs in the SDDecl in the XMLDecl." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of ibm-not-wf-P32-ibm32n08.xml + * Test URI:
not-wf/P32/ibm32n08.xml
+ * Comment:
Tests SDDecl with wrong field ordering. The "=" sign occurs      after the key word "yes" in the SDDecl in the XMLDecl.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n08xml() + throws IOException + { + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n08.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "Tests SDDecl with wrong field ordering. The \"=\" sign occurs after the key word \"yes\" in the SDDecl in the XMLDecl." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of ibm-not-wf-P32-ibm32n09.xml + * Test URI:
not-wf/P32/ibm32n09.xml
+ * Comment:
This is test violates WFC: Entity Declared in P68.     The standalone document declaration has the value yes, BUT there is an      external markup declaration of an entity (other than amp, lt, gt, apos,     quot), and references to this entity appear in the document.
+ * Sections:
2.9
+ * Version: + * + * @throws IOException if there is an I/O error + */ + @Test + public void testibm_not_wf_P32_ibm32n09xml() + throws IOException + { + try ( Reader reader = new FileReader( new File( testResourcesDir, "not-wf/P32/ibm32n09.xml" ) ) ) + { + parser.setInput( reader ); + while ( parser.nextToken() != XmlPullParser.END_DOCUMENT ) + ; + fail( "This is test violates WFC: Entity Declared in P68. The standalone document declaration has the value yes, BUT there is an external markup declaration of an entity (other than amp, lt, gt, apos, quot), and references to this entity appear in the document." ); + } + catch ( XmlPullParserException e ) + { + assertTrue( e.getMessage().contains( "expected ?> as last part of + +]> + + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n02.xml b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n02.xml new file mode 100755 index 00000000..3a3705e1 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n02.xml @@ -0,0 +1,6 @@ + + +]> + + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n03.xml b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n03.xml new file mode 100755 index 00000000..8d31eaae --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n03.xml @@ -0,0 +1,6 @@ + + +]> + + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n04.xml b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n04.xml new file mode 100755 index 00000000..6c80d786 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n04.xml @@ -0,0 +1,6 @@ + + +]> + + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n05.xml b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n05.xml new file mode 100755 index 00000000..fa9cc064 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n05.xml @@ -0,0 +1,6 @@ + + +]> + + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n06.dtd b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n06.dtd new file mode 100755 index 00000000..b3dde2f9 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n06.dtd @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n06.xml b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n06.xml new file mode 100755 index 00000000..d9522dc0 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n06.xml @@ -0,0 +1,4 @@ + + + + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n07.xml b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n07.xml new file mode 100755 index 00000000..1c906db8 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n07.xml @@ -0,0 +1,4 @@ + + + + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n08.xml b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n08.xml new file mode 100755 index 00000000..00903ab0 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n08.xml @@ -0,0 +1,6 @@ + + +]> + + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n09.dtd b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n09.dtd new file mode 100644 index 00000000..e30d2928 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n09.dtd @@ -0,0 +1 @@ + diff --git a/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n09.xml b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n09.xml new file mode 100644 index 00000000..a62bac37 --- /dev/null +++ b/src/test/resources/xmlconf/ibm/not-wf/P32/ibm32n09.xml @@ -0,0 +1,9 @@ + + +]> + +&animal_content;