[svn r63796] Initial import for pytest_twisted.
--HG-- branch : trunk
This commit is contained in:
parent
76273c3674
commit
4893c58d22
|
@ -0,0 +1,114 @@
|
|||
"""
|
||||
TODO:
|
||||
+ credits to Ralf Schmitt See: http://twistedmatrix.com/pipermail/twisted-python/2007-February/014872.html
|
||||
+ add option for twisted logging
|
||||
+ write tests
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
import py
|
||||
try:
|
||||
from twisted.internet.defer import Deferred
|
||||
except ImportError:
|
||||
print "To use the twisted option you have to install twisted."
|
||||
sys.exit(0)
|
||||
try:
|
||||
from greenlet import greenlet
|
||||
except ImportError:
|
||||
print "Since pylib 1.0 greenlet are removed and separately packaged: " \
|
||||
"http://pypi.python.org/pypi/greenlet"
|
||||
sys.exit(0)
|
||||
|
||||
DIR_CUR = str(py.path.local())
|
||||
|
||||
|
||||
def _start_twisted_logging():
|
||||
class Logger(object):
|
||||
"""late-bound sys.stdout"""
|
||||
def write(self, msg):
|
||||
sys.stdout.write(msg)
|
||||
|
||||
def flush(self):
|
||||
sys.stdout.flush()
|
||||
# sys.stdout will be changed by py.test later.
|
||||
|
||||
import twisted.python.log
|
||||
twisted.python.log.startLogging(Logger(), setStdout=0)
|
||||
|
||||
def _run_twisted():
|
||||
"""greenlet: run twisted mainloop"""
|
||||
from twisted.internet import reactor, defer
|
||||
from twisted.python import log, failure
|
||||
failure.Failure.cleanFailure = lambda *args: None # make twisted copy traceback...
|
||||
_start_twisted_logging() # XXX: add py.test option
|
||||
|
||||
def doit(val):
|
||||
res = gr_tests.switch(val)
|
||||
if res is None:
|
||||
reactor.stop()
|
||||
return
|
||||
|
||||
def done(res):
|
||||
reactor.callLater(0.0, doit, None)
|
||||
|
||||
def err(res):
|
||||
reactor.callLater(0.0, doit, res)
|
||||
|
||||
defer.maybeDeferred(res).addCallback(done).addErrback(err)
|
||||
|
||||
reactor.callLater(0.0, doit, None)
|
||||
reactor.run()
|
||||
|
||||
|
||||
class TwistedPlugin:
|
||||
"""Allows to test twisted applications with pytest."""
|
||||
|
||||
def pytest_addoption(self, parser):
|
||||
parser.addoption("--twisted", dest="twisted",
|
||||
help="Allows to test twisted applications with pytest.")
|
||||
|
||||
def pytest_configure(self, config):
|
||||
twisted = config.getvalue("twisted")
|
||||
if twisted:
|
||||
print "Twisted plugin switched on"
|
||||
gr_twisted.switch()
|
||||
|
||||
def pytest_unconfigure(self, config):
|
||||
gr_twisted.switch(None)
|
||||
|
||||
def pytest_pyfunc_call(self, pyfuncitem, *args, **kwargs):
|
||||
def wrapper(func):
|
||||
res = func.obj()
|
||||
if isinstance(res, Deferred):
|
||||
res = gr_twisted.switch(func.obj)
|
||||
if res:
|
||||
res.raiseException()
|
||||
return res
|
||||
pyfuncitem = wrapper(pyfuncitem)
|
||||
|
||||
|
||||
gr_twisted = greenlet(_run_twisted)
|
||||
gr_tests = greenlet.getcurrent()
|
||||
|
||||
# ===============================================================================
|
||||
# plugin tests
|
||||
# ===============================================================================
|
||||
|
||||
# XXX: write test
|
||||
'''
|
||||
def test_generic(plugintester):
|
||||
plugintester.apicheck(EventlogPlugin)
|
||||
|
||||
testdir = plugintester.testdir()
|
||||
testdir.makepyfile("""
|
||||
def test_pass():
|
||||
pass
|
||||
""")
|
||||
testdir.runpytest("--twisted")
|
||||
s = testdir.tmpdir.join("event.log").read()
|
||||
assert s.find("TestrunStart") != -1
|
||||
assert s.find("ItemTestReport") != -1
|
||||
assert s.find("TestrunFinish") != -1
|
||||
'''
|
Loading…
Reference in New Issue