lxml.tests.test_http_io

Package lxml :: Package tests :: Module test_http_io |
[hide private]
[frames] | no frames]

# Source Code for Module lxml.tests.test_http_io

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