182 lines
5.2 KiB
Python
182 lines
5.2 KiB
Python
|
|
""" Testing the slave side node code (in a local way). """
|
|
from py.__.test.rsession.slave import SlaveNode, slave_main, setup, PidInfo
|
|
from py.__.test.rsession.outcome import ReprOutcome
|
|
import py, sys
|
|
|
|
modlevel = []
|
|
import os
|
|
|
|
if sys.platform == 'win32':
|
|
py.test.skip("rsession is unsupported on Windows.")
|
|
|
|
def setup_module(module):
|
|
module.rootdir = py.path.local(py.__file__).dirpath().dirpath()
|
|
module.rootcol = py.test.collect.Directory(rootdir)
|
|
|
|
# ----------------------------------------------------------------------
|
|
# inlined testing functions used below
|
|
def funcpass():
|
|
pass
|
|
|
|
def funcfail():
|
|
raise AssertionError("hello world")
|
|
|
|
def funcskip():
|
|
py.test.skip("skipped")
|
|
|
|
def funcprint():
|
|
print "samfing"
|
|
|
|
def funcprintfail():
|
|
print "samfing elz"
|
|
asddsa
|
|
|
|
def funcoptioncustom():
|
|
assert py.test.config.getvalue("custom")
|
|
|
|
def funchang():
|
|
import time
|
|
time.sleep(1000)
|
|
|
|
BASE = "py/test/rsession/testing/test_slave.py/"
|
|
funcpass_spec = (BASE + "funcpass").split("/")
|
|
funcfail_spec = (BASE + "funcfail").split("/")
|
|
funcskip_spec = (BASE + "funcskip").split("/")
|
|
funcprint_spec = (BASE + "funcprint").split("/")
|
|
funcprintfail_spec = (BASE + "funcprintfail").split("/")
|
|
funcoptioncustom_spec = (BASE + "funcoptioncustom").split("/")
|
|
funchang_spec = (BASE + "funchang").split("/")
|
|
mod_spec = BASE[:-1].split("/")
|
|
|
|
# ----------------------------------------------------------------------
|
|
|
|
from py.__.test.rsession.executor import RunExecutor
|
|
|
|
def gettestnode():
|
|
config = py.test.config._reparse([rootdir])
|
|
pidinfo = PidInfo()
|
|
node = SlaveNode(config, pidinfo, executor=RunExecutor)
|
|
return node
|
|
|
|
def test_slave_run_passing():
|
|
node = gettestnode()
|
|
item = rootcol.getitembynames(funcpass_spec)
|
|
outcome = node.execute(item._get_collector_trail())
|
|
assert outcome.passed
|
|
assert not outcome.setupfailure
|
|
|
|
ser = outcome.make_repr()
|
|
reproutcome = ReprOutcome(ser)
|
|
assert reproutcome.passed
|
|
assert not reproutcome.setupfailure
|
|
|
|
def test_slave_run_failing():
|
|
node = gettestnode()
|
|
item = rootcol.getitembynames(funcfail_spec)
|
|
outcome = node.execute(item._get_collector_trail())
|
|
assert not outcome.passed
|
|
assert not outcome.setupfailure
|
|
assert len(outcome.excinfo.traceback) == 1
|
|
assert outcome.excinfo.traceback[-1].frame.code.name == 'funcfail'
|
|
|
|
ser = outcome.make_repr()
|
|
reproutcome = ReprOutcome(ser)
|
|
assert not reproutcome.passed
|
|
assert not reproutcome.setupfailure
|
|
assert reproutcome.excinfo
|
|
|
|
def test_slave_run_skipping():
|
|
node = gettestnode()
|
|
item = rootcol.getitembynames(funcskip_spec)
|
|
outcome = node.execute(item._get_collector_trail())
|
|
assert not outcome.passed
|
|
assert outcome.skipped
|
|
|
|
ser = outcome.make_repr()
|
|
reproutcome = ReprOutcome(ser)
|
|
assert not reproutcome.passed
|
|
assert reproutcome.skipped
|
|
|
|
def test_slave_run_failing_wrapped():
|
|
node = gettestnode()
|
|
item = rootcol.getitembynames(funcfail_spec)
|
|
repr_outcome = node.run(item._get_collector_trail())
|
|
outcome = ReprOutcome(repr_outcome)
|
|
assert not outcome.passed
|
|
assert not outcome.setupfailure
|
|
assert outcome.excinfo
|
|
|
|
def test_slave_main_simple():
|
|
res = []
|
|
failitem = rootcol.getitembynames(funcfail_spec)
|
|
passitem = rootcol.getitembynames(funcpass_spec)
|
|
q = [None,
|
|
passitem._get_collector_trail(),
|
|
failitem._get_collector_trail()
|
|
]
|
|
config = py.test.config._reparse([])
|
|
pidinfo = PidInfo()
|
|
slave_main(q.pop, res.append, str(rootdir), config, pidinfo)
|
|
assert len(res) == 2
|
|
res_repr = [ReprOutcome(r) for r in res]
|
|
assert not res_repr[0].passed and res_repr[1].passed
|
|
|
|
def test_slave_run_different_stuff():
|
|
node = gettestnode()
|
|
node.run(rootcol.getitembynames("py doc log.txt".split()).
|
|
_get_collector_trail())
|
|
|
|
def test_slave_setup_exit():
|
|
tmp = py.test.ensuretemp("slaveexit")
|
|
tmp.ensure("__init__.py")
|
|
q = py.std.Queue.Queue()
|
|
config = py.test.config._reparse([tmp])
|
|
|
|
class C:
|
|
res = []
|
|
def __init__(self):
|
|
self.q = [str(tmp),
|
|
config.make_repr(conftestnames=['dist_nicelevel']),
|
|
funchang_spec,
|
|
42,
|
|
funcpass_spec]
|
|
self.q.reverse()
|
|
|
|
def receive(self):
|
|
return self.q.pop()
|
|
|
|
def setcallback(self, callback):
|
|
import thread
|
|
def f():
|
|
while 1:
|
|
callback(self.q.pop())
|
|
f()
|
|
#thread.start_new_thread(f, ())
|
|
|
|
def close(self):
|
|
pass
|
|
|
|
send = res.append
|
|
try:
|
|
exec py.code.Source(setup, "setup()").compile() in {'channel':C()}
|
|
except SystemExit:
|
|
pass
|
|
else:
|
|
py.test.fail("Did not exit")
|
|
|
|
def test_pidinfo():
|
|
if not hasattr(os, 'fork') or not hasattr(os, 'waitpid'):
|
|
py.test.skip("Platform does not support fork")
|
|
pidinfo = PidInfo()
|
|
pid = os.fork()
|
|
if pid:
|
|
pidinfo.set_pid(pid)
|
|
pidinfo.waitandclear(pid, 0)
|
|
else:
|
|
import time, sys
|
|
time.sleep(.3)
|
|
os._exit(0)
|
|
# check if this really exits
|
|
py.test.raises(OSError, "os.waitpid(pid, 0)")
|