Package lxml :: Package tests :: Module test_threading
[frames] | no frames]

Source Code for Module lxml.tests.test_threading

  1  # -*- coding: utf-8 -*- 
  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   
11 -class ThreadingTestCase(HelperTestCase):
12 """Threading tests""" 13 etree = etree 14
15 - def _run_thread(self, func):
16 thread = threading.Thread(target=func) 17 thread.start() 18 thread.join()
19
20 - def test_subtree_copy_thread(self):
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
34 - def test_main_xslt_in_thread(self):
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
58 - def test_thread_xslt(self):
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
78 - def test_thread_mix(self):
79 XML = self.etree.XML 80 Element = self.etree.Element 81 SubElement = self.etree.SubElement 82 tostring = self.etree.tostring 83 xml = '<a><b>B</b><c xmlns="test">C</c></a>' 84 root = XML(xml) 85 fragment = XML("<other><tags/></other>") 86 87 result = self.etree.Element("{myns}root", att = "someval") 88 89 def run_XML(): 90 thread_root = XML(xml) 91 result.append(thread_root[0]) 92 result.append(thread_root[-1])
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
138 -def test_suite():
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