Skip to content

Commit 814c7ae

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 7675bca commit 814c7ae

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
@@ -540,32 +540,62 @@ def handle_error(self):
540540

541541

542542
class HandlerTests(TestCase):
543-
544-
def checkEnvironAttrs(self, handler):
545-
env = handler.environ
546-
for attr in [
547-
'version','multithread','multiprocess','run_once','file_wrapper'
548-
]:
549-
if attr=='file_wrapper' and handler.wsgi_file_wrapper is None:
550-
continue
551-
self.assertEqual(getattr(handler,'wsgi_'+attr),env['wsgi.'+attr])
552-
553-
def checkOSEnviron(self,handler):
554-
empty = {}; setup_testing_defaults(empty)
555-
env = handler.environ
556-
from os import environ
557-
for k,v in environ.items():
558-
if k not in empty:
559-
self.assertEqual(env[k],v)
560-
for k,v in empty.items():
561-
self.assertIn(k, env)
543+
# testEnviron() can produce long error message
544+
maxDiff = 80 * 50
562545

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

570600
def testCGIEnviron(self):
571601
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)