Fixed #20238 -- Added threading support to LiveServerTestCase.

This commit is contained in:
Nadège Michel 2016-12-06 20:38:43 +01:00 committed by Tim Graham
parent c4e2fc5d98
commit bece837829
6 changed files with 44 additions and 3 deletions

View File

@ -77,6 +77,11 @@ class WSGIServer(simple_server.WSGIServer):
super().handle_error(request, client_address)
class ThreadedWSGIServer(socketserver.ThreadingMixIn, WSGIServer):
"""A threaded version of the WSGIServer"""
pass
class ServerHandler(simple_server.ServerHandler):
def handle_error(self):
# Ignore broken pipe errors, otherwise pass on

View File

@ -21,7 +21,7 @@ from django.core.handlers.wsgi import WSGIHandler, get_path_info
from django.core.management import call_command
from django.core.management.color import no_style
from django.core.management.sql import emit_post_migrate_signal
from django.core.servers.basehttp import WSGIRequestHandler, WSGIServer
from django.core.servers.basehttp import ThreadedWSGIServer, WSGIRequestHandler
from django.db import DEFAULT_DB_ALIAS, connection, connections, transaction
from django.forms.fields import CharField
from django.http import QueryDict
@ -1248,7 +1248,7 @@ class LiveServerThread(threading.Thread):
connections.close_all()
def _create_server(self, port):
return WSGIServer((self.host, port), QuietWSGIRequestHandler, allow_reuse_address=False)
return ThreadedWSGIServer((self.host, port), QuietWSGIRequestHandler, allow_reuse_address=False)
def terminate(self):
if hasattr(self, 'httpd'):

View File

@ -193,7 +193,7 @@ Templates
Tests
~~~~~
* ...
* Added threading support to :class:`~django.test.LiveServerTestCase`.
URLs
~~~~

View File

@ -130,3 +130,19 @@ class LiveServerPort(LiveServerBase):
finally:
if hasattr(TestCase, 'server_thread'):
TestCase.server_thread.terminate()
class LiverServerThreadedTests(LiveServerBase):
"""If LiverServerTestCase isn't threaded, these tests will hang."""
def test_view_calls_subview(self):
url = '/subview_calling_view/?%s' % urlencode({'url': self.live_server_url})
with self.urlopen(url) as f:
self.assertEqual(f.read(), b'subview calling view: subview')
def test_check_model_instance_from_subview(self):
url = '/check_model_instance_from_subview/?%s' % urlencode({
'url': self.live_server_url,
})
with self.urlopen(url) as f:
self.assertIn(b'emily', f.read())

View File

@ -7,4 +7,7 @@ urlpatterns = [
url(r'^model_view/$', views.model_view),
url(r'^create_model_instance/$', views.create_model_instance),
url(r'^environ_view/$', views.environ_view),
url(r'^subview_calling_view/$', views.subview_calling_view),
url(r'^subview/$', views.subview),
url(r'^check_model_instance_from_subview/$', views.check_model_instance_from_subview),
]

View File

@ -1,3 +1,5 @@
from urllib.request import urlopen
from django.http import HttpResponse
from .models import Person
@ -20,3 +22,18 @@ def create_model_instance(request):
def environ_view(request):
return HttpResponse("\n".join("%s: %r" % (k, v) for k, v in request.environ.items()))
def subview(request):
return HttpResponse('subview')
def subview_calling_view(request):
response = urlopen(request.GET['url'] + '/subview/')
return HttpResponse('subview calling view: {}'.format(response.read().decode()))
def check_model_instance_from_subview(request):
urlopen(request.GET['url'] + '/create_model_instance/')
response = urlopen(request.GET['url'] + '/model_view/')
return HttpResponse('subview calling view: {}'.format(response.read().decode()))