83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
import py
|
|
import pickle
|
|
|
|
def setglobals(request):
|
|
oldconfig = py.test.config
|
|
print("setting py.test.config to None")
|
|
py.test.config = None
|
|
def resetglobals():
|
|
py.builtin.print_("setting py.test.config to", oldconfig)
|
|
py.test.config = oldconfig
|
|
request.addfinalizer(resetglobals)
|
|
|
|
def pytest_funcarg__testdir(request):
|
|
setglobals(request)
|
|
return request.getfuncargvalue("testdir")
|
|
|
|
class ImmutablePickleTransport:
|
|
def __init__(self, request):
|
|
from xdist.mypickle import ImmutablePickler
|
|
self.p1 = ImmutablePickler(uneven=0)
|
|
self.p2 = ImmutablePickler(uneven=1)
|
|
setglobals(request)
|
|
|
|
def p1_to_p2(self, obj):
|
|
return self.p2.loads(self.p1.dumps(obj))
|
|
|
|
def p2_to_p1(self, obj):
|
|
return self.p1.loads(self.p2.dumps(obj))
|
|
|
|
def unifyconfig(self, config):
|
|
p2config = self.p1_to_p2(config)
|
|
p2config._initafterpickle(config.topdir)
|
|
return p2config
|
|
|
|
pytest_funcarg__pickletransport = ImmutablePickleTransport
|
|
|
|
class TestImmutablePickling:
|
|
def test_pickle_config(self, testdir, pickletransport):
|
|
config1 = testdir.parseconfig()
|
|
assert config1.topdir == testdir.tmpdir
|
|
testdir.chdir()
|
|
p2config = pickletransport.p1_to_p2(config1)
|
|
assert p2config.topdir.realpath() == config1.topdir.realpath()
|
|
config_back = pickletransport.p2_to_p1(p2config)
|
|
assert config_back is config1
|
|
|
|
def test_pickle_modcol(self, testdir, pickletransport):
|
|
modcol1 = testdir.getmodulecol("def test_one(): pass")
|
|
modcol2a = pickletransport.p1_to_p2(modcol1)
|
|
modcol2b = pickletransport.p1_to_p2(modcol1)
|
|
assert modcol2a is modcol2b
|
|
|
|
modcol1_back = pickletransport.p2_to_p1(modcol2a)
|
|
assert modcol1_back
|
|
|
|
def test_pickle_func(self, testdir, pickletransport):
|
|
modcol1 = testdir.getmodulecol("def test_one(): pass")
|
|
item = modcol1.collect_by_name("test_one")
|
|
testdir.chdir()
|
|
item2a = pickletransport.p1_to_p2(item)
|
|
assert item is not item2a # of course
|
|
assert item2a.name == item.name
|
|
modback = pickletransport.p2_to_p1(item2a.parent)
|
|
assert modback is modcol1
|
|
|
|
|
|
def test_config__setstate__wired_correctly_in_childprocess(testdir):
|
|
execnet = py.test.importorskip("execnet")
|
|
from xdist.mypickle import PickleChannel
|
|
gw = execnet.makegateway()
|
|
channel = gw.remote_exec("""
|
|
import py
|
|
from xdist.mypickle import PickleChannel
|
|
channel = PickleChannel(channel)
|
|
config = channel.receive()
|
|
assert py.test.config == config
|
|
""")
|
|
channel = PickleChannel(channel)
|
|
config = testdir.parseconfig()
|
|
channel.send(config)
|
|
channel.waitclose() # this will potentially raise
|
|
gw.exit()
|