Skip to content

Commit bdbd5e8

Browse files
bpo-37411: Rewrite test_wsgiref.testEnviron() (GH-14394)
Fix test_wsgiref.testEnviron() to no longer depend on the environment variables (don't fail if "X" variable is set). testEnviron() now overrides os.environ to get a deterministic environment. Test full TestHandler.environ content: not only a few selected variables. (cherry picked from commit 5150d32) Co-authored-by: Victor Stinner <[email protected]>
1 parent af7282e commit bdbd5e8

File tree

2 files changed

+56
-24
lines changed

2 files changed

+56
-24
lines changed

Lib/test/test_wsgiref.py

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -548,32 +548,62 @@ def handle_error(self):
548548

549549

550550
class HandlerTests(TestCase):
551-
552-
def checkEnvironAttrs(self, handler):
553-
env = handler.environ
554-
for attr in [
555-
'version','multithread','multiprocess','run_once','file_wrapper'
556-
]:
557-
if attr=='file_wrapper' and handler.wsgi_file_wrapper is None:
558-
continue
559-
self.assertEqual(getattr(handler,'wsgi_'+attr),env['wsgi.'+attr])
560-
561-
def checkOSEnviron(self,handler):
562-
empty = {}; setup_testing_defaults(empty)
563-
env = handler.environ
564-
from os import environ
565-
for k,v in environ.items():
566-
if k not in empty:
567-
self.assertEqual(env[k],v)
568-
for k,v in empty.items():
569-
self.assertIn(k, env)
551+
# testEnviron() can produce long error message
552+
maxDiff = 80 * 50
570553

571554
def testEnviron(self):
572-
h = TestHandler(X="Y")
573-
h.setup_environ()
574-
self.checkEnvironAttrs(h)
575-
self.checkOSEnviron(h)
576-
self.assertEqual(h.environ["X"],"Y")
555+
os_environ = {
556+
# very basic environment
557+
'HOME': '/my/home',
558+
'PATH': '/my/path',
559+
'LANG': 'fr_FR.UTF-8',
560+
561+
# set some WSGI variables
562+
'SCRIPT_NAME': 'test_script_name',
563+
'SERVER_NAME': 'test_server_name',
564+
}
565+
566+
with support.swap_attr(TestHandler, 'os_environ', os_environ):
567+
# override X and HOME variables
568+
handler = TestHandler(X="Y", HOME="/override/home")
569+
handler.setup_environ()
570+
571+
# Check that wsgi_xxx attributes are copied to wsgi.xxx variables
572+
# of handler.environ
573+
for attr in ('version', 'multithread', 'multiprocess', 'run_once',
574+
'file_wrapper'):
575+
self.assertEqual(getattr(handler, 'wsgi_' + attr),
576+
handler.environ['wsgi.' + attr])
577+
578+
# Test handler.environ as a dict
579+
expected = {}
580+
setup_testing_defaults(expected)
581+
# Handler inherits os_environ variables which are not overriden
582+
# by SimpleHandler.add_cgi_vars() (SimpleHandler.base_env)
583+
for key, value in os_environ.items():
584+
if key not in expected:
585+
expected[key] = value
586+
expected.update({
587+
# X doesn't exist in os_environ
588+
"X": "Y",
589+
# HOME is overriden by TestHandler
590+
'HOME': "/override/home",
591+
592+
# overriden by setup_testing_defaults()
593+
"SCRIPT_NAME": "",
594+
"SERVER_NAME": "127.0.0.1",
595+
596+
# set by BaseHandler.setup_environ()
597+
'wsgi.input': handler.get_stdin(),
598+
'wsgi.errors': handler.get_stderr(),
599+
'wsgi.version': (1, 0),
600+
'wsgi.run_once': False,
601+
'wsgi.url_scheme': 'http',
602+
'wsgi.multithread': True,
603+
'wsgi.multiprocess': True,
604+
'wsgi.file_wrapper': util.FileWrapper,
605+
})
606+
self.assertDictEqual(handler.environ, expected)
577607

578608
def testCGIEnviron(self):
579609
h = BaseCGIHandler(None,None,None,{})
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix test_wsgiref.testEnviron() to no longer depend on the environment
2+
variables (don't fail if "X" variable is set).

0 commit comments

Comments
 (0)