diff options
Diffstat (limited to 'Lib/test/test_xml_etree_c.py')
-rw-r--r-- | Lib/test/test_xml_etree_c.py | 157 |
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) |