diff --git a/src/twisted/internet/test/test_asyncioreactor.py b/src/twisted/internet/test/test_asyncioreactor.py index 2f7bad930d6..bbbb8c834ca 100644 --- a/src/twisted/internet/test/test_asyncioreactor.py +++ b/src/twisted/internet/test/test_asyncioreactor.py @@ -12,8 +12,8 @@ DefaultEventLoopPolicy, Future, SelectorEventLoop, - get_event_loop, get_event_loop_policy, + get_running_loop, set_event_loop, set_event_loop_policy, ) @@ -74,14 +74,26 @@ def newLoop(self, policy: AbstractEventLoopPolicy) -> AbstractEventLoop: Make a new asyncio loop from a policy for use with a reactor, and add appropriate cleanup to restore any global state. """ - existingLoop = get_event_loop() + try: + existingLoop = get_running_loop() + except RuntimeError: # pragma: no branch + # For most runs, we should not have any existing loop, + # since the tests should leave a clean reactor. + # For some cases, like GTK tests, + # there might be a running reactor. + # To revert the state found at the start of the test + # we keep a reference and restore it later. + existingLoop = None existingPolicy = get_event_loop_policy() result = policy.new_event_loop() @self.addCleanup def cleanUp(): result.close() - set_event_loop(existingLoop) + if existingLoop is not None: # pragma: no cover + # Revert the loop found at the start of the test. + # See https://github.com/twisted/twisted/pull/11706 + set_event_loop(existingLoop) set_event_loop_policy(existingPolicy) return result