summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_xml_etree.py
diff options
context:
space:
mode:
authorEli Bendersky <eliben@gmail.com>2012-04-03 19:02:37 (GMT)
committerEli Bendersky <eliben@gmail.com>2012-04-03 19:02:37 (GMT)
commitebf37a2ffbe001f0b84cf90c76c747ede9dfd036 (patch)
treebf2a276f2b183f34ef323e557244f42674cbc79a /Lib/test/test_xml_etree.py
parent5c73e8eaf40e092dfb3c2a92195b300afc99d2cf (diff)
downloadcpython-ebf37a2ffbe001f0b84cf90c76c747ede9dfd036.zip
cpython-ebf37a2ffbe001f0b84cf90c76c747ede9dfd036.tar.gz
cpython-ebf37a2ffbe001f0b84cf90c76c747ede9dfd036.tar.bz2
Fixes and enhancements to _elementtree:
* Fixed refleak problems when GC collection is run (see messages in issue #14065) * Added weakref support to Element objects
Diffstat (limited to 'Lib/test/test_xml_etree.py')
-rw-r--r--Lib/test/test_xml_etree.py35
1 files changed, 35 insertions, 0 deletions
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index aa9a40d..2b05df8 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -1859,6 +1859,41 @@ class BasicElementTest(unittest.TestCase):
gc_collect()
self.assertIsNone(wref())
+ # A longer cycle: d->e->e2->d
+ e = ET.Element('joe')
+ d = Dummy()
+ d.dummyref = e
+ wref = weakref.ref(d)
+ e2 = ET.SubElement(e, 'foo', attr=d)
+ del d, e, e2
+ gc_collect()
+ self.assertIsNone(wref())
+
+ # A cycle between Element objects as children of one another
+ # e1->e2->e3->e1
+ e1 = ET.Element('e1')
+ e2 = ET.Element('e2')
+ e3 = ET.Element('e3')
+ e1.append(e2)
+ e2.append(e2)
+ e3.append(e1)
+ wref = weakref.ref(e1)
+ del e1, e2, e3
+ gc_collect()
+ self.assertIsNone(wref())
+
+ def test_weakref(self):
+ flag = False
+ def wref_cb(w):
+ nonlocal flag
+ flag = True
+ e = ET.Element('e')
+ wref = weakref.ref(e, wref_cb)
+ self.assertEqual(wref().tag, 'e')
+ del e
+ self.assertEqual(flag, True)
+ self.assertEqual(wref(), None)
+
class ElementTreeTest(unittest.TestCase):
def test_istype(self):