1
2
3 """
4 IO test cases that apply to both etree and ElementTree
5 """
6
7 import unittest
8 import tempfile, gzip, os, gc, shutil
9
10 from common_imports import etree, ElementTree, fileInTestDir
11 from common_imports import SillyFileLike, LargeFileLike, HelperTestCase
12
14 """(c)ElementTree compatibility for IO functions/methods
15 """
16 etree = None
17
25
27 gc.collect()
28 shutil.rmtree(self._temp_dir)
29
31 return os.path.join(self._temp_dir, name)
32
34 Element = self.etree.Element
35
36 if depth == 0:
37 return
38 for i in range(children):
39 new_element = Element('element_%s_%s' % (depth, i))
40 self.buildNodes(new_element, children, depth - 1)
41 element.append(new_element)
42
44 Element = self.etree.Element
45 ElementTree = self.etree.ElementTree
46
47 element = Element('top')
48 tree = ElementTree(element)
49 self.buildNodes(element, 10, 3)
50 f = open(self.getTestFilePath('testdump.xml'), 'w')
51 tree.write(f, encoding='UTF-8')
52 f.close()
53 f = open(self.getTestFilePath('testdump.xml'), 'r')
54 tree = ElementTree(file=f)
55 f.close()
56 f = open(self.getTestFilePath('testdump2.xml'), 'w')
57 tree.write(f, encoding='UTF-8')
58 f.close()
59 f = open(self.getTestFilePath('testdump.xml'), 'r')
60 data1 = f.read()
61 f.close()
62 f = open(self.getTestFilePath('testdump2.xml'), 'r')
63 data2 = f.read()
64 f.close()
65 self.assertEquals(data1, data2)
66
68
69
70 handle, filename = tempfile.mkstemp(suffix=".xml")
71 self.tree.write(filename)
72 try:
73 self.assertEqual(open(filename).read().replace('\n', ''),
74 self.root_str)
75 finally:
76 os.close(handle)
77 os.remove(filename)
78
80
81 handle, filename = tempfile.mkstemp(suffix=".xml.gz")
82 f = gzip.open(filename, 'wb')
83 f.write(self.root_str)
84 f.close()
85 try:
86 f_gz = gzip.open(filename, 'r')
87 tree = self.etree.parse(f_gz)
88 f_gz.close()
89 self.assertEqual(self.etree.tostring(tree.getroot()), self.root_str)
90 finally:
91 os.close(handle)
92 os.remove(filename)
93
95
96
97
98
99
100 handle, filename = tempfile.mkstemp(suffix=".xml")
101 open(filename, 'wb').write(self.root_str)
102 try:
103 tree = self.etree.ElementTree()
104 root = tree.parse(filename)
105 self.assertEqual(self.etree.tostring(root), self.root_str)
106 finally:
107 os.close(handle)
108 os.remove(filename)
109
111 handle, filename = tempfile.mkstemp(suffix=".xml")
112 open(filename, 'wb').write(self.root_str)
113 try:
114 tree = self.etree.ElementTree()
115 root = tree.parse(filename)
116
117 root2 = tree.parse(filename)
118 self.assertEquals('a', root.tag)
119 self.assertEquals('a', root2.tag)
120
121 del root2
122 root3 = tree.parse(filename)
123 self.assertEquals('a', root.tag)
124 self.assertEquals('a', root3.tag)
125
126
127 finally:
128 os.close(handle)
129 os.remove(filename)
130
132
133
134
135
136
137 handle, filename = tempfile.mkstemp(suffix=".xml")
138 os.write(handle, self.root_str)
139 try:
140 f = open(filename, 'r')
141 tree = self.etree.ElementTree()
142 root = tree.parse(f)
143 f.close()
144 self.assertEqual(self.etree.tostring(root), self.root_str)
145 finally:
146 os.close(handle)
147 os.remove(filename)
148
157
164
166 class LocalError(Exception):
167 pass
168 class TestFile:
169 def read(*args):
170 raise LocalError
171 f = TestFile()
172 self.assertRaises(LocalError, self.etree.parse, f)
173
175 class LocalError(Exception):
176 pass
177 class TestFile:
178 data = '<root>test</'
179 next_char = iter(data).next
180 counter = 0
181 def read(self, amount=None):
182 if amount is None:
183 while True:
184 self.read(1)
185 else:
186 try:
187 self.counter += 1
188 return self.next_char()
189 except StopIteration:
190 raise LocalError
191 f = TestFile()
192 self.assertRaises(LocalError, self.etree.parse, f)
193 self.assertEquals(f.counter, len(f.data)+1)
194
196 class TestFile:
197 def read(*args):
198 return 1
199 f = TestFile()
200 self.assertRaises(TypeError, self.etree.parse, f)
201
202
205
206 if ElementTree:
209
216
217 if __name__ == '__main__':
218 print 'to test use test.py %s' % __file__
219