summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_xml_etree_c.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_xml_etree_c.py')
-rw-r--r--Lib/test/test_xml_etree_c.py157
1 files changed, 12 insertions, 145 deletions
diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py
index 2144d20..71a755c 100644
--- a/Lib/test/test_xml_etree_c.py
+++ b/Lib/test/test_xml_etree_c.py
@@ -1,23 +1,19 @@
# xml.etree test for cElementTree
-import io
-import struct
-from test import support
-from test.support import import_fresh_module
-import types
+
+from test import test_support
+from test.test_support import precisionbigmemtest, _2G
import unittest
-cET = import_fresh_module('xml.etree.ElementTree',
- fresh=['_elementtree'])
-cET_alias = import_fresh_module('xml.etree.cElementTree',
- fresh=['_elementtree', 'xml.etree'],
- deprecated=True)
+cET = test_support.import_module('xml.etree.cElementTree')
@unittest.skipUnless(cET, 'requires _elementtree')
class MiscTests(unittest.TestCase):
# Issue #8651.
- @support.bigmemtest(size=support._2G + 100, memuse=1, dry_run=False)
+ @precisionbigmemtest(size=_2G + 100, memuse=1)
def test_length_overflow(self, size):
+ if size < _2G + 100:
+ self.skipTest("not enough free memory, need at least 2 GB")
data = b'x' * size
parser = cET.XMLParser()
try:
@@ -57,39 +53,10 @@ class MiscTests(unittest.TestCase):
del element.attrib
self.assertEqual(element.attrib, {'A': 'B', 'C': 'D'})
- def test_trashcan(self):
- # If this test fails, it will most likely die via segfault.
- e = root = cET.Element('root')
- for i in range(200000):
- e = cET.SubElement(e, 'x')
- del e
- del root
- support.gc_collect()
-
- def test_parser_ref_cycle(self):
- # bpo-31499: xmlparser_dealloc() crashed with a segmentation fault when
- # xmlparser_gc_clear() was called previously by the garbage collector,
- # when the parser was part of a reference cycle.
-
- def parser_ref_cycle():
- parser = cET.XMLParser()
- # Create a reference cycle using an exception to keep the frame
- # alive, so the parser will be destroyed by the garbage collector
- try:
- raise ValueError
- except ValueError as exc:
- err = exc
-
- # Create a parser part of reference cycle
- parser_ref_cycle()
- # Trigger an explicit garbage collection to break the reference cycle
- # and so destroy the parser
- support.gc_collect()
-
def test_bpo_31728(self):
- # A crash or an assertion failure shouldn't happen, in case garbage
- # collection triggers a call to clear() or a reading of text or tail,
- # while a setter or clear() or __setstate__() is already running.
+ # A crash shouldn't happen in case garbage collection triggers a call
+ # to clear() or a reading of text or tail, while a setter or clear()
+ # is already running.
elem = cET.Element('elem')
class X:
def __del__(self):
@@ -111,112 +78,12 @@ class MiscTests(unittest.TestCase):
elem.tail = X() # shouldn't crash
elem.clear()
- elem.text = X()
- elem.__setstate__({'tag': 42}) # shouldn't cause an assertion failure
- elem.clear()
-
- elem.tail = X()
- elem.__setstate__({'tag': 42}) # shouldn't cause an assertion failure
-
- def test_setstate_leaks(self):
- # Test reference leaks
- elem = cET.Element.__new__(cET.Element)
- for i in range(100):
- elem.__setstate__({'tag': 'foo', 'attrib': {'bar': 42},
- '_children': [cET.Element('child')],
- 'text': 'text goes here',
- 'tail': 'opposite of head'})
-
- self.assertEqual(elem.tag, 'foo')
- self.assertEqual(elem.text, 'text goes here')
- self.assertEqual(elem.tail, 'opposite of head')
- self.assertEqual(list(elem.attrib.items()), [('bar', 42)])
- self.assertEqual(len(elem), 1)
- self.assertEqual(elem[0].tag, 'child')
-
- def test_iterparse_leaks(self):
- # Test reference leaks in TreeBuilder (issue #35502).
- # The test is written to be executed in the hunting reference leaks
- # mode.
- XML = '<a></a></b>'
- parser = cET.iterparse(io.StringIO(XML))
- next(parser)
- del parser
- support.gc_collect()
-
- def test_xmlpullparser_leaks(self):
- # Test reference leaks in TreeBuilder (issue #35502).
- # The test is written to be executed in the hunting reference leaks
- # mode.
- XML = '<a></a></b>'
- parser = cET.XMLPullParser()
- parser.feed(XML)
- del parser
- support.gc_collect()
-
-
-@unittest.skipUnless(cET, 'requires _elementtree')
-class TestAliasWorking(unittest.TestCase):
- # Test that the cET alias module is alive
- def test_alias_working(self):
- e = cET_alias.Element('foo')
- self.assertEqual(e.tag, 'foo')
-
-
-@unittest.skipUnless(cET, 'requires _elementtree')
-@support.cpython_only
-class TestAcceleratorImported(unittest.TestCase):
- # Test that the C accelerator was imported, as expected
- def test_correct_import_cET(self):
- # SubElement is a function so it retains _elementtree as its module.
- self.assertEqual(cET.SubElement.__module__, '_elementtree')
-
- def test_correct_import_cET_alias(self):
- self.assertEqual(cET_alias.SubElement.__module__, '_elementtree')
-
- def test_parser_comes_from_C(self):
- # The type of methods defined in Python code is types.FunctionType,
- # while the type of methods defined inside _elementtree is
- # <class 'wrapper_descriptor'>
- self.assertNotIsInstance(cET.Element.__init__, types.FunctionType)
-
-
-@unittest.skipUnless(cET, 'requires _elementtree')
-@support.cpython_only
-class SizeofTest(unittest.TestCase):
- def setUp(self):
- self.elementsize = support.calcobjsize('5P')
- # extra
- self.extra = struct.calcsize('PnnP4P')
-
- check_sizeof = support.check_sizeof
-
- def test_element(self):
- e = cET.Element('a')
- self.check_sizeof(e, self.elementsize)
-
- def test_element_with_attrib(self):
- e = cET.Element('a', href='about:')
- self.check_sizeof(e, self.elementsize + self.extra)
-
- def test_element_with_children(self):
- e = cET.Element('a')
- for i in range(5):
- cET.SubElement(e, 'span')
- # should have space for 8 children now
- self.check_sizeof(e, self.elementsize + self.extra +
- struct.calcsize('8P'))
def test_main():
- from test import test_xml_etree
+ from test import test_xml_etree, test_xml_etree_c
# Run the tests specific to the C implementation
- support.run_unittest(
- MiscTests,
- TestAliasWorking,
- TestAcceleratorImported,
- SizeofTest,
- )
+ test_support.run_unittest(MiscTests)
# Run the same test suite as the Python module
test_xml_etree.test_main(module=cET)