1
2
3 """
4 Tests for thread usage in lxml.etree.
5 """
6
7 import unittest, threading
8
9 from common_imports import etree, HelperTestCase, StringIO
10
12 """Threading tests"""
13 etree = etree
14
16 thread = threading.Thread(target=func)
17 thread.start()
18 thread.join()
19
21 tostring = self.etree.tostring
22 XML = self.etree.XML
23 xml = "<root><threadtag/></root>"
24 main_root = XML("<root/>")
25
26 def run_thread():
27 thread_root = XML(xml)
28 main_root.append(thread_root[0])
29 del thread_root
30
31 self._run_thread(run_thread)
32 self.assertEquals(xml, tostring(main_root))
33
35 XML = self.etree.XML
36 style = XML('''\
37 <xsl:stylesheet version="1.0"
38 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
39 <xsl:template match="*">
40 <foo><xsl:copy><xsl:value-of select="/a/b/text()" /></xsl:copy></foo>
41 </xsl:template>
42 </xsl:stylesheet>''')
43 st = etree.XSLT(style)
44
45 result = []
46
47 def run_thread():
48 root = XML('<a><b>B</b><c>C</c></a>')
49 result.append( st(root) )
50
51 self._run_thread(run_thread)
52 self.assertEquals('''\
53 <?xml version="1.0"?>
54 <foo><a>B</a></foo>
55 ''',
56 str(result[0]))
57
59 XML = self.etree.XML
60 tostring = self.etree.tostring
61 root = XML('<a><b>B</b><c>C</c></a>')
62
63 def run_thread():
64 style = XML('''\
65 <xsl:stylesheet version="1.0"
66 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
67 <xsl:template match="*">
68 <foo><xsl:copy><xsl:value-of select="/a/b/text()" /></xsl:copy></foo>
69 </xsl:template>
70 </xsl:stylesheet>''')
71 st = etree.XSLT(style)
72 root.append( st(root).getroot() )
73
74 self._run_thread(run_thread)
75 self.assertEquals('<a><b>B</b><c>C</c><foo><a>B</a></foo></a>',
76 tostring(root))
77
93
94 def run_parse():
95 thread_root = self.etree.parse(StringIO(xml)).getroot()
96 result.append(thread_root[0])
97 result.append(thread_root[-1])
98
99 def run_move_main():
100 result.append(fragment[0])
101
102 def run_build():
103 result.append(
104 Element("{myns}foo", attrib={'{test}attr':'val'}))
105 SubElement(result, "{otherns}tasty")
106
107 def run_xslt():
108 style = XML('''\
109 <xsl:stylesheet version="1.0"
110 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
111 <xsl:template match="*">
112 <foo><xsl:copy><xsl:value-of select="/a/b/text()" /></xsl:copy></foo>
113 </xsl:template>
114 </xsl:stylesheet>''')
115 st = etree.XSLT(style)
116 result.append( st(root).getroot()[0] )
117
118 for test in (run_XML, run_parse, run_move_main, run_xslt):
119 tostring(result)
120 self._run_thread(test)
121
122 self.assertEquals(
123 '<ns0:root xmlns:ns0="myns" att="someval"><b>B</b><c xmlns="test">C</c><b>B</b><c xmlns="test">C</c><tags/><a>B</a></ns0:root>',
124 tostring(result))
125
126 def strip_first():
127 root = Element("newroot")
128 root.append(result[0])
129
130 while len(result):
131 self._run_thread(strip_first)
132
133 self.assertEquals(
134 '<ns0:root xmlns:ns0="myns" att="someval"/>',
135 tostring(result))
136
137
139 suite = unittest.TestSuite()
140 suite.addTests([unittest.makeSuite(ThreadingTestCase)])
141 return suite
142
143 if __name__ == '__main__':
144 print 'to test use test.py %s' % __file__
145