def test_testnodedown_causes_reschedule_pending(self, testdir): modcol = testdir.getmodulecol(""" def test_crash(): assert 0 def test_fail(): x """) item1, item2 = modcol.collect() # setup a session with two nodes session = DSession(item1.config) node1, node2 = MockNode(), MockNode() session.addnode(node1) session.addnode(node2) # have one test pending for a node that goes down session.senditems_load([item1, item2]) node = session.item2nodes[item1][0] item1.config.option.dist = "load" session.queueevent("pytest_testnodedown", node=node, error="xyz") reprec = testdir.getreportrecorder(session) print session.item2nodes loopstate = session._initloopstate([]) session.loop_once(loopstate) assert loopstate.colitems == [item2] # do not reschedule crash item rep = reprec.matchreport(names="pytest_runtest_logreport") assert rep.failed assert rep.item == item1 assert str(rep.longrepr).find("crashed") != -1
def test_nopending_but_collection_remains(self, testdir): modcol = testdir.getmodulecol(""" def test_fail(): assert 0 def test_pass(): pass """) session = DSession(modcol.config) node = MockNode() session.addnode(node) colreport = modcol.config.hook.pytest_make_collect_report( collector=modcol) item1, item2 = colreport.result session.senditems_load([item1]) # node2pending will become empty when the loop sees the report rep = run(item1, node) session.queueevent("pytest_runtest_logreport", report=run(item1, node)) # but we have a collection pending session.queueevent("pytest_collectreport", report=colreport) loopstate = session._initloopstate([]) session.loop_once(loopstate) assert loopstate.exitstatus is None, "loop did not care for collection report" assert not loopstate.colitems session.loop_once(loopstate) assert loopstate.colitems == colreport.result assert loopstate.exitstatus is None, "loop did not care for colitems"
def test_nopending_but_collection_remains(self, testdir): modcol = testdir.getmodulecol(""" def test_fail(): assert 0 def test_pass(): pass """) session = DSession(modcol.config) node = MockNode() session.addnode(node) colreport = basic_collect_report(modcol) item1, item2 = colreport.result session.senditems_load([item1]) # node2pending will become empty when the loop sees the report rep = run(item1, node) session.queueevent("itemtestreport", run(item1, node)) # but we have a collection pending session.queueevent("collectionreport", colreport) loopstate = session._initloopstate([]) session.loop_once(loopstate) assert loopstate.exitstatus is None, "loop did not care for collection report" assert not loopstate.colitems session.loop_once(loopstate) assert loopstate.colitems == colreport.result assert loopstate.exitstatus is None, "loop did not care for colitems"
def test_testnodedown_causes_reschedule_pending(self, testdir, EventRecorder): modcol = testdir.getmodulecol(""" def test_crash(): assert 0 def test_fail(): x """) item1, item2 = modcol.collect() # setup a session with two nodes session = DSession(item1.config) node1, node2 = MockNode(), MockNode() session.addnode(node1) session.addnode(node2) # have one test pending for a node that goes down session.senditems_load([item1, item2]) node = session.item2nodes[item1] [0] session.queueevent("testnodedown", node, None) evrec = EventRecorder(session.bus) print session.item2nodes loopstate = session._initloopstate([]) session.loop_once(loopstate) assert loopstate.colitems == [item2] # do not reschedule crash item testrep = evrec.getfirstnamed("itemtestreport") assert testrep.failed assert testrep.colitem == item1 assert str(testrep.longrepr).find("crashed") != -1
def test_senditems_load_and_receive_one_node(self, testdir): item = testdir.getitem("def test_func(): pass") node = MockNode() rep = run(item, node) session = DSession(item.config) session.addnode(node) session.senditems_load([item]) assert session.node2pending[node] == [item] assert session.item2nodes[item] == [node] session.removeitem(item, node) assert not session.node2pending[node] assert not session.item2nodes
def test_senditems_load_and_receive_one_node(self, testdir): item = testdir.getitem("def test_func(): pass") node = MockNode() rep = run(item, node) session = DSession(item.config) session.addnode(node) session.senditems_load([item]) assert session.node2pending[node] == [item] assert session.item2nodes[item] == [node] session.removeitem(item, node) assert not session.node2pending[node] assert not session.item2nodes
def test_add_remove_node(self, testdir): item = testdir.getitem("def test_func(): pass") node = MockNode() rep = run(item, node) session = DSession(item.config) assert not session.node2pending session.addnode(node) assert len(session.node2pending) == 1 session.senditems_load([item]) pending = session.removenode(node) assert pending == [item] assert item not in session.item2nodes l = session.removenode(node) assert not l
def test_add_remove_node(self, testdir): item = testdir.getitem("def test_func(): pass") node = MockNode() rep = run(item, node) session = DSession(item.config) assert not session.node2pending session.addnode(node) assert len(session.node2pending) == 1 session.senditems_load([item]) pending = session.removenode(node) assert pending == [item] assert item not in session.item2nodes l = session.removenode(node) assert not l
def test_testnodedown_shutdown_after_completion(self, testdir): item = testdir.getitem("def test_func(): pass") session = DSession(item.config) node = MockNode() session.addnode(node) session.senditems_load([item]) session.queueevent("pytest_runtest_logreport", report=run(item, node)) loopstate = session._initloopstate([]) session.loop_once(loopstate) assert node._shutdown is True assert loopstate.exitstatus is None, "loop did not wait for testnodedown" assert loopstate.shuttingdown session.queueevent("pytest_testnodedown", node=node, error=None) session.loop_once(loopstate) assert loopstate.exitstatus == 0
def test_testnodedown_shutdown_after_completion(self, testdir): item = testdir.getitem("def test_func(): pass") session = DSession(item.config) node = MockNode() session.addnode(node) session.senditems_load([item]) session.queueevent("itemtestreport", run(item, node)) loopstate = session._initloopstate([]) session.loop_once(loopstate) assert node._shutdown is True assert loopstate.exitstatus is None, "loop did not wait for testnodedown" assert loopstate.shuttingdown session.queueevent("testnodedown", node, None) session.loop_once(loopstate) assert loopstate.exitstatus == 0