3030_IS_SYNC = False
3131
3232
33- def _make_executor (interval = 30.0 , min_interval = 0.01 , target = None , name = "test" ):
34- if target is None :
35-
36- async def target ():
37- return True
38-
39- return AsyncPeriodicExecutor (
40- interval = interval , min_interval = min_interval , target = target , name = name
41- )
33+ class TestAsyncPeriodicExecutor (AsyncUnitTest ):
34+ def _make_executor (self , interval = 30.0 , min_interval = 0.01 , target = None , name = "test" ):
35+ if target is None :
4236
37+ async def target ():
38+ return True
4339
44- class TestAsyncPeriodicExecutor (AsyncUnitTest ):
45- async def asyncSetUp (self ):
46- self .executor = None
40+ executor = AsyncPeriodicExecutor (
41+ interval = interval , min_interval = min_interval , target = target , name = name
42+ )
43+ self .addAsyncCleanup (self ._close_executor , executor )
44+ return executor
4745
48- async def asyncTearDown (self ):
49- if self .executor is not None :
50- self .executor .close ()
51- await self .executor .join (timeout = 2 )
46+ async def _close_executor (self , executor ):
47+ executor .close ()
48+ await executor .join (timeout = 2 )
5249
5350 async def test_join_without_open_is_safe (self ):
54- self . executor = _make_executor ()
51+ executor = self . _make_executor ()
5552 try :
56- await self . executor .join (timeout = 0.01 )
53+ await executor .join (timeout = 0.01 )
5754 except Exception as e :
5855 self .fail (f"join() raised unexpected Exception { e } " )
5956
@@ -67,9 +64,9 @@ async def target():
6764 ran .set ()
6865 return False
6966
70- self . executor = _make_executor (target = target )
71- self . executor .open ()
72- await self . executor .join (timeout = 2 )
67+ executor = self . _make_executor (target = target )
68+ executor .open ()
69+ await executor .join (timeout = 2 )
7370 self .assertTrue (ran .is_set (), "target never ran" )
7471
7572 async def test_target_exception_stops_executor (self ):
@@ -80,15 +77,15 @@ async def target():
8077 call_count += 1
8178 raise RuntimeError ("error" )
8279
83- self . executor = _make_executor (target = target )
80+ executor = self . _make_executor (target = target )
8481 # Suppress threading.excepthook so the intentional RuntimeError raised
8582 # in the worker thread is not surfaced by pytest's threadexception
8683 # plugin (no-op for the async executor since no thread is involved).
8784 orig_excepthook = threading .excepthook
8885 threading .excepthook = lambda _args : None
8986 try :
90- self . executor .open ()
91- await self . executor .join (timeout = 2 )
87+ executor .open ()
88+ await executor .join (timeout = 2 )
9289 finally :
9390 threading .excepthook = orig_excepthook
9491 self .assertEqual (call_count , 1 , "target should stop after exception" )
@@ -102,10 +99,10 @@ async def target():
10299 return False
103100 return True
104101
105- self . executor = _make_executor (interval = 30.0 , min_interval = 0.001 , target = target )
106- self . executor .skip_sleep ()
107- self . executor .open ()
108- await self . executor .join (timeout = 3 )
102+ executor = self . _make_executor (interval = 30.0 , min_interval = 0.001 , target = target )
103+ executor .skip_sleep ()
104+ executor .open ()
105+ await executor .join (timeout = 3 )
109106 self .assertGreaterEqual (len (call_times ), 2 )
110107 self .assertLess (call_times [1 ] - call_times [0 ], 5.0 )
111108
@@ -123,15 +120,15 @@ async def target():
123120 woken .set ()
124121 return call_count < 2
125122
126- self . executor = _make_executor (interval = 30.0 , min_interval = 0.01 , target = target )
127- self . executor .open ()
123+ executor = self . _make_executor (interval = 30.0 , min_interval = 0.01 , target = target )
124+ executor .open ()
128125 if _IS_SYNC :
129126 woken .wait (timeout = 2 )
130127 else :
131128 assert isinstance (woken , asyncio .Event )
132129 await asyncio .wait_for (woken .wait (), timeout = 2 )
133- self . executor .wake ()
134- await self . executor .join (timeout = 3 )
130+ executor .wake ()
131+ await executor .join (timeout = 3 )
135132 self .assertGreaterEqual (call_count , 2 )
136133
137134 async def test_open_after_target_returns_false (self ):
@@ -142,11 +139,11 @@ async def target():
142139 called += 1
143140 return False
144141
145- self . executor = _make_executor (target = target )
146- self . executor .open ()
147- await self . executor .join (timeout = 2 )
148- self . executor .open ()
149- await self . executor .join (timeout = 2 )
142+ executor = self . _make_executor (target = target )
143+ executor .open ()
144+ await executor .join (timeout = 2 )
145+ executor .open ()
146+ await executor .join (timeout = 2 )
150147 self .assertGreaterEqual (called , 2 )
151148
152149
0 commit comments