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():
conn.dec_thread_sharing()
cls._live_server_modified_settings.disable()
super().tearDownClass()
@classmethod
def tearDownClass(cls):
cls._tearDownClassInternal()
cls._live_server_modified_settings.disable()
super().tearDownClass()
class SerializeMixin:

View File

@ -9,6 +9,7 @@ from urllib.error import HTTPError
from urllib.parse import urlencode
from urllib.request import urlopen
from django.conf import settings
from django.core.servers.basehttp import WSGIServer
from django.test import LiveServerTestCase, override_settings
from django.test.testcases import LiveServerThread, QuietWSGIRequestHandler
@ -39,6 +40,42 @@ class LiveServerBase(LiveServerTestCase):
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):
@classmethod