]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-128657: Run test_hashlib with `--parallel-threads` (GH-129833)
authorSam Gross <colesbury@gmail.com>
Sat, 8 Feb 2025 20:12:21 +0000 (15:12 -0500)
committerGitHub <noreply@github.com>
Sat, 8 Feb 2025 20:12:21 +0000 (12:12 -0800)
* gh-128657: Run test_hashlib with `--parallel-threads`

This catches the race in `py_digest_by_name` that is fixed separately
in gh-128886.

* Adjust assertion order

Lib/test/libregrtest/tsan.py
Lib/test/test_hashlib.py

index 90c9f0db0af2bf8d15db2e15546aa169aeaf0045..10b12cce1659315770ef642ec934a1928c29d9f0 100644 (file)
@@ -33,6 +33,7 @@ TSAN_TESTS = [
 # the regression test runner with the `--parallel-threads` option enabled.
 TSAN_PARALLEL_TESTS = [
     'test_abc',
+    'test_hashlib',
 ]
 
 
index 575b2cd0da70567a0a27d6fa354cd982242ef808..d1b04128bf6df3d4090844240e381ca5c2b51057 100644 (file)
@@ -13,13 +13,13 @@ import itertools
 import os
 import sys
 import sysconfig
+import tempfile
 import threading
 import unittest
 import warnings
 from test import support
 from test.support import _4G, bigmemtest
 from test.support.import_helper import import_fresh_module
-from test.support import os_helper
 from test.support import requires_resource
 from test.support import threading_helper
 from http.client import HTTPException
@@ -414,21 +414,18 @@ class HashLibTestCase(unittest.TestCase):
         digests = [name]
         digests.extend(self.constructors_to_test[name])
 
-        with open(os_helper.TESTFN, "wb") as f:
+        with tempfile.TemporaryFile() as f:
             f.write(data)
 
-        try:
             for digest in digests:
                 buf = io.BytesIO(data)
                 buf.seek(0)
                 self.assertEqual(
                     hashlib.file_digest(buf, digest).hexdigest(), hexdigest
                 )
-                with open(os_helper.TESTFN, "rb") as f:
-                    digestobj = hashlib.file_digest(f, digest)
+                f.seek(0)
+                digestobj = hashlib.file_digest(f, digest)
                 self.assertEqual(digestobj.hexdigest(), hexdigest)
-        finally:
-            os.unlink(os_helper.TESTFN)
 
     def check_no_unicode(self, algorithm_name):
         # Unicode objects are not allowed as input.
@@ -1172,29 +1169,29 @@ class KDFTests(unittest.TestCase):
     def test_file_digest(self):
         data = b'a' * 65536
         d1 = hashlib.sha256()
-        self.addCleanup(os.unlink, os_helper.TESTFN)
-        with open(os_helper.TESTFN, "wb") as f:
+        with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:
             for _ in range(10):
                 d1.update(data)
-                f.write(data)
+                fp.write(data)
+            fp.close()
 
-        with open(os_helper.TESTFN, "rb") as f:
-            d2 = hashlib.file_digest(f, hashlib.sha256)
+            with open(fp.name, "rb") as f:
+                d2 = hashlib.file_digest(f, hashlib.sha256)
 
-        self.assertEqual(d1.hexdigest(), d2.hexdigest())
-        self.assertEqual(d1.name, d2.name)
-        self.assertIs(type(d1), type(d2))
+            self.assertEqual(d1.hexdigest(), d2.hexdigest())
+            self.assertEqual(d1.name, d2.name)
+            self.assertIs(type(d1), type(d2))
 
-        with self.assertRaises(ValueError):
-            hashlib.file_digest(None, "sha256")
+            with self.assertRaises(ValueError):
+                with open(fp.name, "r") as f:
+                    hashlib.file_digest(f, "sha256")
 
-        with self.assertRaises(ValueError):
-            with open(os_helper.TESTFN, "r") as f:
-                hashlib.file_digest(f, "sha256")
+            with self.assertRaises(ValueError):
+                with open(fp.name, "wb") as f:
+                    hashlib.file_digest(f, "sha256")
 
         with self.assertRaises(ValueError):
-            with open(os_helper.TESTFN, "wb") as f:
-                hashlib.file_digest(f, "sha256")
+            hashlib.file_digest(None, "sha256")
 
 
 if __name__ == "__main__":