mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 10:44:09 -04:00
Infrastructure for testing http server
This commit is contained in:
parent
be2c8a35ee
commit
4cd7ff3968
@ -7,8 +7,9 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import unittest, shutil
|
import unittest, shutil, time, httplib
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
from threading import Thread
|
||||||
|
|
||||||
rmtree = partial(shutil.rmtree, ignore_errors=True)
|
rmtree = partial(shutil.rmtree, ignore_errors=True)
|
||||||
|
|
||||||
@ -20,3 +21,37 @@ class BaseTest(unittest.TestCase):
|
|||||||
ae = unittest.TestCase.assertEqual
|
ae = unittest.TestCase.assertEqual
|
||||||
|
|
||||||
|
|
||||||
|
class TestServer(Thread):
|
||||||
|
|
||||||
|
daemon = True
|
||||||
|
|
||||||
|
def __init__(self, handler):
|
||||||
|
Thread.__init__(self, name='ServerMain')
|
||||||
|
from calibre.srv.opts import Options
|
||||||
|
from calibre.srv.loop import ServerLoop
|
||||||
|
from calibre.srv.http import create_http_handler
|
||||||
|
from calibre.utils.logging import ThreadSafeLog
|
||||||
|
self.loop = ServerLoop(
|
||||||
|
opts=Options(shutdown_timeout=0.1),
|
||||||
|
bind_address=('localhost', 0), http_handler=create_http_handler(handler),
|
||||||
|
log=ThreadSafeLog(level=ThreadSafeLog.WARN),
|
||||||
|
)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
try:
|
||||||
|
self.loop.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
self.start()
|
||||||
|
while not self.loop.ready and self.is_alive():
|
||||||
|
time.sleep(0.01)
|
||||||
|
self.address = self.loop.bound_address[:2]
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, *args):
|
||||||
|
self.loop.stop()
|
||||||
|
|
||||||
|
def connect(self):
|
||||||
|
return httplib.HTTPConnection(self.address[0], self.address[1], strict=True, timeout=0.1)
|
||||||
|
@ -6,17 +6,17 @@ from __future__ import (unicode_literals, division, absolute_import,
|
|||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
|
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||||
|
|
||||||
import textwrap
|
import textwrap, httplib
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from calibre.srv.tests.base import BaseTest
|
from calibre.srv.tests.base import BaseTest, TestServer
|
||||||
|
|
||||||
def headers(raw):
|
def headers(raw):
|
||||||
return BytesIO(textwrap.dedent(raw).encode('utf-8'))
|
return BytesIO(textwrap.dedent(raw).encode('utf-8'))
|
||||||
|
|
||||||
class TestHTTP(BaseTest):
|
class TestHTTP(BaseTest):
|
||||||
|
|
||||||
def test_header_parsing(self):
|
def test_header_parsing(self): # {{{
|
||||||
'Test parsing of HTTP headers'
|
'Test parsing of HTTP headers'
|
||||||
from calibre.srv.http import read_headers
|
from calibre.srv.http import read_headers
|
||||||
|
|
||||||
@ -44,8 +44,9 @@ class TestHTTP(BaseTest):
|
|||||||
read_headers(headers('Connection:a\r\n').readline)
|
read_headers(headers('Connection:a\r\n').readline)
|
||||||
read_headers(headers('Connection:a\n').readline)
|
read_headers(headers('Connection:a\n').readline)
|
||||||
read_headers(headers(' Connection:a\n').readline)
|
read_headers(headers(' Connection:a\n').readline)
|
||||||
|
# }}}
|
||||||
|
|
||||||
def test_accept_encoding(self):
|
def test_accept_encoding(self): # {{{
|
||||||
'Test parsing of Accept-Encoding'
|
'Test parsing of Accept-Encoding'
|
||||||
from calibre.srv.http import acceptable_encoding
|
from calibre.srv.http import acceptable_encoding
|
||||||
def test(name, val, ans, allowed={'gzip'}):
|
def test(name, val, ans, allowed={'gzip'}):
|
||||||
@ -55,4 +56,16 @@ class TestHTTP(BaseTest):
|
|||||||
test('Case insensitive', 'GZIp', 'gzip')
|
test('Case insensitive', 'GZIp', 'gzip')
|
||||||
test('Multiple', 'gzip, identity', 'gzip')
|
test('Multiple', 'gzip, identity', 'gzip')
|
||||||
test('Priority', '1;q=0.5, 2;q=0.75, 3;q=1.0', '3', {'1', '2', '3'})
|
test('Priority', '1;q=0.5, 2;q=0.75, 3;q=1.0', '3', {'1', '2', '3'})
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
def test_http_basic(self): # {{{
|
||||||
|
'Test basic HTTP protocol conformance'
|
||||||
|
from calibre.srv.errors import HTTP404
|
||||||
|
def handler(conn):
|
||||||
|
raise HTTP404('Requested resource not found')
|
||||||
|
with TestServer(handler) as server:
|
||||||
|
conn = server.connect()
|
||||||
|
conn.request('HEAD', '/moose')
|
||||||
|
r = conn.getresponse()
|
||||||
|
self.ae(r.status, httplib.NOT_FOUND)
|
||||||
|
# }}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user