| import errno | |
| import os | |
| import sysconfig | |
| import unittest | |
| from test.support import threading_helper | |
| from test.support.threading_helper import run_concurrently | |
| NTHREADS = 10 | |
| @threading_helper.requires_working_threading() | |
| class TestOs(unittest.TestCase): | |
| @unittest.skipUnless(sysconfig.get_config_var('_Py_HAVE_STRERROR_R'), | |
| 'need _Py_HAVE_STRERROR_R macro') | |
| def test_strerror(self): | |
| # gh-158893: os.strerror() is implemented with strerror_r() which is | |
| # thread safe. Well, check if it's actually the case. | |
| last_error = max([getattr(errno, name) for name in dir(errno) | |
| if name.startswith('E')]) | |
| test_errors = tuple(range(1, last_error + 1)) | |
| loops = 20 | |
| def worker(): | |
| for _ in range(loops): | |
| for i in test_errors: | |
| os.strerror(i) | |
| run_concurrently( | |
| worker_func=worker, nthreads=NTHREADS | |
| ) | |
| if __name__ == "__main__": | |
| unittest.main() |