From 814bc920ca093959436891c28c9523ee5382f404 Mon Sep 17 00:00:00 2001 From: MannarAmuthan Date: Sat, 25 Nov 2023 20:15:38 +0530 Subject: [PATCH 1/3] Tests for wsgiref to increase coverage --- Lib/test/test_wsgiref.py | 108 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 9316d0ecbcf1ae..2759427555242e 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -66,6 +66,26 @@ def header_app(environ, start_response): ]).encode('iso-8859-1')] +def input_app(func_name, *args): + def app(e,s): + req = getattr(e['wsgi.input'], func_name)(*args) + s("200 OK", [("Content-Type", "text/plain; charset=utf-8")]) + if type(req) is list: + resp = b";".join(req) + else: + resp = req + return [resp] + return app + + +def errors_app(func_name, *args): + def app(e,s): + getattr(e['wsgi.errors'], func_name)(*args) + s("200 OK", [("Content-Type", "text/plain; charset=utf-8")]) + return [b"data"] + return app + + def run_amock(app=hello_app, data=b"GET / HTTP/1.0\n\n"): server = make_server("", 80, app, MockServer, MockHandler) inp = BufferedReader(BytesIO(data)) @@ -191,6 +211,94 @@ def bad_app(e,s): self.assertEqual( err.splitlines()[-2], "AssertionError" ) + + def test_wsgi_input_read(self): + bad_app = input_app("read") + good_app = input_app("read", 5) + + out, err = run_amock(validator(bad_app)) + self.assertTrue(out.endswith( + b"A server error occurred. Please contact the administrator." + )) + + self.assertEqual( + err.splitlines()[-2], "AssertionError" + ) + + out, err = run_amock(validator(good_app), b"GET / HTTP/1.0\n\nTest 1\nTest 2\n") + self.assertTrue(out.endswith(b"Test ")) + + def test_wsgi_input_readlines(self): + bad_app = input_app("readlines", 3, 5) + good_app = input_app("readlines", 1) + + out, err = run_amock(validator(bad_app)) + self.assertTrue(out.endswith( + b"A server error occurred. Please contact the administrator." + )) + self.assertEqual( + err.splitlines()[-2], "AssertionError" + ) + out, err = run_amock(validator(good_app), b"GET / HTTP/1.0\n\nTest Line 1\nTest Line 2\n") + self.assertTrue(out.endswith(b"Test Line 1\n")) + + def test_wsgi_input_readline(self): + bad_app = input_app("readline", 3, 4) + good_app = input_app("readline", 2) + + out, err = run_amock(validator(bad_app)) + self.assertTrue(out.endswith( + b"A server error occurred. Please contact the administrator." + )) + self.assertEqual( + err.splitlines()[-2], "AssertionError" + ) + + out, err = run_amock(validator(good_app), b"GET / HTTP/1.0\n\nTest 1\nTest 2\n") + self.assertTrue(out.endswith(b"Te")) + + def test_wsgi_input_close(self): + app = input_app("close") + out, err = run_amock(validator(app), b"GET / HTTP/1.0\n\nTest 1\nTest 2\n") + self.assertEqual(err.splitlines()[-2], 'AssertionError: input.close() must not be called') + self.assertTrue(out.endswith(b"A server error occurred. Please contact the administrator.")) + + def test_wsgi_input_iter(self): + def app(e,s): + req = [] + for line in e['wsgi.input']: + req.append(line) + s("200 OK", [('Content-Type', 'text/plain; charser=utf-8')]) + return [b';'.join(req)] + + out, err = run_amock(validator(app), b"GET / HTTP/1.0\n\nTest 1\nTest 2\n") + self.assertTrue(out.endswith(b"Test 1\n;Test 2\n")) + + def test_wsgi_errors_write(self): + bad_app = errors_app("write", b"Test") + good_app = errors_app("write", "Test") + + out, err = run_amock(validator(bad_app), b"GET / HTTP/1.0\n\n") + self.assertEqual(err.splitlines()[-2], 'AssertionError') + + out, err = run_amock(validator(good_app), b"GET / HTTP/1.0\n\n") + self.assertTrue(err.startswith("Test")) + + def test_wsgi_errors_writelines(self): + bad_app = errors_app("writelines", [1, "Test"]) + good_app = errors_app("writelines", ["Test", "Test"]) + + out, err = run_amock(validator(bad_app), b"GET / HTTP/1.0\n\n") + self.assertEqual(err.splitlines()[-2], 'AssertionError') + + out, err = run_amock(validator(good_app), b"GET / HTTP/1.0\n\n") + self.assertTrue(err.startswith("TestTest")) + + def test_wsgi_errors_close(self): + app = errors_app("close") + + out, err = run_amock(validator(app), b"GET / HTTP/1.0\n\n") + self.assertTrue(err.splitlines()[-2], 'AssertionError: errors.close() must not be called') def test_bytes_validation(self): def app(e, s): From 267caa3554069141196b3931872c544b500cea09 Mon Sep 17 00:00:00 2001 From: MannarAmuthan Date: Sat, 25 Nov 2023 20:35:15 +0530 Subject: [PATCH 2/3] Fixed trailing whitespace --- Lib/test/test_wsgiref.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 2759427555242e..13ee6b6cc7f5a8 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -211,7 +211,7 @@ def bad_app(e,s): self.assertEqual( err.splitlines()[-2], "AssertionError" ) - + def test_wsgi_input_read(self): bad_app = input_app("read") good_app = input_app("read", 5) @@ -227,7 +227,7 @@ def test_wsgi_input_read(self): out, err = run_amock(validator(good_app), b"GET / HTTP/1.0\n\nTest 1\nTest 2\n") self.assertTrue(out.endswith(b"Test ")) - + def test_wsgi_input_readlines(self): bad_app = input_app("readlines", 3, 5) good_app = input_app("readlines", 1) @@ -241,12 +241,12 @@ def test_wsgi_input_readlines(self): ) out, err = run_amock(validator(good_app), b"GET / HTTP/1.0\n\nTest Line 1\nTest Line 2\n") self.assertTrue(out.endswith(b"Test Line 1\n")) - + def test_wsgi_input_readline(self): bad_app = input_app("readline", 3, 4) good_app = input_app("readline", 2) - out, err = run_amock(validator(bad_app)) + out, err = run_amock(validator(bad_app)) self.assertTrue(out.endswith( b"A server error occurred. Please contact the administrator." )) @@ -274,7 +274,7 @@ def app(e,s): out, err = run_amock(validator(app), b"GET / HTTP/1.0\n\nTest 1\nTest 2\n") self.assertTrue(out.endswith(b"Test 1\n;Test 2\n")) - def test_wsgi_errors_write(self): + def test_wsgi_errors_write(self): bad_app = errors_app("write", b"Test") good_app = errors_app("write", "Test") From 70abaef7b0e35669409233dd51a822c61cdeb340 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 11 Aug 2026 22:25:21 +0300 Subject: [PATCH 3/3] Fix an assertion which was always true assertTrue() was used with the expected value as the message. --- Lib/test/test_wsgiref.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 24ee5b5bf6b3e1..484a2db1637861 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -298,7 +298,8 @@ def test_wsgi_errors_close(self): app = errors_app("close") out, err = run_amock(validator(app), b"GET / HTTP/1.0\n\n") - self.assertTrue(err.splitlines()[-2], 'AssertionError: errors.close() must not be called') + self.assertEqual(err.splitlines()[-2], + 'AssertionError: errors.close() must not be called') @force_not_colorized def test_bytes_validation(self):