-
Notifications
You must be signed in to change notification settings - Fork 126
Description
What are you really trying to do?
I am trying to use the pdb debugger from inside unit tests literally with the breakpoint()
function.
Describe the bug
It is pretty straightforward really, change the workflow to use sandboxing and set a breakpoint()
. When you do you get an endless scroll with
temporalio.worker.workflow_sandbox._restrictions.RestrictedWorkflowAccessError: Cannot access __builtins__.breakpoint from inside a workflow. If this is code from a module not used in a workflow or known to only be used deterministically from a workflow, mark the import as pass through.
08:48:32 [ WARNING] Failed activation on workflow GreetingWorkflow with ID 68cd5a5e-2ada-40ff-aa67-63eae9ab3055 and run ID 01994355-86ca-7dd3-9335-69a9e5be86ff (_workflow_instance.py:452)
Traceback (most recent call last):
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/worker/_workflow_instance.py", line 412, in activate
self._run_once(check_conditions=index == 1 or index == 2)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/worker/_workflow_instance.py", line 2130, in _run_once
raise self._current_activation_error
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/worker/_workflow_instance.py", line 2148, in _run_top_level_workflow_function
await coro
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/worker/_workflow_instance.py", line 974, in run_workflow
result = await self._inbound.execute_workflow(input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/testing/_workflow.py", line 518, in execute_workflow
return await super().execute_workflow(input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/worker/_interceptor.py", line 385, in execute_workflow
return await self.next.execute_workflow(input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/worker/_workflow_instance.py", line 2529, in execute_workflow
return await input.run_fn(*args)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/georgemauer/code/temporal-samples/hello/hello_activity.py", line 32, in run
breakpoint()
~~~~~~~~~~^^
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/worker/workflow_sandbox/_importer.py", line 497, in __call__
return self.current(*args, **kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/Users/georgemauer/code/temporal-samples/.venv/lib/python3.13/site-packages/temporalio/worker/workflow_sandbox/_importer.py", line 94, in restrict_built_in
raise RestrictedWorkflowAccessError(f"__builtins__.{name}")
Minimal Reproduction
I have recreated this in temporal samples here
Environment/Versions
- Apple M4 Pro
- Temporal Version: 1.15.0
- Literally just running the samples
Additional context
I am debugging as part of trying to figure out why passing RetryPolicy(max_attempts=1)
on client.execute_workflow
in my unit tests doesn't seem to turn off retries of activities.
What I ultimately want is to be able to tell my unit tests to only retry once or twice - essentially to set a retry policy specifically for my tests. The documentation implies that doing this by passing retry_policy=RetryPolicy(max_attempts=2)
to client.execute_workflow()
should work yet it doesn't for me. The only way to get it working is by passing a retry policy to workflow.execute_activity()
but that would mean changing my code specifically for simple automation tests which I want to avoid.
So I started trying to inspect the code. Because there are base classes involved I want to inspect things at run time, however setting a breakpoint in my workflow fails. According to the documentation, debug_mode=True
should make it possible to use breakpoints but that seems to only be the case when you don't have sandbox=True
on your workflows which means I'd have to modify my code specifically for testing.