Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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"
Exemplo n.º 3
0
    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"
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
 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 
Exemplo n.º 9
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("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
Exemplo n.º 10
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