flake8 cleanup
This commit is contained in:
@@ -10,9 +10,7 @@ class TestDistribution:
|
||||
""")
|
||||
result = testdir.runpytest(p1, "-n1")
|
||||
assert result.ret == 0
|
||||
result.stdout.fnmatch_lines([
|
||||
"*1 passed*",
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*1 passed*", ])
|
||||
|
||||
def test_n1_fail(self, testdir):
|
||||
p1 = testdir.makepyfile("""
|
||||
@@ -21,9 +19,7 @@ class TestDistribution:
|
||||
""")
|
||||
result = testdir.runpytest(p1, "-n1")
|
||||
assert result.ret == 1
|
||||
result.stdout.fnmatch_lines([
|
||||
"*1 failed*",
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*1 failed*", ])
|
||||
|
||||
def test_n1_import_error(self, testdir):
|
||||
p1 = testdir.makepyfile("""
|
||||
@@ -57,9 +53,7 @@ class TestDistribution:
|
||||
""")
|
||||
result = testdir.runpytest(p1, "-n1")
|
||||
assert result.ret == 0
|
||||
result.stdout.fnmatch_lines([
|
||||
"*1 skipped*",
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*1 skipped*", ])
|
||||
|
||||
def test_manytests_to_one_import_error(self, testdir):
|
||||
p1 = testdir.makepyfile("""
|
||||
@@ -84,8 +78,7 @@ class TestDistribution:
|
||||
pass
|
||||
def test_skip():
|
||||
py.test.skip("hello")
|
||||
""",
|
||||
)
|
||||
""", )
|
||||
result = testdir.runpytest(p1, "-v", '-d', '--tx=popen', '--tx=popen')
|
||||
result.stdout.fnmatch_lines([
|
||||
"*1*Python*",
|
||||
@@ -115,9 +108,7 @@ class TestDistribution:
|
||||
""" % str(testdir.tmpdir))
|
||||
result = testdir.runpytest_subprocess(p1, "-n1")
|
||||
assert result.ret == 0
|
||||
result.stdout.fnmatch_lines([
|
||||
"*1 passed*",
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*1 passed*", ])
|
||||
|
||||
def test_dist_ini_specified(self, testdir):
|
||||
p1 = testdir.makepyfile("""
|
||||
@@ -130,8 +121,7 @@ class TestDistribution:
|
||||
pass
|
||||
def test_skip():
|
||||
py.test.skip("hello")
|
||||
""",
|
||||
)
|
||||
""", )
|
||||
testdir.makeini("""
|
||||
[pytest]
|
||||
addopts = --tx=3*popen
|
||||
@@ -163,13 +153,10 @@ class TestDistribution:
|
||||
import os
|
||||
time.sleep(0.5)
|
||||
os.kill(os.getpid(), 15)
|
||||
"""
|
||||
)
|
||||
""")
|
||||
result = testdir.runpytest(p1, "-v", '-d', '-n1')
|
||||
result.stdout.fnmatch_lines([
|
||||
"*Python*",
|
||||
"*PASS**test_ok*",
|
||||
"*node*down*",
|
||||
"*Python*", "*PASS**test_ok*", "*node*down*",
|
||||
"*3 failed, 1 passed, 1 skipped*"
|
||||
])
|
||||
assert result.ret == 1
|
||||
@@ -182,13 +169,13 @@ class TestDistribution:
|
||||
p = subdir.join("test_one.py")
|
||||
p.write("def test_5():\n assert not __file__.startswith(%r)" % str(p))
|
||||
result = testdir.runpytest("-v", "-d",
|
||||
"--rsyncdir=%(subdir)s" % locals(),
|
||||
"--tx=popen//chdir=%(dest)s" % locals(), p)
|
||||
"--rsyncdir=%(subdir)s" % locals(),
|
||||
"--tx=popen//chdir=%(dest)s" % locals(), p)
|
||||
assert result.ret == 0
|
||||
result.stdout.fnmatch_lines([
|
||||
"*0* *cwd*",
|
||||
#"RSyncStart: [G1]",
|
||||
#"RSyncFinished: [G1]",
|
||||
# "RSyncStart: [G1]",
|
||||
# "RSyncFinished: [G1]",
|
||||
"*1 passed*"
|
||||
])
|
||||
assert dest.join(subdir.basename).check(dir=1)
|
||||
@@ -221,14 +208,13 @@ class TestDistribution:
|
||||
p1 = testdir.makepyfile("def test_func(): pass")
|
||||
result = testdir.runpytest("-v", p1, '-d', '--tx=popen')
|
||||
result.stdout.fnmatch_lines([
|
||||
"*0*Python*",
|
||||
"*calculated result is 49*",
|
||||
"*1 passed*"
|
||||
"*0*Python*", "*calculated result is 49*", "*1 passed*"
|
||||
])
|
||||
assert result.ret == 0
|
||||
|
||||
def test_keyboardinterrupt_hooks_issue79(self, testdir):
|
||||
testdir.makepyfile(__init__="", test_one="""
|
||||
testdir.makepyfile(__init__="",
|
||||
test_one="""
|
||||
def test_hello():
|
||||
raise KeyboardInterrupt()
|
||||
""")
|
||||
@@ -258,11 +244,12 @@ class TestDistribution:
|
||||
""")
|
||||
child = testdir.spawn_pytest("-n1 -v")
|
||||
child.expect(".*test_sleep.*")
|
||||
child.kill(2) # keyboard interrupt
|
||||
child.kill(2) # keyboard interrupt
|
||||
child.expect(".*KeyboardInterrupt.*")
|
||||
#child.expect(".*seconds.*")
|
||||
# child.expect(".*seconds.*")
|
||||
child.close()
|
||||
#assert ret == 2
|
||||
# assert ret == 2
|
||||
|
||||
|
||||
class TestDistEach:
|
||||
def test_simple(self, testdir):
|
||||
@@ -270,11 +257,13 @@ class TestDistEach:
|
||||
def test_hello():
|
||||
pass
|
||||
""")
|
||||
result = testdir.runpytest_subprocess("--debug", "--dist=each", "--tx=2*popen")
|
||||
result = testdir.runpytest_subprocess("--debug", "--dist=each",
|
||||
"--tx=2*popen")
|
||||
assert not result.ret
|
||||
result.stdout.fnmatch_lines(["*2 pass*"])
|
||||
|
||||
@py.test.mark.xfail(run=False,
|
||||
@py.test.mark.xfail(
|
||||
run=False,
|
||||
reason="other python versions might not have py.test installed")
|
||||
def test_simple_diffoutput(self, testdir):
|
||||
interpreters = []
|
||||
@@ -284,7 +273,8 @@ class TestDistEach:
|
||||
py.test.skip("%s not found" % name)
|
||||
interpreters.append(interp)
|
||||
|
||||
testdir.makepyfile(__init__="", test_one="""
|
||||
testdir.makepyfile(__init__="",
|
||||
test_one="""
|
||||
import sys
|
||||
def test_hello():
|
||||
print("%s...%s" % sys.version_info[:2])
|
||||
@@ -298,6 +288,7 @@ class TestDistEach:
|
||||
assert "2...5" in s
|
||||
assert "2...6" in s
|
||||
|
||||
|
||||
class TestTerminalReporting:
|
||||
def test_pass_skip_fail(self, testdir):
|
||||
testdir.makepyfile("""
|
||||
@@ -335,6 +326,7 @@ class TestTerminalReporting:
|
||||
"E assert 0",
|
||||
])
|
||||
|
||||
|
||||
def test_teardownfails_one_function(testdir):
|
||||
p = testdir.makepyfile("""
|
||||
def test_func():
|
||||
@@ -344,10 +336,10 @@ def test_teardownfails_one_function(testdir):
|
||||
""")
|
||||
result = testdir.runpytest(p, '-n1', '--tx=popen')
|
||||
result.stdout.fnmatch_lines([
|
||||
"*def teardown_function(function):*",
|
||||
"*1 passed*1 error*"
|
||||
"*def teardown_function(function):*", "*1 passed*1 error*"
|
||||
])
|
||||
|
||||
|
||||
@py.test.mark.xfail
|
||||
def test_terminate_on_hangingnode(testdir):
|
||||
p = testdir.makeconftest("""
|
||||
@@ -358,9 +350,7 @@ def test_terminate_on_hangingnode(testdir):
|
||||
""")
|
||||
result = testdir.runpytest(p, '--dist=each', '--tx=popen//id=my')
|
||||
assert result.duration < 2.0
|
||||
result.stdout.fnmatch_lines([
|
||||
"*killed*my*",
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*killed*my*", ])
|
||||
|
||||
|
||||
def test_auto_detect_cpus(testdir, monkeypatch):
|
||||
@@ -400,10 +390,7 @@ def test_session_hooks(testdir):
|
||||
assert hasattr(sys, 'pytestsessionhooks')
|
||||
""")
|
||||
result = testdir.runpytest(p, "--dist=each", "--tx=popen")
|
||||
result.stdout.fnmatch_lines([
|
||||
"*ValueError*",
|
||||
"*1 passed*",
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*ValueError*", "*1 passed*", ])
|
||||
assert not result.ret
|
||||
d = result.parseoutcomes()
|
||||
assert d['passed'] == 1
|
||||
@@ -445,13 +432,11 @@ def test_funcarg_teardown_failure(testdir):
|
||||
def test_hello(myarg):
|
||||
pass
|
||||
""")
|
||||
result = testdir.runpytest_subprocess("--debug", p) # , "-n1")
|
||||
result.stdout.fnmatch_lines([
|
||||
"*ValueError*42*",
|
||||
"*1 passed*1 error*",
|
||||
])
|
||||
result = testdir.runpytest_subprocess("--debug", p) # , "-n1")
|
||||
result.stdout.fnmatch_lines(["*ValueError*42*", "*1 passed*1 error*", ])
|
||||
assert result.ret
|
||||
|
||||
|
||||
def test_crashing_item(testdir):
|
||||
p = testdir.makepyfile("""
|
||||
import py
|
||||
@@ -463,12 +448,10 @@ def test_crashing_item(testdir):
|
||||
""")
|
||||
result = testdir.runpytest("-n2", p)
|
||||
result.stdout.fnmatch_lines([
|
||||
"*crashed*test_crash*",
|
||||
"*1 failed*1 passed*"
|
||||
"*crashed*test_crash*", "*1 failed*1 passed*"
|
||||
])
|
||||
|
||||
|
||||
|
||||
def test_skipping(testdir):
|
||||
p = testdir.makepyfile("""
|
||||
import pytest
|
||||
@@ -477,10 +460,8 @@ def test_skipping(testdir):
|
||||
""")
|
||||
result = testdir.runpytest("-n1", '-rs', p)
|
||||
assert result.ret == 0
|
||||
result.stdout.fnmatch_lines([
|
||||
"*hello*",
|
||||
"*1 skipped*"
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*hello*", "*1 skipped*"])
|
||||
|
||||
|
||||
def test_issue34_pluginloading_in_subprocess(testdir):
|
||||
testdir.tmpdir.join("plugin123.py").write(py.code.Source("""
|
||||
@@ -494,9 +475,7 @@ def test_issue34_pluginloading_in_subprocess(testdir):
|
||||
""")
|
||||
result = testdir.runpytest_subprocess("-n1", "-p", "plugin123")
|
||||
assert result.ret == 0
|
||||
result.stdout.fnmatch_lines([
|
||||
"*1 passed*",
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*1 passed*", ])
|
||||
|
||||
|
||||
def test_fixture_scope_caching_issue503(testdir):
|
||||
@@ -505,7 +484,8 @@ def test_fixture_scope_caching_issue503(testdir):
|
||||
|
||||
@pytest.fixture(scope='session')
|
||||
def fix():
|
||||
assert fix.counter == 0, 'session fixture was invoked multiple times'
|
||||
assert fix.counter == 0, \
|
||||
'session fixture was invoked multiple times'
|
||||
fix.counter += 1
|
||||
fix.counter = 0
|
||||
|
||||
@@ -517,9 +497,7 @@ def test_fixture_scope_caching_issue503(testdir):
|
||||
""")
|
||||
result = testdir.runpytest(p1, '-v', '-n1')
|
||||
assert result.ret == 0
|
||||
result.stdout.fnmatch_lines([
|
||||
"*2 passed*",
|
||||
])
|
||||
result.stdout.fnmatch_lines(["*2 passed*", ])
|
||||
|
||||
|
||||
def test_issue_594_random_parametrize(testdir):
|
||||
@@ -545,7 +523,6 @@ def test_issue_594_random_parametrize(testdir):
|
||||
|
||||
|
||||
class TestNodeFailure:
|
||||
|
||||
def test_load_single(self, testdir):
|
||||
f = testdir.makepyfile("""
|
||||
import os
|
||||
@@ -617,7 +594,6 @@ class TestNodeFailure:
|
||||
"*2 failed*2 passed*",
|
||||
])
|
||||
|
||||
|
||||
def test_disable_restart(self, testdir):
|
||||
f = testdir.makepyfile("""
|
||||
import os
|
||||
|
||||
@@ -2,6 +2,7 @@ import py
|
||||
import pytest
|
||||
import execnet
|
||||
|
||||
|
||||
@pytest.fixture(scope="session", autouse=True)
|
||||
def _ensure_imports():
|
||||
# we import some modules because pytest-2.8's testdir fixture
|
||||
@@ -10,28 +11,36 @@ def _ensure_imports():
|
||||
execnet.Group
|
||||
execnet.makegateway
|
||||
|
||||
|
||||
pytest_plugins = "pytester"
|
||||
|
||||
#rsyncdirs = ['.', '../xdist', py.path.local(execnet.__file__).dirpath()]
|
||||
# rsyncdirs = ['.', '../xdist', py.path.local(execnet.__file__).dirpath()]
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def _divert_atexit(request, monkeypatch):
|
||||
import atexit
|
||||
l = []
|
||||
|
||||
def finish():
|
||||
while l:
|
||||
l.pop()()
|
||||
|
||||
monkeypatch.setattr(atexit, "register", l.append)
|
||||
request.addfinalizer(finish)
|
||||
|
||||
|
||||
def pytest_addoption(parser):
|
||||
parser.addoption('--gx',
|
||||
action="append", dest="gspecs",
|
||||
help=("add a global test environment, XSpec-syntax. "))
|
||||
action="append",
|
||||
dest="gspecs",
|
||||
help=("add a global test environment, XSpec-syntax. "))
|
||||
|
||||
|
||||
def pytest_funcarg__specssh(request):
|
||||
return getspecssh(request.config)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def testdir(testdir):
|
||||
# pytest before 2.8 did not have a runpytest_subprocess
|
||||
@@ -39,10 +48,11 @@ def testdir(testdir):
|
||||
testdir.runpytest_subprocess = testdir.runpytest
|
||||
return testdir
|
||||
|
||||
|
||||
# configuration information for tests
|
||||
def getgspecs(config):
|
||||
return [execnet.XSpec(spec)
|
||||
for spec in config.getvalueorskip("gspecs")]
|
||||
return [execnet.XSpec(spec) for spec in config.getvalueorskip("gspecs")]
|
||||
|
||||
|
||||
def getspecssh(config):
|
||||
xspecs = getgspecs(config)
|
||||
@@ -53,10 +63,10 @@ def getspecssh(config):
|
||||
return str(spec)
|
||||
py.test.skip("need '--gx ssh=...'")
|
||||
|
||||
|
||||
def getsocketspec(config):
|
||||
xspecs = getgspecs(config)
|
||||
for spec in xspecs:
|
||||
if spec.socket:
|
||||
return spec
|
||||
py.test.skip("need '--gx socket=...'")
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import os
|
||||
needsfork = pytest.mark.skipif(not hasattr(os, "fork"),
|
||||
reason="os.fork required")
|
||||
|
||||
|
||||
@needsfork
|
||||
def test_functional_boxed(testdir):
|
||||
p1 = testdir.makepyfile("""
|
||||
@@ -17,6 +18,7 @@ def test_functional_boxed(testdir):
|
||||
"*1 failed*"
|
||||
])
|
||||
|
||||
|
||||
@needsfork
|
||||
@pytest.mark.parametrize("capmode", [
|
||||
"no",
|
||||
@@ -41,6 +43,7 @@ def test_functional_boxed_capturing(testdir, capmode):
|
||||
*1 failed*
|
||||
""")
|
||||
|
||||
|
||||
class TestOptionEffects:
|
||||
def test_boxed_option_default(self, testdir):
|
||||
tmpdir = testdir.tmpdir.ensure("subdir", dir=1)
|
||||
@@ -53,4 +56,3 @@ class TestOptionEffects:
|
||||
def test_is_not_boxed_by_default(self, testdir):
|
||||
config = testdir.parseconfig(testdir.tmpdir)
|
||||
assert not config.option.boxed
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
from xdist.dsession import (
|
||||
DSession,
|
||||
LoadScheduling,
|
||||
EachScheduling,
|
||||
report_collection_diff,
|
||||
DSession, LoadScheduling, EachScheduling, report_collection_diff,
|
||||
)
|
||||
import py
|
||||
import pytest
|
||||
@@ -10,19 +7,22 @@ import execnet
|
||||
|
||||
XSpec = execnet.XSpec
|
||||
|
||||
|
||||
def run(item, node, excinfo=None):
|
||||
runner = item.config.pluginmanager.getplugin("runner")
|
||||
rep = runner.ItemTestReport(item=item,
|
||||
excinfo=excinfo, when="call")
|
||||
rep = runner.ItemTestReport(item=item, excinfo=excinfo, when="call")
|
||||
rep.node = node
|
||||
return rep
|
||||
|
||||
|
||||
class MockGateway:
|
||||
_count = 0
|
||||
|
||||
def __init__(self):
|
||||
self.id = str(self._count)
|
||||
self._count += 1
|
||||
|
||||
|
||||
class MockNode:
|
||||
def __init__(self):
|
||||
self.sent = []
|
||||
@@ -35,12 +35,14 @@ class MockNode:
|
||||
self.sent.append("ALL")
|
||||
|
||||
def shutdown(self):
|
||||
self._shutdown=True
|
||||
self._shutdown = True
|
||||
|
||||
|
||||
def dumpqueue(queue):
|
||||
while queue.qsize():
|
||||
print(queue.get())
|
||||
|
||||
|
||||
class TestEachScheduling:
|
||||
def test_schedule_load_simple(self):
|
||||
node1 = MockNode()
|
||||
@@ -81,6 +83,7 @@ class TestEachScheduling:
|
||||
assert sched.tests_finished()
|
||||
assert not sched.hasnodes()
|
||||
|
||||
|
||||
class TestLoadScheduling:
|
||||
def test_schedule_load_simple(self):
|
||||
sched = LoadScheduling(2)
|
||||
@@ -115,7 +118,7 @@ class TestLoadScheduling:
|
||||
sched.addnode_collection(node1, col)
|
||||
sched.addnode_collection(node2, col)
|
||||
sched.init_distribute()
|
||||
#assert not sched.tests_finished()
|
||||
# assert not sched.tests_finished()
|
||||
sent1 = node1.sent
|
||||
sent2 = node2.sent
|
||||
assert sent1 == [0, 1]
|
||||
@@ -149,6 +152,7 @@ class TestLoadScheduling:
|
||||
Test that LoadScheduling is reporting collection errors when
|
||||
different test ids are collected by slaves.
|
||||
"""
|
||||
|
||||
class CollectHook(object):
|
||||
"""
|
||||
Dummy hook that stores collection reports.
|
||||
@@ -177,7 +181,6 @@ class TestLoadScheduling:
|
||||
|
||||
|
||||
class TestDistReporter:
|
||||
|
||||
@py.test.mark.xfail
|
||||
def test_rsync_printing(self, testdir, linecomp):
|
||||
config = testdir.parseconfig()
|
||||
@@ -185,26 +188,26 @@ class TestDistReporter:
|
||||
rep = TerminalReporter(config, file=linecomp.stringio)
|
||||
config.pluginmanager.register(rep, "terminalreporter")
|
||||
dsession = DSession(config)
|
||||
|
||||
class gw1:
|
||||
id = "X1"
|
||||
spec = execnet.XSpec("popen")
|
||||
|
||||
class gw2:
|
||||
id = "X2"
|
||||
spec = execnet.XSpec("popen")
|
||||
#class rinfo:
|
||||
# class rinfo:
|
||||
# version_info = (2, 5, 1, 'final', 0)
|
||||
# executable = "hello"
|
||||
# platform = "xyz"
|
||||
# cwd = "qwe"
|
||||
|
||||
#dsession.pytest_xdist_newgateway(gw1, rinfo)
|
||||
#linecomp.assert_contains_lines([
|
||||
# "*X1*popen*xyz*2.5*"
|
||||
#])
|
||||
# dsession.pytest_xdist_newgateway(gw1, rinfo)
|
||||
# linecomp.assert_contains_lines([
|
||||
# "*X1*popen*xyz*2.5*"
|
||||
# ])
|
||||
dsession.pytest_xdist_rsyncstart(source="hello", gateways=[gw1, gw2])
|
||||
linecomp.assert_contains_lines([
|
||||
"[X1,X2] rsyncing: hello",
|
||||
])
|
||||
linecomp.assert_contains_lines(["[X1,X2] rsyncing: hello", ])
|
||||
|
||||
|
||||
def test_report_collection_diff_equal():
|
||||
@@ -230,12 +233,12 @@ def test_report_collection_diff_different():
|
||||
' bbb\n'
|
||||
'+XXX\n'
|
||||
' ccc\n'
|
||||
'-YYY'
|
||||
)
|
||||
'-YYY')
|
||||
|
||||
msg = report_collection_diff(from_collection, to_collection, 1, 2)
|
||||
assert msg == error_message
|
||||
|
||||
|
||||
@pytest.mark.xfail(reason="duplicate test ids not supported yet")
|
||||
def test_pytest_issue419(testdir):
|
||||
testdir.makepyfile("""
|
||||
|
||||
@@ -2,6 +2,7 @@ import py
|
||||
from xdist.looponfail import RemoteControl
|
||||
from xdist.looponfail import StatRecorder
|
||||
|
||||
|
||||
class TestStatRecorder:
|
||||
def test_filechange(self, tmpdir):
|
||||
tmp = tmpdir
|
||||
@@ -87,6 +88,7 @@ class TestStatRecorder:
|
||||
sd.waitonchange(checkinterval=0.2)
|
||||
assert not l
|
||||
|
||||
|
||||
class TestRemoteControl:
|
||||
def test_nofailures(self, testdir):
|
||||
item = testdir.getitem("def test_func(): pass\n")
|
||||
@@ -136,13 +138,14 @@ class TestRemoteControl:
|
||||
parent = modcol.fspath.dirpath().dirpath()
|
||||
parent.chdir()
|
||||
modcol.config.args = [py.path.local(x).relto(parent)
|
||||
for x in modcol.config.args]
|
||||
for x in modcol.config.args]
|
||||
control = RemoteControl(modcol.config)
|
||||
control.loop_once()
|
||||
assert control.failures
|
||||
control.loop_once()
|
||||
assert control.failures
|
||||
|
||||
|
||||
class TestLooponFailing:
|
||||
def test_looponfail_from_fail_to_ok(self, testdir):
|
||||
modcol = testdir.getmodulecol("""
|
||||
@@ -225,7 +228,7 @@ class TestLooponFailing:
|
||||
def runsession_dups():
|
||||
# twisted.trial test cases may report multiple errors.
|
||||
failures, reports, collection_failed = orig_runsession()
|
||||
print (failures)
|
||||
print(failures)
|
||||
return failures * 2, reports, collection_failed
|
||||
|
||||
monkeypatch.setattr(remotecontrol, 'runsession', runsession_dups)
|
||||
@@ -240,8 +243,8 @@ class TestFunctional:
|
||||
x = 0
|
||||
assert x == 1
|
||||
""")
|
||||
#p = testdir.mkdir("sub").join(p1.basename)
|
||||
#p1.move(p)
|
||||
# p = testdir.mkdir("sub").join(p1.basename)
|
||||
# p1.move(p)
|
||||
child = testdir.spawn_pytest("-f %s --traceconfig" % p)
|
||||
child.expect("def test_one")
|
||||
child.expect("x == 1")
|
||||
@@ -269,6 +272,7 @@ class TestFunctional:
|
||||
child.expect("waiting for changes")
|
||||
child.kill(15)
|
||||
|
||||
|
||||
def removepyc(path):
|
||||
# XXX damn those pyc files
|
||||
pyc = path + "c"
|
||||
@@ -277,4 +281,3 @@ def removepyc(path):
|
||||
c = path.dirpath("__pycache__")
|
||||
if c.check():
|
||||
c.remove()
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ import py
|
||||
import execnet
|
||||
from xdist.slavemanage import NodeManager
|
||||
|
||||
|
||||
def test_dist_incompatibility_messages(testdir):
|
||||
result = testdir.runpytest("--pdb", "--looponfail")
|
||||
assert result.ret != 0
|
||||
@@ -12,6 +13,7 @@ def test_dist_incompatibility_messages(testdir):
|
||||
assert result.ret != 0
|
||||
assert "incompatible" in result.stderr.str()
|
||||
|
||||
|
||||
def test_dist_options(testdir):
|
||||
from xdist.plugin import pytest_cmdline_main as check_options
|
||||
config = testdir.parseconfigure("-n 2")
|
||||
@@ -22,6 +24,7 @@ def test_dist_options(testdir):
|
||||
check_options(config)
|
||||
assert config.option.dist == "load"
|
||||
|
||||
|
||||
class TestDistOptions:
|
||||
def test_getxspecs(self, testdir):
|
||||
config = testdir.parseconfigure("--tx=popen", "--tx", "ssh=xyz")
|
||||
@@ -33,7 +36,7 @@ class TestDistOptions:
|
||||
assert xspecs[1].ssh == "xyz"
|
||||
|
||||
def test_xspecs_multiplied(self, testdir):
|
||||
config = testdir.parseconfigure("--tx=3*popen",)
|
||||
config = testdir.parseconfigure("--tx=3*popen", )
|
||||
xspecs = NodeManager(config)._getxspecs()
|
||||
assert len(xspecs) == 3
|
||||
assert xspecs[1].popen
|
||||
@@ -60,10 +63,10 @@ class TestDistOptions:
|
||||
rsyncdirs= x
|
||||
""")
|
||||
config = testdir.parseconfigure(
|
||||
testdir.tmpdir, '--rsyncdir=y', '--rsyncdir=z')
|
||||
testdir.tmpdir, '--rsyncdir=y', '--rsyncdir=z')
|
||||
nm = NodeManager(config, specs=[execnet.XSpec("popen//chdir=xyz")])
|
||||
roots = nm._getrsyncdirs()
|
||||
#assert len(roots) == 3 + 1 # pylib
|
||||
# assert len(roots) == 3 + 1 # pylib
|
||||
assert py.path.local('y') in roots
|
||||
assert py.path.local('z') in roots
|
||||
assert testdir.tmpdir.join('x') in roots
|
||||
|
||||
@@ -7,6 +7,7 @@ import marshal
|
||||
|
||||
WAIT_TIMEOUT = 10.0
|
||||
|
||||
|
||||
def check_marshallable(d):
|
||||
try:
|
||||
marshal.dumps(d)
|
||||
@@ -14,12 +15,14 @@ def check_marshallable(d):
|
||||
py.std.pprint.pprint(d)
|
||||
raise ValueError("not marshallable")
|
||||
|
||||
|
||||
class EventCall:
|
||||
def __init__(self, eventcall):
|
||||
self.name, self.kwargs = eventcall
|
||||
|
||||
def __str__(self):
|
||||
return "<EventCall %s(**%s)>" %(self.name, self.kwargs)
|
||||
return "<EventCall %s(**%s)>" % (self.name, self.kwargs)
|
||||
|
||||
|
||||
class SlaveSetup:
|
||||
use_callback = False
|
||||
@@ -31,7 +34,7 @@ class SlaveSetup:
|
||||
|
||||
def setup(self, ):
|
||||
self.testdir.chdir()
|
||||
#import os ; os.environ['EXECNET_DEBUG'] = "2"
|
||||
# import os ; os.environ['EXECNET_DEBUG'] = "2"
|
||||
self.gateway = execnet.makegateway()
|
||||
self.config = config = self.testdir.parseconfigure()
|
||||
putevent = self.use_callback and self.events.put or None
|
||||
@@ -48,14 +51,16 @@ class SlaveSetup:
|
||||
ev = EventCall(data)
|
||||
if name is None or ev.name == name:
|
||||
return ev
|
||||
print("skipping %s" % (ev,))
|
||||
print("skipping %s" % (ev, ))
|
||||
|
||||
def sendcommand(self, name, **kwargs):
|
||||
self.slp.sendcommand(name, **kwargs)
|
||||
|
||||
|
||||
def pytest_funcarg__slave(request):
|
||||
return SlaveSetup(request)
|
||||
|
||||
|
||||
def test_remoteinitconfig(testdir):
|
||||
from xdist.remote import remote_initconfig
|
||||
config1 = testdir.parseconfig()
|
||||
@@ -63,6 +68,7 @@ def test_remoteinitconfig(testdir):
|
||||
assert config2.option.__dict__ == config1.option.__dict__
|
||||
assert config2.pluginmanager.getplugin("terminal") in (-1, None)
|
||||
|
||||
|
||||
class TestReportSerialization:
|
||||
def test_itemreport_outcomes(self, testdir):
|
||||
reprec = testdir.inline_runsource("""
|
||||
@@ -79,7 +85,7 @@ class TestReportSerialization:
|
||||
py.test.xfail("hello")
|
||||
""")
|
||||
reports = reprec.getreports("pytest_runtest_logreport")
|
||||
assert len(reports) == 17 # with setup/teardown "passed" reports
|
||||
assert len(reports) == 17 # with setup/teardown "passed" reports
|
||||
for rep in reports:
|
||||
d = serialize_report(rep)
|
||||
check_marshallable(d)
|
||||
@@ -158,7 +164,7 @@ class TestSlaveInteractor:
|
||||
ev = slave.popevent("logstart")
|
||||
assert ev.kwargs["nodeid"].endswith("test_func")
|
||||
assert len(ev.kwargs["location"]) == 3
|
||||
ev = slave.popevent("testreport") # setup
|
||||
ev = slave.popevent("testreport") # setup
|
||||
ev = slave.popevent("testreport")
|
||||
assert ev.name == "testreport"
|
||||
rep = unserialize_report(ev.name, ev.kwargs['data'])
|
||||
@@ -245,4 +251,3 @@ class TestSlaveInteractor:
|
||||
("pytest_pycollect_makeitem", "name == 'test_func'"),
|
||||
("pytest_collectreport", "report.collector.fspath == bbb"),
|
||||
])
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ from xdist.slavemanage import HostRSync, NodeManager
|
||||
|
||||
pytest_plugins = "pytester"
|
||||
|
||||
|
||||
def pytest_funcarg__hookrecorder(request, config):
|
||||
hookrecorder = HookRecorder(config.pluginmanager)
|
||||
if hasattr(hookrecorder, "start_recording"):
|
||||
@@ -14,23 +15,32 @@ def pytest_funcarg__hookrecorder(request, config):
|
||||
request.addfinalizer(hookrecorder.finish_recording)
|
||||
return hookrecorder
|
||||
|
||||
|
||||
def pytest_funcarg__config(testdir):
|
||||
return testdir.parseconfig()
|
||||
|
||||
|
||||
def pytest_funcarg__mysetup(tmpdir):
|
||||
class mysetup:
|
||||
source = tmpdir.mkdir("source")
|
||||
dest = tmpdir.mkdir("dest")
|
||||
|
||||
return mysetup()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def slavecontroller(monkeypatch):
|
||||
class MockController(object):
|
||||
def __init__(self, *args): pass
|
||||
def setup(self): pass
|
||||
def __init__(self, *args):
|
||||
pass
|
||||
|
||||
def setup(self):
|
||||
pass
|
||||
|
||||
monkeypatch.setattr(slavemanage, 'SlaveController', MockController)
|
||||
return MockController
|
||||
|
||||
|
||||
class TestNodeManagerPopen:
|
||||
def test_popen_no_default_chdir(self, config):
|
||||
gm = NodeManager(config, ["popen"])
|
||||
@@ -43,7 +53,8 @@ class TestNodeManagerPopen:
|
||||
for spec in NodeManager(config, l, defaultchdir="abc").specs:
|
||||
assert spec.chdir == "abc"
|
||||
|
||||
def test_popen_makegateway_events(self, config, hookrecorder, slavecontroller):
|
||||
def test_popen_makegateway_events(self, config, hookrecorder,
|
||||
slavecontroller):
|
||||
hm = NodeManager(config, ["popen"] * 2)
|
||||
hm.setup_nodes(None)
|
||||
call = hookrecorder.popcall("pytest_xdist_setupnodes")
|
||||
@@ -64,12 +75,16 @@ class TestNodeManagerPopen:
|
||||
hm.setup_nodes(None)
|
||||
assert len(hm.group) == 2
|
||||
for gw in hm.group:
|
||||
|
||||
class pseudoexec:
|
||||
args = []
|
||||
|
||||
def __init__(self, *args):
|
||||
self.args.extend(args)
|
||||
|
||||
def waitclose(self):
|
||||
pass
|
||||
|
||||
gw.remote_exec = pseudoexec
|
||||
l = []
|
||||
for gw in hm.group:
|
||||
@@ -95,8 +110,8 @@ class TestNodeManagerPopen:
|
||||
assert dest.join("dir1", "dir2").check()
|
||||
assert dest.join("dir1", "dir2", 'hello').check()
|
||||
|
||||
def test_rsync_same_popen_twice(self, config, mysetup,
|
||||
hookrecorder, slavecontroller):
|
||||
def test_rsync_same_popen_twice(self, config, mysetup, hookrecorder,
|
||||
slavecontroller):
|
||||
source, dest = mysetup.source, mysetup.dest
|
||||
hm = NodeManager(config, ["popen//chdir=%s" % dest] * 2)
|
||||
hm.roots = []
|
||||
@@ -110,6 +125,7 @@ class TestNodeManagerPopen:
|
||||
assert call.gateways[0] in hm.group
|
||||
call = hookrecorder.popcall("pytest_xdist_rsyncfinish")
|
||||
|
||||
|
||||
class TestHRSync:
|
||||
def test_hrsync_filter(self, mysetup):
|
||||
source, _ = mysetup.source, mysetup.dest # noqa
|
||||
@@ -118,8 +134,7 @@ class TestHRSync:
|
||||
source.ensure(".somedotfile", "moreentries")
|
||||
source.ensure("somedir", "editfile~")
|
||||
syncer = HostRSync(source, ignores=NodeManager.DEFAULT_IGNORES)
|
||||
l = list(source.visit(rec=syncer.filter,
|
||||
fil=syncer.filter))
|
||||
l = list(source.visit(rec=syncer.filter, fil=syncer.filter))
|
||||
assert len(l) == 3
|
||||
basenames = [x.basename for x in l]
|
||||
assert 'dir' in basenames
|
||||
@@ -145,7 +160,7 @@ class TestNodeManager:
|
||||
mysetup.source.ensure("dir1", "file1").write("hello")
|
||||
config = testdir.parseconfig(mysetup.source)
|
||||
nodemanager = NodeManager(config, ["popen//chdir=%s" % mysetup.dest])
|
||||
#assert nodemanager.config.topdir == source == config.topdir
|
||||
# assert nodemanager.config.topdir == source == config.topdir
|
||||
nodemanager.makegateways()
|
||||
nodemanager.rsync_roots()
|
||||
p, = nodemanager.gwmanager.multi_exec(
|
||||
@@ -164,10 +179,8 @@ class TestNodeManager:
|
||||
for rsyncroot in (dir1, source):
|
||||
dest.remove()
|
||||
nodemanager = NodeManager(testdir.parseconfig(
|
||||
"--tx", "popen//chdir=%s" % dest,
|
||||
"--rsyncdir", rsyncroot,
|
||||
source,
|
||||
))
|
||||
"--tx", "popen//chdir=%s" % dest, "--rsyncdir", rsyncroot,
|
||||
source, ))
|
||||
nodemanager.setup_nodes(None) # calls .rsync_roots()
|
||||
if rsyncroot == source:
|
||||
dest = dest.join("source")
|
||||
@@ -230,7 +243,8 @@ class TestNodeManager:
|
||||
assert not gwspec.chdir
|
||||
|
||||
def test_ssh_setup_nodes(self, specssh, testdir):
|
||||
testdir.makepyfile(__init__="", test_x="""
|
||||
testdir.makepyfile(__init__="",
|
||||
test_x="""
|
||||
def test_one():
|
||||
pass
|
||||
""")
|
||||
|
||||
Reference in New Issue
Block a user