|
18 | 18 | import tempfile |
19 | 19 | import threading |
20 | 20 | import unittest |
| 21 | +from functools import partial |
| 22 | +from operator import attrgetter |
21 | 23 | from test import support |
22 | 24 | from test.support import _4G, bigmemtest |
23 | 25 | from test.support import hashlib_helper |
@@ -56,14 +58,12 @@ def get_fips_mode(): |
56 | 58 | import _blake2 |
57 | 59 | except ImportError: |
58 | 60 | _blake2 = None |
59 | | - |
60 | 61 | requires_blake2 = unittest.skipUnless(_blake2, 'requires _blake2') |
61 | 62 |
|
62 | 63 | try: |
63 | 64 | import _sha3 |
64 | 65 | except ImportError: |
65 | 66 | _sha3 = None |
66 | | - |
67 | 67 | requires_sha3 = unittest.skipUnless(_sha3, 'requires _sha3') |
68 | 68 |
|
69 | 69 |
|
@@ -1418,5 +1418,42 @@ def scrypt(password=b"password", /, **kwargs): |
1418 | 1418 | self.assertRaises(numeric_exc_types, scrypt, dklen=MAX_DKLEN + 1) |
1419 | 1419 |
|
1420 | 1420 |
|
| 1421 | +@threading_helper.requires_working_threading() |
| 1422 | +class TestTSAN(unittest.TestCase): |
| 1423 | + |
| 1424 | + @threading_helper.reap_threads |
| 1425 | + def check_attribute(self, write, read, expected, nthreads=8): |
| 1426 | + ready = threading.Event() |
| 1427 | + barrier = threading.Barrier(nthreads) |
| 1428 | + |
| 1429 | + def writer(): |
| 1430 | + barrier.wait() |
| 1431 | + while not ready.is_set(): |
| 1432 | + write() |
| 1433 | + |
| 1434 | + def reader(): |
| 1435 | + barrier.wait() |
| 1436 | + while not ready.is_set(): |
| 1437 | + self.assertEqual(read(), expected) |
| 1438 | + |
| 1439 | + targets = [writer if i % 2 else reader for i in range(nthreads)] |
| 1440 | + workers = [threading.Thread(target=target) for target in targets] |
| 1441 | + with threading_helper.start_threads(workers, unlock=ready.set): |
| 1442 | + pass |
| 1443 | + |
| 1444 | + def check_HACL_attribute(self, module, version, attrname): |
| 1445 | + blob = b"A" * 65536 |
| 1446 | + obj = getattr(module, version)() |
| 1447 | + update = partial(obj.update, blob) |
| 1448 | + read = attrgetter(attrname) |
| 1449 | + self.check_attribute(update, partial(read, obj), read(obj)) |
| 1450 | + |
| 1451 | + @requires_blake2 |
| 1452 | + @support.subTests("version", ["blake2s", "blake2b"]) |
| 1453 | + @support.subTests("attrname", ["block_size", "digest_size"]) |
| 1454 | + def test_HACL_blake2_attributes(self, version, attrname): |
| 1455 | + self.check_HACL_attribute(module, version, attrname) |
| 1456 | + |
| 1457 | + |
1421 | 1458 | if __name__ == "__main__": |
1422 | 1459 | unittest.main() |
0 commit comments