blob: 7c60699f91262c9806f7af8fa2d89f6ee8ff4548 [file] [log] [blame]
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001# xml.etree test for cElementTree
Berker Peksag1e8ee9b2016-04-24 07:31:42 +03002import struct
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003from test import support
Florent Xicluna6c3da6e2012-02-13 12:14:52 +01004from test.support import import_fresh_module
Eli Benderskye26fa1b2013-05-19 17:49:54 -07005import types
Victor Stinnerb3c9e072011-01-04 02:07:34 +00006import unittest
Fredrik Lundh9235ea42005-12-15 18:41:22 +00007
Eli Bendersky23687042013-02-26 05:53:23 -08008cET = import_fresh_module('xml.etree.ElementTree',
9 fresh=['_elementtree'])
10cET_alias = import_fresh_module('xml.etree.cElementTree',
11 fresh=['_elementtree', 'xml.etree'])
Fredrik Lundh8911ca3d2005-12-16 22:07:17 +000012
Fredrik Lundh9235ea42005-12-15 18:41:22 +000013
Serhiy Storchaka18f018c2016-12-21 12:32:56 +020014@unittest.skipUnless(cET, 'requires _elementtree')
Victor Stinnerb3c9e072011-01-04 02:07:34 +000015class MiscTests(unittest.TestCase):
16 # Issue #8651.
Serhiy Storchaka4847e4e2014-01-10 13:37:54 +020017 @support.bigmemtest(size=support._2G + 100, memuse=1, dry_run=False)
Victor Stinnerb3c9e072011-01-04 02:07:34 +000018 def test_length_overflow(self, size):
Victor Stinnerb3c9e072011-01-04 02:07:34 +000019 data = b'x' * size
20 parser = cET.XMLParser()
21 try:
22 self.assertRaises(OverflowError, parser.feed, data)
23 finally:
24 data = None
25
Serhiy Storchakab6aa5372015-11-23 08:42:25 +020026 def test_del_attribute(self):
27 element = cET.Element('tag')
28
29 element.tag = 'TAG'
30 with self.assertRaises(AttributeError):
31 del element.tag
32 self.assertEqual(element.tag, 'TAG')
33
34 with self.assertRaises(AttributeError):
35 del element.text
36 self.assertIsNone(element.text)
37 element.text = 'TEXT'
38 with self.assertRaises(AttributeError):
39 del element.text
40 self.assertEqual(element.text, 'TEXT')
41
42 with self.assertRaises(AttributeError):
43 del element.tail
44 self.assertIsNone(element.tail)
45 element.tail = 'TAIL'
46 with self.assertRaises(AttributeError):
47 del element.tail
48 self.assertEqual(element.tail, 'TAIL')
49
50 with self.assertRaises(AttributeError):
51 del element.attrib
52 self.assertEqual(element.attrib, {})
53 element.attrib = {'A': 'B', 'C': 'D'}
54 with self.assertRaises(AttributeError):
55 del element.attrib
56 self.assertEqual(element.attrib, {'A': 'B', 'C': 'D'})
57
Serhiy Storchaka18f018c2016-12-21 12:32:56 +020058 def test_trashcan(self):
59 # If this test fails, it will most likely die via segfault.
60 e = root = cET.Element('root')
61 for i in range(200000):
62 e = cET.SubElement(e, 'x')
63 del e
64 del root
65 support.gc_collect()
66
Eli Bendersky64d11e62012-06-15 07:42:50 +030067
Eli Bendersky292f9a82012-02-16 19:55:29 +020068@unittest.skipUnless(cET, 'requires _elementtree')
Eli Bendersky092af1f2012-03-04 07:14:03 +020069class TestAliasWorking(unittest.TestCase):
70 # Test that the cET alias module is alive
71 def test_alias_working(self):
72 e = cET_alias.Element('foo')
73 self.assertEqual(e.tag, 'foo')
Eli Bendersky092af1f2012-03-04 07:14:03 +020074
Eli Bendersky64d11e62012-06-15 07:42:50 +030075
Eli Bendersky092af1f2012-03-04 07:14:03 +020076@unittest.skipUnless(cET, 'requires _elementtree')
Eli Benderskye26fa1b2013-05-19 17:49:54 -070077@support.cpython_only
Eli Benderskyda578192012-02-16 06:52:39 +020078class TestAcceleratorImported(unittest.TestCase):
79 # Test that the C accelerator was imported, as expected
80 def test_correct_import_cET(self):
Eli Benderskye26fa1b2013-05-19 17:49:54 -070081 # SubElement is a function so it retains _elementtree as its module.
Eli Bendersky092af1f2012-03-04 07:14:03 +020082 self.assertEqual(cET.SubElement.__module__, '_elementtree')
Eli Benderskyda578192012-02-16 06:52:39 +020083
Florent Xiclunae59a3062012-02-16 23:17:31 +010084 def test_correct_import_cET_alias(self):
Eli Bendersky092af1f2012-03-04 07:14:03 +020085 self.assertEqual(cET_alias.SubElement.__module__, '_elementtree')
Florent Xiclunae59a3062012-02-16 23:17:31 +010086
Eli Benderskye26fa1b2013-05-19 17:49:54 -070087 def test_parser_comes_from_C(self):
88 # The type of methods defined in Python code is types.FunctionType,
89 # while the type of methods defined inside _elementtree is
90 # <class 'wrapper_descriptor'>
91 self.assertNotIsInstance(cET.Element.__init__, types.FunctionType)
92
Victor Stinnerb3c9e072011-01-04 02:07:34 +000093
Martin v. Löwisbce16662012-06-17 10:41:22 +020094@unittest.skipUnless(cET, 'requires _elementtree')
Martin v. Löwis2b168442012-07-29 16:38:45 +020095@support.cpython_only
Martin v. Löwisbce16662012-06-17 10:41:22 +020096class SizeofTest(unittest.TestCase):
97 def setUp(self):
Martin v. Löwis2b168442012-07-29 16:38:45 +020098 self.elementsize = support.calcobjsize('5P')
Martin v. Löwisbce16662012-06-17 10:41:22 +020099 # extra
Serhiy Storchaka43036a62015-02-16 23:58:46 +0200100 self.extra = struct.calcsize('PnnP4P')
Martin v. Löwisbce16662012-06-17 10:41:22 +0200101
Martin v. Löwis2b168442012-07-29 16:38:45 +0200102 check_sizeof = support.check_sizeof
103
Martin v. Löwisbce16662012-06-17 10:41:22 +0200104 def test_element(self):
105 e = cET.Element('a')
Martin v. Löwis2b168442012-07-29 16:38:45 +0200106 self.check_sizeof(e, self.elementsize)
Martin v. Löwisbce16662012-06-17 10:41:22 +0200107
108 def test_element_with_attrib(self):
109 e = cET.Element('a', href='about:')
Martin v. Löwis2b168442012-07-29 16:38:45 +0200110 self.check_sizeof(e, self.elementsize + self.extra)
Martin v. Löwisbce16662012-06-17 10:41:22 +0200111
112 def test_element_with_children(self):
113 e = cET.Element('a')
114 for i in range(5):
115 cET.SubElement(e, 'span')
116 # should have space for 8 children now
Martin v. Löwis2b168442012-07-29 16:38:45 +0200117 self.check_sizeof(e, self.elementsize + self.extra +
118 struct.calcsize('8P'))
Martin v. Löwisbce16662012-06-17 10:41:22 +0200119
Fredrik Lundh9235ea42005-12-15 18:41:22 +0000120def test_main():
Serhiy Storchakae437a102016-04-24 21:41:02 +0300121 from test import test_xml_etree
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000122
123 # Run the tests specific to the C implementation
Eli Bendersky092af1f2012-03-04 07:14:03 +0200124 support.run_unittest(
125 MiscTests,
126 TestAliasWorking,
Martin v. Löwisbce16662012-06-17 10:41:22 +0200127 TestAcceleratorImported,
128 SizeofTest,
Eli Bendersky092af1f2012-03-04 07:14:03 +0200129 )
Victor Stinnerb3c9e072011-01-04 02:07:34 +0000130
Florent Xiclunaa72a98f2012-02-13 11:03:30 +0100131 # Run the same test suite as the Python module
132 test_xml_etree.test_main(module=cET)
Eli Bendersky092af1f2012-03-04 07:14:03 +0200133
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000134
Fredrik Lundh9235ea42005-12-15 18:41:22 +0000135if __name__ == '__main__':
136 test_main()