@@ -5187,9 +5187,9 @@ def __init__(self):
51875187 self .handler_finished = False
51885188
51895189 @workflow .run
5190- async def run (self , wait_for_handlers : bool ) -> bool :
5190+ async def run (self , wait_all_handlers_finished : bool ) -> bool :
51915191 await workflow .wait_condition (lambda : self .started_handler )
5192- if wait_for_handlers :
5192+ if wait_all_handlers_finished :
51935193 self .handler_may_return = True
51945194 await workflow .wait_condition (workflow .all_handlers_finished )
51955195 return self .handler_finished
@@ -5228,14 +5228,18 @@ async def my_signal_WARN_AND_ABANDON(self):
52285228 await self ._do_update_or_signal ()
52295229
52305230
5231- async def test_unfinished_update_handlers (client : Client ):
5231+ async def test_unfinished_update_handler (client : Client ):
52325232 async with new_worker (client , UnfinishedHandlersWorkflow ) as worker :
5233- await _UnfinishedHandlersTest (client , worker , "update" ).run_test ()
5233+ test = _UnfinishedHandlersTest (client , worker , "update" )
5234+ await test .test_wait_all_handlers_finished_and_unfinished_handlers_warning ()
5235+ await test .test_unfinished_handlers_cause_exceptions_in_test_suite ()
52345236
52355237
5236- async def test_unfinished_signal_handlers (client : Client ):
5238+ async def test_unfinished_signal_handler (client : Client ):
52375239 async with new_worker (client , UnfinishedHandlersWorkflow ) as worker :
5238- await _UnfinishedHandlersTest (client , worker , "signal" ).run_test ()
5240+ test = _UnfinishedHandlersTest (client , worker , "signal" )
5241+ await test .test_wait_all_handlers_finished_and_unfinished_handlers_warning ()
5242+ await test .test_unfinished_handlers_cause_exceptions_in_test_suite ()
52395243
52405244
52415245@dataclass
@@ -5244,41 +5248,44 @@ class _UnfinishedHandlersTest:
52445248 worker : Worker
52455249 handler_type : Literal ["update" , "signal" ]
52465250
5247- async def run_test (self ):
5248- # If we don't capture warnings then -- since the unfinished handler warning is converted to
5249- # an exception in the test suite -- we see WFT failures when we don't wait for handlers.
5250- handle : asyncio .Future [WorkflowHandle ] = asyncio .Future ()
5251- asyncio .create_task (
5252- self .get_workflow_result (wait_for_handlers = False , handle_future = handle )
5253- )
5254- await assert_eq_eventually (
5255- True , partial (self .workflow_task_failed , workflow_id = (await handle ).id )
5256- )
5257-
5251+ async def test_wait_all_handlers_finished_and_unfinished_handlers_warning (self ):
52585252 # The unfinished handler warning is issued by default,
5259- handler_finished , warning = await self .get_workflow_result_and_warning (
5260- wait_for_handlers = False ,
5253+ handler_finished , warning = await self ._get_workflow_result_and_warning (
5254+ wait_all_handlers_finished = False ,
52615255 )
52625256 assert not handler_finished and warning
52635257 # and when the workflow sets the unfinished_policy to WARN_AND_ABANDON,
5264- handler_finished , warning = await self .get_workflow_result_and_warning (
5265- wait_for_handlers = False ,
5258+ handler_finished , warning = await self ._get_workflow_result_and_warning (
5259+ wait_all_handlers_finished = False ,
52665260 unfinished_policy = workflow .HandlerUnfinishedPolicy .WARN_AND_ABANDON ,
52675261 )
52685262 assert not handler_finished and warning
52695263 # but not when the workflow waits for handlers to complete,
5270- handler_finished , warning = await self .get_workflow_result_and_warning (
5271- wait_for_handlers = True ,
5264+ handler_finished , warning = await self ._get_workflow_result_and_warning (
5265+ wait_all_handlers_finished = True ,
52725266 )
52735267 assert handler_finished and not warning
52745268 # nor when the silence-warnings policy is set on the handler.
5275- handler_finished , warning = await self .get_workflow_result_and_warning (
5276- wait_for_handlers = False ,
5269+ handler_finished , warning = await self ._get_workflow_result_and_warning (
5270+ wait_all_handlers_finished = False ,
52775271 unfinished_policy = workflow .HandlerUnfinishedPolicy .ABANDON ,
52785272 )
52795273 assert not handler_finished and not warning
52805274
5281- async def workflow_task_failed (self , workflow_id : str ) -> bool :
5275+ async def test_unfinished_handlers_cause_exceptions_in_test_suite (self ):
5276+ # If we don't capture warnings then -- since the unfinished handler warning is converted to
5277+ # an exception in the test suite -- we see WFT failures when we don't wait for handlers.
5278+ handle : asyncio .Future [WorkflowHandle ] = asyncio .Future ()
5279+ asyncio .create_task (
5280+ self ._get_workflow_result (
5281+ wait_all_handlers_finished = False , handle_future = handle
5282+ )
5283+ )
5284+ await assert_eq_eventually (
5285+ True , partial (self ._workflow_task_failed , workflow_id = (await handle ).id )
5286+ )
5287+
5288+ async def _workflow_task_failed (self , workflow_id : str ) -> bool :
52825289 resp = await self .client .workflow_service .get_workflow_execution_history (
52835290 GetWorkflowExecutionHistoryRequest (
52845291 namespace = self .client .namespace ,
@@ -5293,30 +5300,30 @@ async def workflow_task_failed(self, workflow_id: str) -> bool:
52935300 return True
52945301 return False
52955302
5296- async def get_workflow_result_and_warning (
5303+ async def _get_workflow_result_and_warning (
52975304 self ,
5298- wait_for_handlers : bool ,
5305+ wait_all_handlers_finished : bool ,
52995306 unfinished_policy : Optional [workflow .HandlerUnfinishedPolicy ] = None ,
53005307 ) -> Tuple [bool , bool ]:
53015308 with pytest .WarningsRecorder () as warnings :
5302- wf_result = await self .get_workflow_result (
5303- wait_for_handlers , unfinished_policy
5309+ wf_result = await self ._get_workflow_result (
5310+ wait_all_handlers_finished , unfinished_policy
53045311 )
53055312 unfinished_handler_warning_emitted = any (
5306- issubclass (w .category , self .unfinished_handler_warning_cls )
5313+ issubclass (w .category , self ._unfinished_handler_warning_cls )
53075314 for w in warnings
53085315 )
53095316 return wf_result , unfinished_handler_warning_emitted
53105317
5311- async def get_workflow_result (
5318+ async def _get_workflow_result (
53125319 self ,
5313- wait_for_handlers : bool ,
5320+ wait_all_handlers_finished : bool ,
53145321 unfinished_policy : Optional [workflow .HandlerUnfinishedPolicy ] = None ,
53155322 handle_future : Optional [asyncio .Future [WorkflowHandle ]] = None ,
53165323 ) -> bool :
53175324 handle = await self .client .start_workflow (
53185325 UnfinishedHandlersWorkflow .run ,
5319- arg = wait_for_handlers ,
5326+ arg = wait_all_handlers_finished ,
53205327 id = f"wf-{ uuid .uuid4 ()} " ,
53215328 task_queue = self .worker .task_queue ,
53225329 )
@@ -5328,7 +5335,7 @@ async def get_workflow_result(
53285335 if self .handler_type == "signal" :
53295336 await asyncio .gather (handle .signal (handler_name ))
53305337 else :
5331- if not wait_for_handlers :
5338+ if not wait_all_handlers_finished :
53325339 with pytest .raises (RPCError ) as err :
53335340 await asyncio .gather (
53345341 handle .execute_update (handler_name , id = "my-update" )
@@ -5345,7 +5352,7 @@ async def get_workflow_result(
53455352 return await handle .result ()
53465353
53475354 @property
5348- def unfinished_handler_warning_cls (self ) -> Type :
5355+ def _unfinished_handler_warning_cls (self ) -> Type :
53495356 return {
53505357 "update" : workflow .UnfinishedUpdateHandlersWarning ,
53515358 "signal" : workflow .UnfinishedSignalHandlersWarning ,
0 commit comments