diff options
Diffstat (limited to 'cherrypy/test')
-rw-r--r-- | cherrypy/test/test_conn.py | 40 | ||||
-rw-r--r-- | cherrypy/test/test_core.py | 39 | ||||
-rw-r--r-- | cherrypy/test/test_wsgi_unix_socket.py | 3 | ||||
-rw-r--r-- | cherrypy/test/webtest.py | 47 |
4 files changed, 52 insertions, 77 deletions
diff --git a/cherrypy/test/test_conn.py b/cherrypy/test/test_conn.py index ab830f3c..703e6dfd 100644 --- a/cherrypy/test/test_conn.py +++ b/cherrypy/test/test_conn.py @@ -3,16 +3,16 @@ import socket import sys import time -timeout = 1 +import errno import cherrypy from cherrypy._cpcompat import HTTPConnection, HTTPSConnection, NotConnected from cherrypy._cpcompat import BadStatusLine, ntob, tonative, urlopen, unicodestr from cherrypy.test import webtest -from cherrypy import _cperror +timeout = 1 pov = 'pPeErRsSiIsStTeEnNcCeE oOfF vViIsSiIoOnN' @@ -751,24 +751,31 @@ def setup_upload_server(): 'server.accepted_queue_timeout': 0.1, }) -import errno -socket_reset_errors = [] -# Not all of these names will be defined for every platform. -for _ in ("ECONNRESET", "WSAECONNRESET"): - if _ in dir(errno): - socket_reset_errors.append(getattr(errno, _)) +reset_names = 'ECONNRESET', 'WSAECONNRESET' +socket_reset_errors = [ + getattr(errno, name) + for name in reset_names + if hasattr(errno, name) +] +"reset error numbers available on this platform" + +socket_reset_errors += [ + # Python 3.5 raises an http.client.RemoteDisconnected + # with this message + "Remote end closed connection without response", +] + class LimitedRequestQueueTests(helper.CPWebCase): - setup_server = staticmethod(setup_upload_server) + setup_server = staticmethod(setup_upload_server) def test_queue_full(self): conns = [] overflow_conn = None - + try: # Make 15 initial requests and leave them open, which should use # all of wsgiserver's WorkerThreads and fill its Queue. - import time for i in range(15): conn = self.HTTP_CONN(self.HOST, self.PORT) conn.putrequest("POST", "/upload", skip_host=True) @@ -777,7 +784,7 @@ class LimitedRequestQueueTests(helper.CPWebCase): conn.putheader("Content-Length", "4") conn.endheaders() conns.append(conn) - + # Now try a 16th conn, which should be closed by the server immediately. overflow_conn = self.HTTP_CONN(self.HOST, self.PORT) # Manually connect since httplib won't let us set a timeout @@ -788,7 +795,7 @@ class LimitedRequestQueueTests(helper.CPWebCase): overflow_conn.sock.settimeout(5) overflow_conn.sock.connect(sa) break - + overflow_conn.putrequest("GET", "/", skip_host=True) overflow_conn.putheader("Host", self.HOST) overflow_conn.endheaders() @@ -799,8 +806,11 @@ class LimitedRequestQueueTests(helper.CPWebCase): if exc.args[0] in socket_reset_errors: pass # Expected. else: - raise AssertionError("Overflow conn did not get RST. " - "Got %s instead" % repr(exc.args)) + tmpl = ( + "Overflow conn did not get RST. " + "Got {exc.args!r} instead" + ) + raise AssertionError(tmpl.format(**locals())) except BadStatusLine: # This is a special case in OS X. Linux and Windows will # RST correctly. diff --git a/cherrypy/test/test_core.py b/cherrypy/test/test_core.py index ae4728de..4ebc170a 100644 --- a/cherrypy/test/test_core.py +++ b/cherrypy/test/test_core.py @@ -9,6 +9,7 @@ import cherrypy from cherrypy._cpcompat import IncompleteRead, itervalues, ntob from cherrypy import _cptools, tools from cherrypy.lib import httputil, static +from cherrypy.test._test_decorators import ExposeExamples favicon_path = os.path.join(os.getcwd(), localDir, "../favicon.ico") @@ -41,10 +42,7 @@ class CoreRequestHandlingTest(helper.CPWebCase): baseurl.exposed = True root = Root() - - if sys.version_info >= (2, 5): - from cherrypy.test._test_decorators import ExposeExamples - root.expose_dec = ExposeExamples() + root.expose_dec = ExposeExamples() class TestType(type): @@ -250,11 +248,7 @@ class CoreRequestHandlingTest(helper.CPWebCase): cherrypy.response.cookie[str(name)] = cookie.value def multiple(self, names): - for name in names: - cookie = cherrypy.request.cookie[name] - # Python2's SimpleCookie.__setitem__ won't take unicode - # keys. - cherrypy.response.cookie[str(name)] = cookie.value + list(map(self.single, names)) def append_headers(header_list, debug=False): if debug: @@ -554,21 +548,31 @@ class CoreRequestHandlingTest(helper.CPWebCase): self.getPage("/favicon.ico") self.assertBody(data) + def skip_if_bad_cookies(self): + """ + cookies module fails to reject invalid cookies + https://bitbucket.org/cherrypy/cherrypy/issues/1405 + """ + cookies = sys.modules.get('http.cookies') + _is_legal_key = getattr(cookies, '_is_legal_key', lambda x: False) + if not _is_legal_key(','): + return + issue = 'http://bugs.python.org/issue26302' + tmpl = "Broken cookies module ({issue})" + self.skip(tmpl.format(**locals())) + def testCookies(self): - if sys.version_info >= (2, 5): - header_value = lambda x: x - else: - header_value = lambda x: x + ';' + self.skip_if_bad_cookies() self.getPage("/cookies/single?name=First", [('Cookie', 'First=Dinsdale;')]) - self.assertHeader('Set-Cookie', header_value('First=Dinsdale')) + self.assertHeader('Set-Cookie', 'First=Dinsdale') self.getPage("/cookies/multiple?names=First&names=Last", [('Cookie', 'First=Dinsdale; Last=Piranha;'), ]) - self.assertHeader('Set-Cookie', header_value('First=Dinsdale')) - self.assertHeader('Set-Cookie', header_value('Last=Piranha')) + self.assertHeader('Set-Cookie', 'First=Dinsdale') + self.assertHeader('Set-Cookie', 'Last=Piranha') self.getPage("/cookies/single?name=Something-With%2CComma", [('Cookie', 'Something-With,Comma=some-value')]) @@ -660,9 +664,6 @@ class CoreRequestHandlingTest(helper.CPWebCase): self.assertBody('/page1') def test_expose_decorator(self): - if not sys.version_info >= (2, 5): - return self.skip("skipped (Python 2.5+ only) ") - # Test @expose self.getPage("/expose_dec/no_call") self.assertStatus(200) diff --git a/cherrypy/test/test_wsgi_unix_socket.py b/cherrypy/test/test_wsgi_unix_socket.py index 0e98a4c5..0a552bc5 100644 --- a/cherrypy/test/test_wsgi_unix_socket.py +++ b/cherrypy/test/test_wsgi_unix_socket.py @@ -2,6 +2,7 @@ import os import sys import socket import atexit +import tempfile import cherrypy from cherrypy.test import helper @@ -9,7 +10,7 @@ from cherrypy._cpcompat import HTTPConnection USOCKET_PATH = os.path.join( - os.path.dirname(os.path.realpath(__file__)), + tempfile.gettempdir(), 'cp_test.sock' ) diff --git a/cherrypy/test/webtest.py b/cherrypy/test/webtest.py index 1fa3f969..fc3cab49 100644 --- a/cherrypy/test/webtest.py +++ b/cherrypy/test/webtest.py @@ -510,48 +510,11 @@ def openURL(url, headers=None, method="GET", body=None, conn._http_vsn_str = protocol conn._http_vsn = int("".join([x for x in protocol if x.isdigit()])) - # skip_accept_encoding argument added in python version 2.4 - if sys.version_info < (2, 4): - def putheader(self, header, value): - if header == 'Accept-Encoding' and value == 'identity': - return - self.__class__.putheader(self, header, value) - import new - conn.putheader = new.instancemethod( - putheader, conn, conn.__class__) - conn.putrequest(method.upper(), url, skip_host=True) - elif not py3k: - conn.putrequest(method.upper(), url, skip_host=True, - skip_accept_encoding=True) - else: - import http.client - # Replace the stdlib method, which only accepts ASCII url's - - def putrequest(self, method, url): - if ( - self._HTTPConnection__response and - self._HTTPConnection__response.isclosed() - ): - self._HTTPConnection__response = None - - if self._HTTPConnection__state == http.client._CS_IDLE: - self._HTTPConnection__state = ( - http.client._CS_REQ_STARTED) - else: - raise http.client.CannotSendRequest() - - self._method = method - if not url: - url = ntob('/') - request = ntob(' ').join( - (method.encode("ASCII"), - url, - self._http_vsn_str.encode("ASCII"))) - self._output(request) - import types - conn.putrequest = types.MethodType(putrequest, conn) - - conn.putrequest(method.upper(), url) + if py3k and isinstance(url, bytes): + url = url.decode() + + conn.putrequest(method.upper(), url, skip_host=True, + skip_accept_encoding=True) for key, value in headers: conn.putheader(key, value.encode("Latin-1")) |