summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorscoder <none@none>2008-05-28 22:08:00 +0200
committerscoder <none@none>2008-05-28 22:08:00 +0200
commit9ca3ef2ad757f648fb8978b3da10c651fc170010 (patch)
tree7e6be6eb2784b354fce352ae1d834137651d94cb /src
parentb9680319f3997c8d3c4834c5e5db4fb8c020f18e (diff)
downloadpython-lxml-9ca3ef2ad757f648fb8978b3da10c651fc170010.tar.gz
[svn r3771] r4409@delle: sbehnel | 2008-05-28 18:11:40 +0200
concurrency tests for _elementFactory() --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/lxml/tests/test_classlookup.py28
-rw-r--r--src/lxml/tests/test_threading.py47
2 files changed, 75 insertions, 0 deletions
diff --git a/src/lxml/tests/test_classlookup.py b/src/lxml/tests/test_classlookup.py
index fca963b6..413a178e 100644
--- a/src/lxml/tests/test_classlookup.py
+++ b/src/lxml/tests/test_classlookup.py
@@ -157,6 +157,34 @@ class ClassLookupTestCase(HelperTestCase):
self.assertFalse(hasattr(root, 'FIND_ME'))
self.assertFalse(hasattr(root[0], 'FIND_ME'))
+ def test_class_lookup_reentry(self):
+ XML = self.etree.XML
+
+ class TestElement(etree.ElementBase):
+ FIND_ME = "here"
+
+ root = None
+ class MyLookup(etree.CustomElementClassLookup):
+ el = None
+ def lookup(self, t, d, ns, name):
+ if root is not None: # not in the parser
+ if self.el is None and name == "a":
+ self.el = []
+ self.el.append(root.find(name))
+ return TestElement
+
+ parser = self.etree.XMLParser()
+ parser.set_element_class_lookup(MyLookup())
+
+ root = XML(_bytes('<root><a>A</a><b xmlns="test">B</b></root>'),
+ parser)
+
+ a = root[0]
+ self.assertEquals(a.tag, "a")
+ self.assertEquals(root[0].tag, "a")
+ del a
+ self.assertEquals(root[0].tag, "a")
+
def test_suite():
suite = unittest.TestSuite()
diff --git a/src/lxml/tests/test_threading.py b/src/lxml/tests/test_threading.py
index 775e1c7d..24349522 100644
--- a/src/lxml/tests/test_threading.py
+++ b/src/lxml/tests/test_threading.py
@@ -138,6 +138,53 @@ class ThreadingTestCase(HelperTestCase):
_bytes('<ns0:root xmlns:ns0="myns" att="someval"/>'),
tostring(result))
+ def test_concurrent_proxies(self):
+ XML = self.etree.XML
+ root = XML(_bytes('<root><a>A</a><b xmlns="test">B</b><c/></root>'))
+ child_count = len(root)
+ def testrun():
+ for i in range(10000):
+ el = root[i%child_count]
+ del el
+ threads = [ threading.Thread(target=testrun)
+ for _ in range(10) ]
+ for thread in threads:
+ thread.start()
+ for thread in threads:
+ thread.join()
+
+ def test_concurrent_class_lookup(self):
+ XML = self.etree.XML
+
+ class TestElement(etree.ElementBase):
+ pass
+
+ class MyLookup(etree.CustomElementClassLookup):
+ repeat = range(100)
+ def lookup(self, t, d, ns, name):
+ count = 0
+ for i in self.repeat:
+ # allow other threads to run
+ count += 1
+ return TestElement
+
+ parser = self.etree.XMLParser()
+ parser.set_element_class_lookup(MyLookup())
+
+ root = XML(_bytes('<root><a>A</a><b xmlns="test">B</b><c/></root>'),
+ parser)
+
+ child_count = len(root)
+ def testrun():
+ for i in range(1000):
+ el = root[i%child_count]
+ del el
+ threads = [ threading.Thread(target=testrun)
+ for _ in range(10) ]
+ for thread in threads:
+ thread.start()
+ for thread in threads:
+ thread.join()
def test_suite():
suite = unittest.TestSuite()