Fixed #32437 -- Fixed cleaning up ALLOWED_HOSTS in LiveServerTestCase on setUpClass() failure.

This commit is contained in:
Chris Jerdonek 2021-02-11 05:43:36 -08:00 committed by Mariusz Felisiak
parent e412b28845
commit 694deff82f
2 changed files with 40 additions and 2 deletions

View File

@ -1573,11 +1573,12 @@ class LiveServerTestCase(TransactionTestCase):
for conn in cls.server_thread.connections_override.values(): for conn in cls.server_thread.connections_override.values():
conn.dec_thread_sharing() conn.dec_thread_sharing()
cls._live_server_modified_settings.disable()
super().tearDownClass()
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
cls._tearDownClassInternal() cls._tearDownClassInternal()
cls._live_server_modified_settings.disable()
super().tearDownClass()
class SerializeMixin: class SerializeMixin:

View File

@ -9,6 +9,7 @@ from urllib.error import HTTPError
from urllib.parse import urlencode from urllib.parse import urlencode
from urllib.request import urlopen from urllib.request import urlopen
from django.conf import settings
from django.core.servers.basehttp import WSGIServer from django.core.servers.basehttp import WSGIServer
from django.test import LiveServerTestCase, override_settings from django.test import LiveServerTestCase, override_settings
from django.test.testcases import LiveServerThread, QuietWSGIRequestHandler from django.test.testcases import LiveServerThread, QuietWSGIRequestHandler
@ -39,6 +40,42 @@ class LiveServerBase(LiveServerTestCase):
return urlopen(self.live_server_url + url) return urlopen(self.live_server_url + url)
class FailingLiveServerThread(LiveServerThread):
def _create_server(self):
raise RuntimeError('Error creating server.')
class LiveServerTestCaseSetupTest(LiveServerBase):
server_thread_class = FailingLiveServerThread
@classmethod
def check_allowed_hosts(cls, expected):
if settings.ALLOWED_HOSTS != expected:
raise RuntimeError(f'{settings.ALLOWED_HOSTS} != {expected}')
@classmethod
def setUpClass(cls):
cls.check_allowed_hosts(['testserver'])
try:
super().setUpClass()
except RuntimeError:
# LiveServerTestCase's change to ALLOWED_HOSTS should be reverted.
cls.check_allowed_hosts(['testserver'])
else:
raise RuntimeError('Server did not fail.')
cls.set_up_called = True
@classmethod
def tearDownClass(cls):
# Make tearDownClass() a no-op because setUpClass() was already cleaned
# up, and because the error inside setUpClass() was handled, which will
# cause tearDownClass() to be called when it normally wouldn't.
pass
def test_set_up_class(self):
self.assertIs(self.set_up_called, True)
class LiveServerAddress(LiveServerBase): class LiveServerAddress(LiveServerBase):
@classmethod @classmethod