diff options
| author | scoder <none@none> | 2008-05-28 22:08:00 +0200 |
|---|---|---|
| committer | scoder <none@none> | 2008-05-28 22:08:00 +0200 |
| commit | 9ca3ef2ad757f648fb8978b3da10c651fc170010 (patch) | |
| tree | 7e6be6eb2784b354fce352ae1d834137651d94cb /src | |
| parent | b9680319f3997c8d3c4834c5e5db4fb8c020f18e (diff) | |
| download | python-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.py | 28 | ||||
| -rw-r--r-- | src/lxml/tests/test_threading.py | 47 |
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() |
