diff options
Diffstat (limited to 'Lib/test/test_itertools.py')
-rw-r--r-- | Lib/test/test_itertools.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 98b8c83731..eaa6197bec 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -11,6 +11,7 @@ import pickle from functools import reduce import sys import struct +import threading maxsize = support.MAX_Py_ssize_t minsize = -maxsize-1 @@ -1494,6 +1495,42 @@ class TestBasicOps(unittest.TestCase): del forward, backward raise + def test_tee_reenter(self): + class I: + first = True + def __iter__(self): + return self + def __next__(self): + first = self.first + self.first = False + if first: + return next(b) + + a, b = tee(I()) + with self.assertRaisesRegex(RuntimeError, "tee"): + next(a) + + def test_tee_concurrent(self): + start = threading.Event() + finish = threading.Event() + class I: + def __iter__(self): + return self + def __next__(self): + start.set() + finish.wait() + + a, b = tee(I()) + thread = threading.Thread(target=next, args=[a]) + thread.start() + try: + start.wait() + with self.assertRaisesRegex(RuntimeError, "tee"): + next(b) + finally: + finish.set() + thread.join() + def test_StopIteration(self): self.assertRaises(StopIteration, next, zip()) |