From 552ea62e1f88ad09b8838992f332b3eccbef3ba4 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Mon, 26 Feb 2024 20:34:27 +0100
Subject: [PATCH] Fix GH-13517: Multiple test failures when building with
--with-expat
The reflection failure is because the XML extension is used to check the
module dependency information, but that extension can be configured to
not depend on ext/libxml, resulting in a different output. The solution
is to check another extension instead.
The test failures in ext/xml/tests are because of different behaviour
between libxml2 and Expat error handling. These are expected differences
and the solution is to split the tests.
Closes GH-13522.
---
NEWS | 3 +
ext/reflection/tests/016.phpt | 8 +-
ext/xml/tests/bug26614.inc | 73 ++++++++++++++++
ext/xml/tests/bug26614.phpt | 83 ++-----------------
ext/xml/tests/bug26614_libxml_gte2_11.phpt | 77 +----------------
ext/xml/tests/bug26614_libxml_pre2_11.phpt | 77 +----------------
ext/xml/tests/bug46699.phpt | 4 +-
ext/xml/tests/bug81351.phpt | 4 +-
ext/xml/tests/libxml_expat_skipif.inc | 9 ++
..._basic.phpt => xml_error_string_basic.inc} | 19 +----
.../tests/xml_error_string_basic_expat.phpt | 24 ++++++
.../tests/xml_error_string_basic_libxml.phpt | 24 ++++++
...et_start_namespace_decl_handler_basic.inc} | 18 +---
...rt_namespace_decl_handler_basic_expat.phpt | 29 +++++++
...t_namespace_decl_handler_basic_libxml.phpt | 24 ++++++
15 files changed, 209 insertions(+), 267 deletions(-)
create mode 100644 ext/xml/tests/bug26614.inc
create mode 100644 ext/xml/tests/libxml_expat_skipif.inc
rename ext/xml/tests/{xml_error_string_basic.phpt => xml_error_string_basic.inc} (55%)
create mode 100644 ext/xml/tests/xml_error_string_basic_expat.phpt
create mode 100644 ext/xml/tests/xml_error_string_basic_libxml.phpt
rename ext/xml/tests/{xml_set_start_namespace_decl_handler_basic.phpt => xml_set_start_namespace_decl_handler_basic.inc} (75%)
create mode 100644 ext/xml/tests/xml_set_start_namespace_decl_handler_basic_expat.phpt
create mode 100644 ext/xml/tests/xml_set_start_namespace_decl_handler_basic_libxml.phpt
diff --git a/NEWS b/NEWS
index 1564f031f0b2a..ab1364e0d330a 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,9 @@ PHP NEWS
- PDO:
. Fix various PDORow bugs. (Girgias)
+- XML:
+ . Fixed bug GH-13517 (Multiple test failures when building with
+ --with-expat). (nielsdos)
14 Mar 2024, PHP 8.2.17
diff --git a/ext/reflection/tests/016.phpt b/ext/reflection/tests/016.phpt
index a606576708bd9..a1f7ca1a8aa3b 100644
--- a/ext/reflection/tests/016.phpt
+++ b/ext/reflection/tests/016.phpt
@@ -1,15 +1,17 @@
--TEST--
ReflectionExtension::getDependencies()
--EXTENSIONS--
-xml
+dom
--FILE--
getDependencies();
var_dump($deps);
?>
--EXPECT--
-array(1) {
+array(2) {
["libxml"]=>
string(8) "Required"
+ ["domxml"]=>
+ string(9) "Conflicts"
}
diff --git a/ext/xml/tests/bug26614.inc b/ext/xml/tests/bug26614.inc
new file mode 100644
index 0000000000000..1b0c94edb9fbe
--- /dev/null
+++ b/ext/xml/tests/bug26614.inc
@@ -0,0 +1,73 @@
+
+
+
+';
+
+// Case 2: replace some characters so that we get comments instead
+$xmls["Comment"] ='
+
+
+';
+
+// Case 3: replace even more characters so that only textual data is left
+$xmls["Text"] ='
+
+-!-- ATA[
+multi
+line
+CDATA
+block
+---
+';
+
+function startElement($parser, $name, $attrs) {
+ printf("<$name> at line %d, col %d (byte %d)\n",
+ xml_get_current_line_number($parser),
+ xml_get_current_column_number($parser),
+ xml_get_current_byte_index($parser));
+}
+
+function endElement($parser, $name) {
+ printf("$name> at line %d, col %d (byte %d)\n",
+ xml_get_current_line_number($parser),
+ xml_get_current_column_number($parser),
+ xml_get_current_byte_index($parser));
+}
+
+function characterData($parser, $data) {
+ // dummy
+}
+
+foreach ($xmls as $desc => $xml) {
+ echo "$desc\n";
+ $xml_parser = xml_parser_create();
+ xml_set_element_handler($xml_parser, "startElement", "endElement");
+ xml_set_character_data_handler($xml_parser, "characterData");
+ if (!xml_parse($xml_parser, $xml, true))
+ echo "Error: ".xml_error_string(xml_get_error_code($xml_parser))."\n";
+ xml_parser_free($xml_parser);
+}
diff --git a/ext/xml/tests/bug26614.phpt b/ext/xml/tests/bug26614.phpt
index 846d9fc65317e..5fb9f9da4ccec 100644
--- a/ext/xml/tests/bug26614.phpt
+++ b/ext/xml/tests/bug26614.phpt
@@ -4,91 +4,20 @@ Bug #26614 (CDATA sections skipped on line count)
xml
--SKIPIF--
--FILE--
-
-
-';
-
-// Case 2: replace some characters so that we get comments instead
-$xmls["Comment"] ='
-
-
-';
-
-// Case 3: replace even more characters so that only textual data is left
-$xmls["Text"] ='
-
--!-- ATA[
-multi
-line
-CDATA
-block
----
-';
-
-function startElement($parser, $name, $attrs) {
- printf("<$name> at line %d, col %d (byte %d)\n",
- xml_get_current_line_number($parser),
- xml_get_current_column_number($parser),
- xml_get_current_byte_index($parser));
-}
-
-function endElement($parser, $name) {
- printf("$name> at line %d, col %d (byte %d)\n",
- xml_get_current_line_number($parser),
- xml_get_current_column_number($parser),
- xml_get_current_byte_index($parser));
-}
-
-function characterData($parser, $data) {
- // dummy
-}
-
-foreach ($xmls as $desc => $xml) {
- echo "$desc\n";
- $xml_parser = xml_parser_create();
- xml_set_element_handler($xml_parser, "startElement", "endElement");
- xml_set_character_data_handler($xml_parser, "characterData");
- if (!xml_parse($xml_parser, $xml, true))
- echo "Error: ".xml_error_string(xml_get_error_code($xml_parser))."\n";
- xml_parser_free($xml_parser);
-}
+require __DIR__ . '/bug26614.inc';
?>
--EXPECT--
CDATA
at line 2, col 0 (byte 45)
- at line 9, col 0 (byte 90)
+ at line 9, col 0 (byte 89)
Comment
at line 2, col 0 (byte 45)
- at line 9, col 0 (byte 90)
+ at line 9, col 0 (byte 89)
Text
at line 2, col 0 (byte 45)
- at line 9, col 0 (byte 90)
+ at line 9, col 0 (byte 89)
diff --git a/ext/xml/tests/bug26614_libxml_gte2_11.phpt b/ext/xml/tests/bug26614_libxml_gte2_11.phpt
index 9a81b67686d14..f494ddc4c50f9 100644
--- a/ext/xml/tests/bug26614_libxml_gte2_11.phpt
+++ b/ext/xml/tests/bug26614_libxml_gte2_11.phpt
@@ -4,84 +4,13 @@ Bug #26614 (CDATA sections skipped on line count)
xml
--SKIPIF--
= 2.11');
?>
--FILE--
-
-
-';
-
-// Case 2: replace some characters so that we get comments instead
-$xmls["Comment"] ='
-
-
-';
-
-// Case 3: replace even more characters so that only textual data is left
-$xmls["Text"] ='
-
--!-- ATA[
-multi
-line
-CDATA
-block
----
-';
-
-function startElement($parser, $name, $attrs) {
- printf("<$name> at line %d, col %d (byte %d)\n",
- xml_get_current_line_number($parser),
- xml_get_current_column_number($parser),
- xml_get_current_byte_index($parser));
-}
-
-function endElement($parser, $name) {
- printf("$name> at line %d, col %d (byte %d)\n",
- xml_get_current_line_number($parser),
- xml_get_current_column_number($parser),
- xml_get_current_byte_index($parser));
-}
-
-function characterData($parser, $data) {
- // dummy
-}
-
-foreach ($xmls as $desc => $xml) {
- echo "$desc\n";
- $xml_parser = xml_parser_create();
- xml_set_element_handler($xml_parser, "startElement", "endElement");
- xml_set_character_data_handler($xml_parser, "characterData");
- if (!xml_parse($xml_parser, $xml, true))
- echo "Error: ".xml_error_string(xml_get_error_code($xml_parser))."\n";
- xml_parser_free($xml_parser);
-}
+require __DIR__ . '/bug26614.inc';
?>
--EXPECTF--
CDATA
diff --git a/ext/xml/tests/bug26614_libxml_pre2_11.phpt b/ext/xml/tests/bug26614_libxml_pre2_11.phpt
index c581a08e9b8fb..c78f7088e7052 100644
--- a/ext/xml/tests/bug26614_libxml_pre2_11.phpt
+++ b/ext/xml/tests/bug26614_libxml_pre2_11.phpt
@@ -4,84 +4,13 @@ Bug #26614 (CDATA sections skipped on line count)
xml
--SKIPIF--
= 21100) die('skip libxml2 test variant for version < 2.11');
?>
--FILE--
-
-
-';
-
-// Case 2: replace some characters so that we get comments instead
-$xmls["Comment"] ='
-
-
-';
-
-// Case 3: replace even more characters so that only textual data is left
-$xmls["Text"] ='
-
--!-- ATA[
-multi
-line
-CDATA
-block
----
-';
-
-function startElement($parser, $name, $attrs) {
- printf("<$name> at line %d, col %d (byte %d)\n",
- xml_get_current_line_number($parser),
- xml_get_current_column_number($parser),
- xml_get_current_byte_index($parser));
-}
-
-function endElement($parser, $name) {
- printf("$name> at line %d, col %d (byte %d)\n",
- xml_get_current_line_number($parser),
- xml_get_current_column_number($parser),
- xml_get_current_byte_index($parser));
-}
-
-function characterData($parser, $data) {
- // dummy
-}
-
-foreach ($xmls as $desc => $xml) {
- echo "$desc\n";
- $xml_parser = xml_parser_create();
- xml_set_element_handler($xml_parser, "startElement", "endElement");
- xml_set_character_data_handler($xml_parser, "characterData");
- if (!xml_parse($xml_parser, $xml, true))
- echo "Error: ".xml_error_string(xml_get_error_code($xml_parser))."\n";
- xml_parser_free($xml_parser);
-}
+require __DIR__ . '/bug26614.inc';
?>
--EXPECTF--
CDATA
diff --git a/ext/xml/tests/bug46699.phpt b/ext/xml/tests/bug46699.phpt
index 9570ad9231d2e..b921ab39b7d31 100644
--- a/ext/xml/tests/bug46699.phpt
+++ b/ext/xml/tests/bug46699.phpt
@@ -27,8 +27,8 @@ xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_parse($parser, $xml);
xml_parser_free($parser);
?>
---EXPECT--
-
+--EXPECTF--
+
1
2
diff --git a/ext/xml/tests/bug81351.phpt b/ext/xml/tests/bug81351.phpt
index 7380a9a937008..319db2ee6877b 100644
--- a/ext/xml/tests/bug81351.phpt
+++ b/ext/xml/tests/bug81351.phpt
@@ -22,5 +22,5 @@ $error = xml_error_string($code);
echo "xml_parse returned $success, xml_get_error_code = $code, xml_error_string = $error\r\n";
?>
--EXPECTF--
-xml_parse returned 1, xml_get_error_code = 0, xml_error_string = No error
-%rxml_parse returned 0, xml_get_error_code = 5, xml_error_string = Invalid document end|xml_parse returned 0, xml_get_error_code = 77, xml_error_string = Tag not finished%r
+xml_parse returned 1, xml_get_error_code = 0, xml_error_string = %S
+%rxml_parse returned 0, xml_get_error_code = 5, xml_error_string = Invalid document end|xml_parse returned 0, xml_get_error_code = 3, xml_error_string = no element found|xml_parse returned 0, xml_get_error_code = 77, xml_error_string = Tag not finished%r
diff --git a/ext/xml/tests/libxml_expat_skipif.inc b/ext/xml/tests/libxml_expat_skipif.inc
new file mode 100644
index 0000000000000..f8c5ef83db0ad
--- /dev/null
+++ b/ext/xml/tests/libxml_expat_skipif.inc
@@ -0,0 +1,9 @@
+',
@@ -19,16 +14,4 @@ foreach ($xmls as $xml) {
var_dump(xml_error_string(xml_get_error_code($xml_parser)));
}
xml_parser_free($xml_parser);
-}
-?>
---EXPECTF--
-int(%r5|77%r)
-string(%d) %r"Invalid document end"|"Tag not finished"%r
-int(47)
-string(35) "Processing Instruction not finished"
-int(57)
-string(28) "XML declaration not finished"
-int(64)
-string(17) "Reserved XML Name"
-int(76)
-string(14) "Mismatched tag"
+}
\ No newline at end of file
diff --git a/ext/xml/tests/xml_error_string_basic_expat.phpt b/ext/xml/tests/xml_error_string_basic_expat.phpt
new file mode 100644
index 0000000000000..c095efa8e844e
--- /dev/null
+++ b/ext/xml/tests/xml_error_string_basic_expat.phpt
@@ -0,0 +1,24 @@
+--TEST--
+xml_error_string() - Basic test on 5 error codes
+--EXTENSIONS--
+xml
+--SKIPIF--
+
+--FILE--
+
+--EXPECT--
+int(3)
+string(16) "no element found"
+int(4)
+string(31) "not well-formed (invalid token)"
+int(5)
+string(14) "unclosed token"
+int(30)
+string(31) "XML declaration not well-formed"
+int(7)
+string(14) "mismatched tag"
diff --git a/ext/xml/tests/xml_error_string_basic_libxml.phpt b/ext/xml/tests/xml_error_string_basic_libxml.phpt
new file mode 100644
index 0000000000000..aafd005cb4a3c
--- /dev/null
+++ b/ext/xml/tests/xml_error_string_basic_libxml.phpt
@@ -0,0 +1,24 @@
+--TEST--
+xml_error_string() - Basic test on 5 error codes
+--EXTENSIONS--
+xml
+--SKIPIF--
+
+--FILE--
+
+--EXPECTF--
+int(%r5|77%r)
+string(%d) %r"Invalid document end"|"Tag not finished"%r
+int(47)
+string(35) "Processing Instruction not finished"
+int(57)
+string(28) "XML declaration not finished"
+int(64)
+string(17) "Reserved XML Name"
+int(76)
+string(14) "Mismatched tag"
diff --git a/ext/xml/tests/xml_set_start_namespace_decl_handler_basic.phpt b/ext/xml/tests/xml_set_start_namespace_decl_handler_basic.inc
similarity index 75%
rename from ext/xml/tests/xml_set_start_namespace_decl_handler_basic.phpt
rename to ext/xml/tests/xml_set_start_namespace_decl_handler_basic.inc
index a13e0c22939b8..b27b5c0efeb48 100644
--- a/ext/xml/tests/xml_set_start_namespace_decl_handler_basic.phpt
+++ b/ext/xml/tests/xml_set_start_namespace_decl_handler_basic.inc
@@ -1,8 +1,3 @@
---TEST--
-Test xml_set_start_namespace_decl_handler function: basic
---EXTENSIONS--
-xml
---FILE--
' );
-}
-?>
---EXPECT--
-bool(true)
-bool(true)
-Namespace_Start_Handler called
-...Prefix: aw1
-...Uri: http://www.somewhere.com/namespace1
-Namespace_Start_Handler called
-...Prefix: aw2
-...Uri: file:/DTD/somewhere.dtd
-Done
+}
\ No newline at end of file
diff --git a/ext/xml/tests/xml_set_start_namespace_decl_handler_basic_expat.phpt b/ext/xml/tests/xml_set_start_namespace_decl_handler_basic_expat.phpt
new file mode 100644
index 0000000000000..34babe4d30f67
--- /dev/null
+++ b/ext/xml/tests/xml_set_start_namespace_decl_handler_basic_expat.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test xml_set_start_namespace_decl_handler function: basic
+--EXTENSIONS--
+xml
+--SKIPIF--
+
+--FILE--
+
+--EXPECT--
+bool(true)
+bool(true)
+Namespace_Start_Handler called
+...Prefix: aw1
+...Uri: http://www.somewhere.com/namespace1
+Namespace_Start_Handler called
+...Prefix: aw2
+...Uri: file:/DTD/somewhere.dtd
+Namespace_End_Handler called
+...Prefix: aw2
+
+Namespace_End_Handler called
+...Prefix: aw1
+
+Done
diff --git a/ext/xml/tests/xml_set_start_namespace_decl_handler_basic_libxml.phpt b/ext/xml/tests/xml_set_start_namespace_decl_handler_basic_libxml.phpt
new file mode 100644
index 0000000000000..ff6057c075d55
--- /dev/null
+++ b/ext/xml/tests/xml_set_start_namespace_decl_handler_basic_libxml.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Test xml_set_start_namespace_decl_handler function: basic
+--EXTENSIONS--
+xml
+--SKIPIF--
+
+--FILE--
+
+--EXPECT--
+bool(true)
+bool(true)
+Namespace_Start_Handler called
+...Prefix: aw1
+...Uri: http://www.somewhere.com/namespace1
+Namespace_Start_Handler called
+...Prefix: aw2
+...Uri: file:/DTD/somewhere.dtd
+Done