Skip to content

Commit ea72f85

Browse files
committed
Throw exception in init_qt5_reactor() if other reactor already installed
1 parent ee817b8 commit ea72f85

File tree

2 files changed

+74
-7
lines changed

2 files changed

+74
-7
lines changed

pytest_twisted.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import sys
2-
31
import decorator
42
import greenlet
53
import pytest
@@ -9,6 +7,10 @@
97
from twisted.python import failure
108

119

10+
class WrongReactorAlreadyInstalledError(Exception):
11+
pass
12+
13+
1214
class _instances:
1315
gr_twisted = None
1416
reactor = None
@@ -126,11 +128,14 @@ def init_qt5_reactor(qapp):
126128
try:
127129
qt5reactor.install()
128130
except error.ReactorAlreadyInstalledError:
129-
if not isinstance(_instances.reactor, qt5reactor.QtReactor):
130-
stop_twisted_greenlet()
131-
_instances.gr_twisted = None
132-
del sys.modules['twisted.internet.reactor']
133-
qt5reactor.install()
131+
import twisted.internet.reactor
132+
if not isinstance(twisted.internet.reactor, qt5reactor.QtReactor):
133+
raise WrongReactorAlreadyInstalledError(
134+
'expected {0} but found {1}'.format(
135+
qt5reactor.QtReactor,
136+
type(twisted.internet.reactor),
137+
)
138+
)
134139
init_reactor()
135140

136141

testing/test_basic.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@
22

33
import sys
44

5+
import pytest
6+
7+
8+
def skip_if_reactor_not(expected_reactor):
9+
actual_reactor = pytest.config.getoption('reactor')
10+
return pytest.mark.skipif(
11+
actual_reactor != expected_reactor,
12+
reason='reactor is {0} not {1}'.format(
13+
actual_reactor,
14+
expected_reactor,
15+
),
16+
)
17+
518

619
def test_fail_later(testdir):
720
testdir.makepyfile("""
@@ -106,6 +119,7 @@ def test_MAIN():
106119
assert outcomes.get("passed") == 1
107120

108121

122+
@skip_if_reactor_not('default')
109123
def test_blockon_in_hook(testdir):
110124
testdir.makeconftest("""
111125
import pytest_twisted as pt
@@ -130,6 +144,54 @@ def test_succeed():
130144
assert outcomes.get("passed") == 1
131145

132146

147+
@skip_if_reactor_not('qt5reactor')
148+
def test_blockon_in_hook_with_qt5reactor(testdir):
149+
testdir.makeconftest("""
150+
import pytest_twisted as pt
151+
import pytestqt
152+
from twisted.internet import defer
153+
154+
155+
def pytest_configure(config):
156+
qapp = pytestqt.plugin.qapp(pytestqt.plugin.qapp_args())
157+
158+
pt.init_qt5_reactor(qapp)
159+
d = defer.Deferred()
160+
161+
from twisted.internet import reactor
162+
reactor.callLater(0.01, d.callback, 1)
163+
pt.blockon(d)
164+
""")
165+
testdir.makepyfile("""
166+
from twisted.internet import reactor, defer
167+
168+
def test_succeed():
169+
d = defer.Deferred()
170+
reactor.callLater(0.01, d.callback, 1)
171+
return d
172+
""")
173+
rr = testdir.run(sys.executable, "-m", "pytest", "-v")
174+
outcomes = rr.parseoutcomes()
175+
assert outcomes.get("passed") == 1
176+
177+
178+
@skip_if_reactor_not('qt5reactor')
179+
def test_wrong_reactor_with_qt5reactor(testdir):
180+
testdir.makepyfile("""
181+
import twisted.internet.default
182+
twisted.internet.default.install()
183+
184+
def test_succeed():
185+
pass
186+
""")
187+
rr = testdir.run(
188+
sys.executable, "-m", "pytest", "-v", "--reactor=qt5reactor"
189+
)
190+
outcomes = rr.parseoutcomes()
191+
assert 'WrongReactorAlreadyInstalledError' in rr.stdout.str()
192+
assert outcomes.get("error") == 1
193+
194+
133195
def test_pytest_from_reactor_thread(testdir):
134196
testdir.makepyfile("""
135197
import pytest

0 commit comments

Comments
 (0)