summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkhillman <khillman@tzi.de>2021-11-21 21:04:21 +0100
committerGitHub <noreply@github.com>2021-11-21 21:04:21 +0100
commitfefdcc06c4704aefddd44ef2d02748db8dd9e7e7 (patch)
tree923346af303dc71c5a8a02cf162a27f2ed10a7cd
parent8a9579c32782f3d59b73bcf3e7d2fb3b52b80956 (diff)
downloadpython-lxml-fefdcc06c4704aefddd44ef2d02748db8dd9e7e7.tar.gz
Add test for Python3 regression in C14N2 serialization (GH-332)
Details in https://mail.python.org/archives/list/lxml@python.org/thread/6ZFBHFOVHOS5GFDOAMPCT6HM5HZPWQ4Q/ Fixed in https://github.com/lxml/lxml/commit/8a9579c32782f3d59b73bcf3e7d2fb3b52b80956
-rw-r--r--src/lxml/tests/test_etree.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/lxml/tests/test_etree.py b/src/lxml/tests/test_etree.py
index 42613dcb..ef5c54b7 100644
--- a/src/lxml/tests/test_etree.py
+++ b/src/lxml/tests/test_etree.py
@@ -5068,6 +5068,45 @@ class ETreeC14NTestCase(HelperTestCase):
s = etree.tostring(tree, method='c14n', exclusive=True, inclusive_ns_prefixes=['x', 'y', 'z'])
self.assertEqual(_bytes('<a xmlns:x="http://abc" xmlns:y="http://bcd" xmlns:z="http://cde"><z:b></z:b></a>'),
s)
+
+ def test_python3_problem_bytesio_iterparse(self):
+ content = BytesIO('''<?xml version="1.0" encoding="utf-8"?> <some_ns_id:some_head_elem xmlns:some_ns_id="http://www.example.com" xmlns:xhtml="http://www.w3.org/1999/xhtml"><xhtml:div></xhtml:div></some_ns_id:some_head_elem>'''.encode('utf-8'))
+ def handle_div_end(event, element):
+ if event == 'end' and element.tag.lower().startswith("{http://www.w3.org/1999/xhtml}div"):
+ # for ns_id, ns_uri in element.nsmap.items():
+ # print(type(ns_id), type(ns_uri), ns_id, '=', ns_uri)
+ etree.tostring(element, method="c14n2")
+ for event, element in etree.iterparse(
+ source=content,
+ events=('start', 'end')
+ ):
+ handle_div_end(event, element)
+
+ def test_python3_problem_filebased_iterparse(self):
+ with open('test.xml', 'w+b') as f:
+ f.write('''<?xml version="1.0" encoding="utf-8"?> <some_ns_id:some_head_elem xmlns:some_ns_id="http://www.example.com" xmlns:xhtml="http://www.w3.org/1999/xhtml"><xhtml:div></xhtml:div></some_ns_id:some_head_elem>'''.encode('utf-8'))
+ def handle_div_end(event, element):
+ if event == 'end' and element.tag.lower() == "{http://www.w3.org/1999/xhtml}div":
+ # for ns_id, ns_uri in element.nsmap.items():
+ # print(type(ns_id), type(ns_uri), ns_id, '=', ns_uri)
+ etree.tostring(element, method="c14n2")
+ for event, element in etree.iterparse(
+ source='test.xml',
+ events=('start', 'end')
+ ):
+ handle_div_end(event, element)
+
+ def test_python3_problem_filebased_parse(self):
+ with open('test.xml', 'w+b') as f:
+ f.write('''<?xml version="1.0" encoding="utf-8"?> <some_ns_id:some_head_elem xmlns:some_ns_id="http://www.example.com" xmlns:xhtml="http://www.w3.org/1999/xhtml"><xhtml:div></xhtml:div></some_ns_id:some_head_elem>'''.encode('utf-8'))
+ def serialize_div_element(element):
+ # for ns_id, ns_uri in element.nsmap.items():
+ # print(type(ns_id), type(ns_uri), ns_id, '=', ns_uri)
+ etree.tostring(element, method="c14n2")
+ tree = etree.parse(source='test.xml')
+ root = tree.getroot()
+ div = root.xpath('//xhtml:div', namespaces={'xhtml':'http://www.w3.org/1999/xhtml'})[0]
+ serialize_div_element(div)
class ETreeWriteTestCase(HelperTestCase):