Skip to content

Commit dfa9499

Browse files
[2.7] bpo-37411: Rewrite test_wsgiref.testEnviron() (GH-14394) (GH-14404)
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 49032fa commit dfa9499

File tree

2 files changed

+58
-26
lines changed

2 files changed

+58
-26
lines changed

Lib/test/test_wsgiref.py

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import re
1414
import sys
1515

16-
from test import test_support
16+
from test import support
1717

1818
class MockServer(WSGIServer):
1919
"""Non-socket HTTP server"""
@@ -377,32 +377,62 @@ def handle_error(self):
377377

378378

379379
class HandlerTests(TestCase):
380-
381-
def checkEnvironAttrs(self, handler):
382-
env = handler.environ
383-
for attr in [
384-
'version','multithread','multiprocess','run_once','file_wrapper'
385-
]:
386-
if attr=='file_wrapper' and handler.wsgi_file_wrapper is None:
387-
continue
388-
self.assertEqual(getattr(handler,'wsgi_'+attr),env['wsgi.'+attr])
389-
390-
def checkOSEnviron(self,handler):
391-
empty = {}; setup_testing_defaults(empty)
392-
env = handler.environ
393-
from os import environ
394-
for k,v in environ.items():
395-
if k not in empty:
396-
self.assertEqual(env[k],v)
397-
for k,v in empty.items():
398-
self.assertIn(k, env)
380+
# testEnviron() can produce long error message
381+
maxDiff = 80 * 50
399382

400383
def testEnviron(self):
401-
h = TestHandler(X="Y")
402-
h.setup_environ()
403-
self.checkEnvironAttrs(h)
404-
self.checkOSEnviron(h)
405-
self.assertEqual(h.environ["X"],"Y")
384+
os_environ = {
385+
# very basic environment
386+
'HOME': '/my/home',
387+
'PATH': '/my/path',
388+
'LANG': 'fr_FR.UTF-8',
389+
390+
# set some WSGI variables
391+
'SCRIPT_NAME': 'test_script_name',
392+
'SERVER_NAME': 'test_server_name',
393+
}
394+
395+
with support.swap_attr(TestHandler, 'os_environ', os_environ):
396+
# override X and HOME variables
397+
handler = TestHandler(X="Y", HOME="/override/home")
398+
handler.setup_environ()
399+
400+
# Check that wsgi_xxx attributes are copied to wsgi.xxx variables
401+
# of handler.environ
402+
for attr in ('version', 'multithread', 'multiprocess', 'run_once',
403+
'file_wrapper'):
404+
self.assertEqual(getattr(handler, 'wsgi_' + attr),
405+
handler.environ['wsgi.' + attr])
406+
407+
# Test handler.environ as a dict
408+
expected = {}
409+
setup_testing_defaults(expected)
410+
# Handler inherits os_environ variables which are not overriden
411+
# by SimpleHandler.add_cgi_vars() (SimpleHandler.base_env)
412+
for key, value in os_environ.items():
413+
if key not in expected:
414+
expected[key] = value
415+
expected.update({
416+
# X doesn't exist in os_environ
417+
"X": "Y",
418+
# HOME is overriden by TestHandler
419+
'HOME': "/override/home",
420+
421+
# overriden by setup_testing_defaults()
422+
"SCRIPT_NAME": "",
423+
"SERVER_NAME": "127.0.0.1",
424+
425+
# set by BaseHandler.setup_environ()
426+
'wsgi.input': handler.get_stdin(),
427+
'wsgi.errors': handler.get_stderr(),
428+
'wsgi.version': (1, 0),
429+
'wsgi.run_once': False,
430+
'wsgi.url_scheme': 'http',
431+
'wsgi.multithread': True,
432+
'wsgi.multiprocess': True,
433+
'wsgi.file_wrapper': util.FileWrapper,
434+
})
435+
self.assertDictEqual(handler.environ, expected)
406436

407437
def testCGIEnviron(self):
408438
h = BaseCGIHandler(None,None,None,{})
@@ -565,7 +595,7 @@ def close(self):
565595

566596

567597
def test_main():
568-
test_support.run_unittest(__name__)
598+
support.run_unittest(__name__)
569599

570600
if __name__ == "__main__":
571601
test_main()
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)