1+ import asyncio
12import itertools
23from datetime import timedelta
34
45import pytest
56
6- from python_utils import aio
7- from python_utils import time
7+ import python_utils
88
99
1010@pytest .mark .parametrize (
1111 'timeout,interval,interval_multiplier,maximum_interval,iterable,result' , [
12- (0.1 , 0.06 , 0.5 , 0.1 , aio .acount , 2 ),
13- (0.2 , 0.06 , 0.5 , 0.1 , aio .acount (), 4 ),
14- (0.3 , 0.06 , 1.0 , None , aio .acount , 5 ),
12+ (0.2 , 0.1 , 0.4 , 0.2 , python_utils .acount , 2 ),
13+ (0.3 , 0.1 , 0.4 , 0.2 , python_utils .acount (), 3 ),
14+ (0.3 , 0.06 , 1.0 , None , python_utils .acount , 5 ),
1515 (timedelta (seconds = 0.1 ), timedelta (seconds = 0.06 ),
16- 2.0 , timedelta (seconds = 0.1 ), aio .acount , 2 ),
16+ 2.0 , timedelta (seconds = 0.1 ), python_utils .acount , 2 ),
1717 ])
1818@pytest .mark .asyncio
1919async def test_aio_timeout_generator (timeout , interval , interval_multiplier ,
2020 maximum_interval , iterable , result ):
2121 i = None
22- async for i in time .aio_timeout_generator (
23- timeout , interval , iterable ,
24- maximum_interval = maximum_interval ):
22+ async for i in python_utils .aio_timeout_generator (
23+ timeout , interval , iterable ,
24+ maximum_interval = maximum_interval
25+ ):
2526 pass
2627
2728 assert i == result
@@ -41,13 +42,103 @@ async def test_aio_timeout_generator(timeout, interval, interval_multiplier,
4142def test_timeout_generator (timeout , interval , interval_multiplier ,
4243 maximum_interval , iterable , result ):
4344 i = None
44- for i in time .timeout_generator (
45- timeout = timeout ,
46- interval = interval ,
47- interval_multiplier = interval_multiplier ,
48- iterable = iterable ,
49- maximum_interval = maximum_interval ,
45+ for i in python_utils .timeout_generator (
46+ timeout = timeout ,
47+ interval = interval ,
48+ interval_multiplier = interval_multiplier ,
49+ iterable = iterable ,
50+ maximum_interval = maximum_interval ,
5051 ):
5152 pass
5253
5354 assert i == result
55+
56+
57+ @pytest .mark .asyncio
58+ async def test_aio_generator_timeout_detector ():
59+ async def generator ():
60+ for i in range (10 ):
61+ await asyncio .sleep (i / 100.0 )
62+ yield i
63+
64+ detector = python_utils .aio_generator_timeout_detector
65+ # Test regular timeout with reraise
66+ with pytest .raises (asyncio .TimeoutError ):
67+ async for i in detector (generator (), 0.05 ):
68+ pass
69+
70+ # Test regular timeout with clean exit
71+ async for i in detector (generator (), 0.05 , on_timeout = None ):
72+ pass
73+
74+ assert i == 4
75+
76+ # Test total timeout with reraise
77+ with pytest .raises (asyncio .TimeoutError ):
78+ async for i in detector (generator (), total_timeout = 0.1 ):
79+ pass
80+
81+ # Test total timeout with clean exit
82+ async for i in detector (generator (), total_timeout = 0.1 , on_timeout = None ):
83+ pass
84+
85+ assert i == 4
86+
87+ # Test stop iteration
88+ async for i in detector (generator (), on_timeout = None ):
89+ pass
90+
91+
92+ @pytest .mark .asyncio
93+ async def test_aio_generator_timeout_detector_decorator ():
94+ # Test regular timeout with reraise
95+ @python_utils .aio_generator_timeout_detector_decorator (timeout = 0.05 )
96+ async def generator ():
97+ for i in range (10 ):
98+ await asyncio .sleep (i / 100.0 )
99+ yield i
100+
101+ with pytest .raises (asyncio .TimeoutError ):
102+ async for i in generator ():
103+ pass
104+
105+ # Test regular timeout with clean exit
106+ @python_utils .aio_generator_timeout_detector_decorator (
107+ timeout = 0.05 ,
108+ on_timeout = None
109+ )
110+ async def generator ():
111+ for i in range (10 ):
112+ await asyncio .sleep (i / 100.0 )
113+ yield i
114+
115+ async for i in generator ():
116+ pass
117+
118+ assert i == 4
119+
120+ # Test total timeout with reraise
121+ @python_utils .aio_generator_timeout_detector_decorator (total_timeout = 0.1 )
122+ async def generator ():
123+ for i in range (10 ):
124+ await asyncio .sleep (i / 100.0 )
125+ yield i
126+
127+ with pytest .raises (asyncio .TimeoutError ):
128+ async for i in generator ():
129+ pass
130+
131+ # Test total timeout with clean exit
132+ @python_utils .aio_generator_timeout_detector_decorator (
133+ total_timeout = 0.1 ,
134+ on_timeout = None
135+ )
136+ async def generator ():
137+ for i in range (10 ):
138+ await asyncio .sleep (i / 100.0 )
139+ yield i
140+
141+ async for i in generator ():
142+ pass
143+
144+ assert i == 4
0 commit comments