diff --git a/Lib/test/test_msvcrt.py b/Lib/test/test_msvcrt.py index 1c6905bd1ee586..470139936b367b 100644 --- a/Lib/test/test_msvcrt.py +++ b/Lib/test/test_msvcrt.py @@ -2,9 +2,10 @@ import subprocess import sys import unittest +from contextlib import contextmanager from textwrap import dedent -from test.support import os_helper, requires_resource +from test.support import os_helper, requires_resource, Py_DEBUG from test.support.os_helper import TESTFN, TESTFN_ASCII if sys.platform != "win32": @@ -109,12 +110,108 @@ def test_putwch(self): class TestOther(unittest.TestCase): + # We can't suppress the msgbox with invalid input without debug build + @unittest.skipUnless(Py_DEBUG, "only available under debug build") + @contextmanager + def set_crt_dbg_report_to_stderr(self): + mode = msvcrt.CrtSetReportMode(msvcrt.CRT_ASSERT, msvcrt.CRTDBG_MODE_FILE) + file = msvcrt.CrtSetReportFile(msvcrt.CRT_ASSERT, msvcrt.CRTDBG_FILE_STDERR) + try: + yield + finally: + msvcrt.CrtSetReportMode(msvcrt.CRT_ASSERT, mode) + msvcrt.CrtSetReportFile(msvcrt.CRT_ASSERT, file) + def test_heap_min(self): try: msvcrt.heapmin() except OSError: pass + def test_GetErrorMode(self): + errmode = msvcrt.GetErrorMode() + self.assertIsInstance(errmode, int) + self.assertGreaterEqual(errmode, 0) + + def test_SetErrorMode(self): + origin = msvcrt.GetErrorMode() + def cleanup(): + msvcrt.SetErrorMode(0) + msvcrt.SetErrorMode(origin) + self.addCleanup(cleanup) + + msvcrt.SetErrorMode(0) + old = msvcrt.GetErrorMode() + + returned = msvcrt.SetErrorMode(msvcrt.SEM_NOOPENFILEERRORBOX) + self.assertEqual(returned, old) + self.assertTrue(msvcrt.GetErrorMode() & msvcrt.SEM_NOOPENFILEERRORBOX) + + msvcrt.SetErrorMode(-1) + msvcrt.SetErrorMode(2**32-1) # max unsigned int + msvcrt.SetErrorMode(-2**31) + + @unittest.skipUnless(Py_DEBUG, "only available under debug build") + def test_set_error_mode(self): + old = msvcrt.set_error_mode(msvcrt.REPORT_ERRMODE) + self.addCleanup(msvcrt.set_error_mode, old) + + returned = msvcrt.set_error_mode(msvcrt.OUT_TO_STDERR) + self.assertIs(type(returned), int) + self.assertNotEqual(returned, -1) + self.assertEqual(old, returned) + + returned = msvcrt.set_error_mode(msvcrt.REPORT_ERRMODE) + self.assertEqual(returned, msvcrt.OUT_TO_STDERR) + + with self.set_crt_dbg_report_to_stderr(): + self.assertEqual(msvcrt.set_error_mode(-1), -1) + self.assertEqual(msvcrt.set_error_mode(2**31-1), -1) + self.assertEqual(msvcrt.set_error_mode(-2**31), -1) + + @unittest.skipUnless(Py_DEBUG, "only available under debug build") + def test_CrtSetReportMode(self): + old = msvcrt.CrtSetReportMode(msvcrt.CRT_WARN, + msvcrt.CRTDBG_REPORT_MODE) + self.addCleanup(msvcrt.CrtSetReportMode, msvcrt.CRT_WARN, old) + + returned = msvcrt.CrtSetReportMode(msvcrt.CRT_WARN, + msvcrt.CRTDBG_MODE_DEBUG) + self.assertIs(type(returned), int) + self.assertNotEqual(returned, -1) + self.assertEqual(old, returned) + + returned = msvcrt.CrtSetReportMode(msvcrt.CRT_WARN, + msvcrt.CRTDBG_REPORT_MODE) + self.assertEqual(returned, msvcrt.CRTDBG_MODE_DEBUG) + + self.assertRaises(OSError, msvcrt.CrtSetReportMode, -1, -1) + self.assertRaises(OSError, msvcrt.CrtSetReportMode, 2**31-1, 2**31-1) + self.assertRaises(OSError, msvcrt.CrtSetReportMode, -2**31, -2**31) + + @unittest.skipUnless(Py_DEBUG, "only available under debug build") + def test_CrtSetReportFile(self): + # Set the report mode to CRTDBG_REPORT_FILE at first. + old_mode = msvcrt.CrtSetReportMode(msvcrt.CRT_WARN, + msvcrt.CRTDBG_REPORT_MODE) + self.addCleanup(msvcrt.CrtSetReportMode, msvcrt.CRT_WARN, old_mode) + old_file = msvcrt.CrtSetReportFile(msvcrt.CRT_WARN, + msvcrt.CRTDBG_REPORT_FILE) + self.addCleanup(msvcrt.CrtSetReportFile, msvcrt.CRT_WARN, old_file) + + returned = msvcrt.CrtSetReportFile(msvcrt.CRT_WARN, + msvcrt.CRTDBG_FILE_STDOUT) + self.assertIs(type(returned), int) + self.assertEqual(old_file, returned) + + returned = msvcrt.CrtSetReportFile(msvcrt.CRT_WARN, + msvcrt.CRTDBG_REPORT_FILE) + self.assertEqual(returned, msvcrt.get_osfhandle(sys.stdout.fileno())) + + msvcrt.CrtSetReportFile(-1, -1) + msvcrt.CrtSetReportFile(2**31-1, 2**31-1) + msvcrt.CrtSetReportFile(-2**31, -2**31) + if __name__ == "__main__": unittest.main() pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy