139 lines
3.7 KiB
Python
139 lines
3.7 KiB
Python
|
import py, sys, os
|
||
|
|
||
|
def setup_module(mod):
|
||
|
if not hasattr(os, 'fork'):
|
||
|
py.test.skip("forkedfunc requires os.fork")
|
||
|
mod.tmpdir = py.test.ensuretemp(mod.__file__)
|
||
|
|
||
|
def test_waitfinish_removes_tempdir():
|
||
|
ff = py.process.ForkedFunc(boxf1)
|
||
|
assert ff.tempdir.check()
|
||
|
ff.waitfinish()
|
||
|
assert not ff.tempdir.check()
|
||
|
|
||
|
def test_tempdir_gets_gc_collected():
|
||
|
ff = py.process.ForkedFunc(boxf1)
|
||
|
assert ff.tempdir.check()
|
||
|
ff.__del__()
|
||
|
assert not ff.tempdir.check()
|
||
|
os.waitpid(ff.pid, 0)
|
||
|
|
||
|
def test_basic_forkedfunc():
|
||
|
result = py.process.ForkedFunc(boxf1).waitfinish()
|
||
|
assert result.out == "some out\n"
|
||
|
assert result.err == "some err\n"
|
||
|
assert result.exitstatus == 0
|
||
|
assert result.signal == 0
|
||
|
assert result.retval == 1
|
||
|
|
||
|
def test_exitstatus():
|
||
|
def func():
|
||
|
os._exit(4)
|
||
|
result = py.process.ForkedFunc(func).waitfinish()
|
||
|
assert result.exitstatus == 4
|
||
|
assert result.signal == 0
|
||
|
assert not result.out
|
||
|
assert not result.err
|
||
|
|
||
|
def test_execption_in_func():
|
||
|
def fun():
|
||
|
raise ValueError(42)
|
||
|
ff = py.process.ForkedFunc(fun)
|
||
|
result = ff.waitfinish()
|
||
|
assert result.exitstatus == ff.EXITSTATUS_EXCEPTION
|
||
|
assert result.err.find("ValueError: 42") != -1
|
||
|
assert result.signal == 0
|
||
|
assert not result.retval
|
||
|
|
||
|
def test_forkedfunc_on_fds():
|
||
|
result = py.process.ForkedFunc(boxf2).waitfinish()
|
||
|
assert result.out == "someout"
|
||
|
assert result.err == "someerr"
|
||
|
assert result.exitstatus == 0
|
||
|
assert result.signal == 0
|
||
|
assert result.retval == 2
|
||
|
|
||
|
def test_forkedfunc_signal():
|
||
|
result = py.process.ForkedFunc(boxseg).waitfinish()
|
||
|
assert result.retval is None
|
||
|
if py.std.sys.version_info < (2,4):
|
||
|
py.test.skip("signal detection does not work with python prior 2.4")
|
||
|
assert result.signal == 11
|
||
|
|
||
|
def test_forkedfunc_huge_data():
|
||
|
result = py.process.ForkedFunc(boxhuge).waitfinish()
|
||
|
assert result.out
|
||
|
assert result.exitstatus == 0
|
||
|
assert result.signal == 0
|
||
|
assert result.retval == 3
|
||
|
|
||
|
def test_box_seq():
|
||
|
# we run many boxes with huge data, just one after another
|
||
|
for i in xrange(50):
|
||
|
result = py.process.ForkedFunc(boxhuge).waitfinish()
|
||
|
assert result.out
|
||
|
assert result.exitstatus == 0
|
||
|
assert result.signal == 0
|
||
|
assert result.retval == 3
|
||
|
|
||
|
def test_box_in_a_box():
|
||
|
def boxfun():
|
||
|
result = py.process.ForkedFunc(boxf2).waitfinish()
|
||
|
print result.out
|
||
|
print >>sys.stderr, result.err
|
||
|
return result.retval
|
||
|
|
||
|
result = py.process.ForkedFunc(boxfun).waitfinish()
|
||
|
assert result.out == "someout\n"
|
||
|
assert result.err == "someerr\n"
|
||
|
assert result.exitstatus == 0
|
||
|
assert result.signal == 0
|
||
|
assert result.retval == 2
|
||
|
|
||
|
def test_kill_func_forked():
|
||
|
class A:
|
||
|
pass
|
||
|
info = A()
|
||
|
import time
|
||
|
|
||
|
def box_fun():
|
||
|
time.sleep(10) # we don't want to last forever here
|
||
|
|
||
|
ff = py.process.ForkedFunc(box_fun)
|
||
|
os.kill(ff.pid, 15)
|
||
|
result = ff.waitfinish()
|
||
|
if py.std.sys.version_info < (2,4):
|
||
|
py.test.skip("signal detection does not work with python prior 2.4")
|
||
|
assert result.signal == 15
|
||
|
|
||
|
|
||
|
|
||
|
# ======================================================================
|
||
|
# examples
|
||
|
# ======================================================================
|
||
|
#
|
||
|
|
||
|
def boxf1():
|
||
|
print "some out"
|
||
|
print >>sys.stderr, "some err"
|
||
|
return 1
|
||
|
|
||
|
def boxf2():
|
||
|
os.write(1, "someout")
|
||
|
os.write(2, "someerr")
|
||
|
return 2
|
||
|
|
||
|
def boxseg():
|
||
|
os.kill(os.getpid(), 11)
|
||
|
|
||
|
def boxhuge():
|
||
|
os.write(1, " " * 10000)
|
||
|
os.write(2, " " * 10000)
|
||
|
os.write(1, " " * 10000)
|
||
|
|
||
|
os.write(1, " " * 10000)
|
||
|
os.write(2, " " * 10000)
|
||
|
os.write(2, " " * 10000)
|
||
|
os.write(1, " " * 10000)
|
||
|
return 3
|