@@ -6923,6 +6923,40 @@ async def test_update_handler_semaphore_acquisition_respects_timeout(
6923
6923
)
6924
6924
6925
6925
6926
+ @workflow .defn
6927
+ class TimeoutErrorWorkflow :
6928
+ @workflow .run
6929
+ async def run (self , scenario ) -> None :
6930
+ if scenario == "workflow.wait_condition" :
6931
+ await workflow .wait_condition (lambda : False , timeout = 0.01 )
6932
+ elif scenario == "asyncio.wait_for" :
6933
+ await asyncio .wait_for (asyncio .sleep (1000 ), timeout = 0.01 )
6934
+ elif scenario == "asyncio.timeout" :
6935
+ if sys .version_info >= (3 , 11 ):
6936
+ async with asyncio .timeout (0.1 ):
6937
+ await asyncio .sleep (1000 )
6938
+ else :
6939
+ raise RuntimeError ("Unrecognized scenario" )
6940
+
6941
+
6942
+ async def test_workflow_timeout_error (client : Client ):
6943
+ async with new_worker (client , TimeoutErrorWorkflow ) as worker :
6944
+ scenarios = ["workflow.wait_condition" , "asyncio.wait_for" ]
6945
+ if sys .version_info >= (3 , 11 ):
6946
+ scenarios .append ("asyncio.timeout" )
6947
+
6948
+ for scenario in scenarios :
6949
+ with pytest .raises (WorkflowFailureError ) as err :
6950
+ await client .execute_workflow (
6951
+ TimeoutErrorWorkflow .run ,
6952
+ scenario ,
6953
+ id = f"workflow-{ uuid .uuid4 ()} " ,
6954
+ task_queue = worker .task_queue ,
6955
+ )
6956
+ assert isinstance (err .value .cause , ApplicationError )
6957
+ assert err .value .cause .type == "TimeoutError"
6958
+
6959
+
6926
6960
def check_in_workflow () -> str :
6927
6961
return "in workflow" if workflow .in_workflow () else "not in workflow"
6928
6962
0 commit comments