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)")
 |