1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
# -*- coding: utf-8 -*-
"""
Web IO test cases (wsgiref)
"""
from __future__ import absolute_import
import unittest
import textwrap
import sys
import gzip
from .common_imports import etree, HelperTestCase, BytesIO, _bytes
from .dummy_http_server import webserver, HTTPRequestCollector
class HttpIOTestCase(HelperTestCase):
etree = etree
def _parse_from_http(self, data, code=200, headers=None, parser=None):
handler = HTTPRequestCollector(data, code, headers)
with webserver(handler) as host_url:
tree = self.etree.parse(host_url + 'TEST', parser=parser)
self.assertEqual([('/TEST', [])], handler.requests)
return tree
def test_http_client(self):
tree = self._parse_from_http(_bytes('<root><a/></root>'))
self.assertEqual('root', tree.getroot().tag)
self.assertEqual('a', tree.getroot()[0].tag)
def test_http_client_404(self):
try:
self._parse_from_http(_bytes('<root/>'), code=404)
except IOError:
self.assertTrue(True)
else:
self.assertTrue(False, "expected IOError")
def test_http_client_gzip(self):
f = BytesIO()
gz = gzip.GzipFile(fileobj=f, mode='w', filename='test.xml')
gz.write(_bytes('<root><a/></root>'))
gz.close()
data = f.getvalue()
del f, gz
headers = [('Content-Encoding', 'gzip')]
tree = self._parse_from_http(data, headers=headers)
self.assertEqual('root', tree.getroot().tag)
self.assertEqual('a', tree.getroot()[0].tag)
def test_parser_input_mix(self):
data = _bytes('<root><a/></root>')
handler = HTTPRequestCollector(data)
with webserver(handler) as host_url:
tree = self.etree.parse(host_url)
root = tree.getroot()
self.assertEqual('a', root[0].tag)
root = self.etree.fromstring(data)
self.assertEqual('a', root[0].tag)
tree = self.etree.parse(host_url)
root = tree.getroot()
self.assertEqual('a', root[0].tag)
root = self.etree.fromstring(data)
self.assertEqual('a', root[0].tag)
root = self.etree.fromstring(data)
self.assertEqual('a', root[0].tag)
def test_network_dtd(self):
data = [_bytes(textwrap.dedent(s)) for s in [
# XML file
'''\
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "./file.dtd">
<root>&myentity;</root>
''',
# DTD
'<!ENTITY myentity "DEFINED">',
]]
responses = []
def handler(environ, start_response):
start_response('200 OK', [])
return [responses.pop()]
with webserver(handler) as host_url:
# DTD network loading enabled
responses = data[::-1]
tree = self.etree.parse(
host_url + 'dir/test.xml',
parser=self.etree.XMLParser(
load_dtd=True, no_network=False))
self.assertFalse(responses) # all read
root = tree.getroot()
self.assertEqual('DEFINED', root.text)
# DTD network loading disabled
responses = data[::-1]
try:
self.etree.parse(
host_url + 'dir/test.xml',
parser=self.etree.XMLParser(
load_dtd=True, no_network=True))
except self.etree.XMLSyntaxError:
self.assertTrue("myentity" in str(sys.exc_info()[1]))
else:
self.assertTrue(False)
self.assertEqual(1, len(responses)) # DTD not read
def test_suite():
suite = unittest.TestSuite()
suite.addTests([unittest.makeSuite(HttpIOTestCase)])
return suite
if __name__ == '__main__':
print('to test use test.py %s' % __file__)
|