Exemplo n.º 1
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.º 2
0
    def test_exit_on_first_failing(self, testdir):
        modcol = testdir.getmodulecol("""
            def test_fail(): 
                assert 0
            def test_pass(): 
                pass
        """)
        modcol.config.option.exitfirst = True
        session = DSession(modcol.config)
        node = MockNode()
        session.addnode(node)
        items = modcol.config.hook.pytest_make_collect_report(
            collector=modcol).result

        # trigger testing  - this sends tests to the node
        session.triggertesting(items)

        # run tests ourselves and produce reports
        ev1 = run(items[0], node, "fail")
        ev2 = run(items[1], node, None)
        session.queueevent("pytest_runtest_logreport",
                           report=ev1)  # a failing one
        session.queueevent("pytest_runtest_logreport", report=ev2)
        # now call the loop
        loopstate = session._initloopstate(items)
        session.loop_once(loopstate)
        assert loopstate.testsfailed
        assert loopstate.shuttingdown
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 = 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.º 4
0
    def test_exit_on_first_failing(self, testdir):
        modcol = testdir.getmodulecol("""
            def test_fail(): 
                assert 0
            def test_pass(): 
                pass
        """)
        modcol.config.option.exitfirst = True
        session = DSession(modcol.config)
        node = MockNode()
        session.addnode(node)
        items = basic_collect_report(modcol).result

        # trigger testing  - this sends tests to the node
        session.triggertesting(items)

        # run tests ourselves and produce reports 
        ev1 = run(items[0], node)
        ev2 = run(items[1], node)
        session.queueevent("itemtestreport", ev1) # a failing one
        session.queueevent("itemtestreport", ev2)
        # now call the loop
        loopstate = session._initloopstate(items)
        session.loop_once(loopstate)
        assert loopstate.testsfailed
        assert loopstate.shuttingdown
Exemplo n.º 5
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.º 6
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.º 7
0
 def test_event_propagation(self, testdir, EventRecorder):
     item = testdir.getitem("def test_func(): pass")
     session = DSession(item.config)
   
     evrec = EventRecorder(session.bus)
     session.queueevent("NOPevent", 42)
     session.loop_once(session._initloopstate([]))
     assert evrec.getfirstnamed('NOPevent')
Exemplo n.º 8
0
 def test_testnodeready_adds_to_available(self, testdir):
     item = testdir.getitem("def test_func(): pass")
     # setup a session with two nodes
     session = DSession(item.config)
     node1 = MockNode()
     session.queueevent("pytest_testnodeready", node=node1)
     loopstate = session._initloopstate([item])
     loopstate.dowork = False
     assert len(session.node2pending) == 0
     session.loop_once(loopstate)
     assert len(session.node2pending) == 1
Exemplo n.º 9
0
 def test_testnodeready_adds_to_available(self, testdir):
     item = testdir.getitem("def test_func(): pass")
     # setup a session with two nodes
     session = DSession(item.config)
     node1 = MockNode()
     session.queueevent("testnodeready", node1)
     loopstate = session._initloopstate([item])
     loopstate.dowork = False
     assert len(session.node2pending) == 0
     session.loop_once(loopstate)
     assert len(session.node2pending) == 1
Exemplo n.º 10
0
 def test_shuttingdown_filters(self, testdir):
     item = testdir.getitem("def test_func(): pass")
     session = DSession(item.config)
     node = MockNode()
     session.addnode(node)
     loopstate = session._initloopstate([])
     loopstate.shuttingdown = True
     reprec = testdir.getreportrecorder(session)
     session.queueevent("pytest_runtest_logreport", report=run(item, node))
     session.loop_once(loopstate)
     assert not reprec.getcalls("pytest_testnodedown")
     session.queueevent("pytest_testnodedown", node=node, error=None)
     session.loop_once(loopstate)
     assert reprec.getcall('pytest_testnodedown').node == node
Exemplo n.º 11
0
 def test_shuttingdown_filters_events(self, testdir, EventRecorder):
     item = testdir.getitem("def test_func(): pass")
     session = DSession(item.config)
     node = MockNode()
     session.addnode(node)
     loopstate = session._initloopstate([])
     loopstate.shuttingdown = True
     evrec = EventRecorder(session.bus)
     session.queueevent("itemtestreport", run(item, node))
     session.loop_once(loopstate)
     assert not evrec.getfirstnamed("testnodedown")
     session.queueevent("testnodedown", node, None)
     session.loop_once(loopstate)
     assert evrec.getfirstnamed('testnodedown') == node
Exemplo n.º 12
0
    def test_no_node_remaining_for_tests(self, testdir):
        item = testdir.getitem("def test_func(): pass")
        # setup a session with one node
        session = DSession(item.config)
        node = MockNode()
        session.addnode(node)

        # setup a HostDown event
        session.queueevent("pytest_testnodedown", node=node, error=None)

        loopstate = session._initloopstate([item])
        loopstate.dowork = False
        session.loop_once(loopstate)
        dumpqueue(session.queue)
        assert loopstate.exitstatus == outcome.EXIT_NOHOSTS
Exemplo n.º 13
0
    def test_no_node_remaining_for_tests(self, testdir):
        item = testdir.getitem("def test_func(): pass")
        # setup a session with one node
        session = DSession(item.config)
        node = MockNode()
        session.addnode(node)
       
        # setup a HostDown event
        session.queueevent("testnodedown", node, None)

        loopstate = session._initloopstate([item])
        loopstate.dowork = False
        session.loop_once(loopstate)
        dumpqueue(session.queue)
        assert loopstate.exitstatus == outcome.EXIT_NOHOSTS
Exemplo n.º 14
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
Exemplo n.º 15
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.º 16
0
    def runthrough(self, item, excinfo=None):
        session = DSession(item.config)
        node = MockNode()
        session.addnode(node)
        loopstate = session._initloopstate([item])

        session.queueevent(None)
        session.loop_once(loopstate)

        assert node.sent == [[item]]
        ev = run(item, node, excinfo=excinfo)
        session.queueevent("pytest_runtest_logreport", report=ev)
        session.loop_once(loopstate)
        assert loopstate.shuttingdown
        session.queueevent("pytest_testnodedown", node=node, error=None)
        session.loop_once(loopstate)
        dumpqueue(session.queue)
        return session, loopstate.exitstatus
Exemplo n.º 17
0
    def runthrough(self, item):
        session = DSession(item.config)
        node = MockNode()
        session.addnode(node)
        loopstate = session._initloopstate([item])

        session.queueevent("NOP")
        session.loop_once(loopstate)

        assert node.sent == [[item]]
        ev = run(item, node)
        session.queueevent("itemtestreport", ev)
        session.loop_once(loopstate)
        assert loopstate.shuttingdown  
        session.queueevent("testnodedown", node, None)
        session.loop_once(loopstate)
        dumpqueue(session.queue)
        return session, loopstate.exitstatus 
Exemplo n.º 18
0
 def test_rescheduleevent(self, testdir):
     item = testdir.getitem("def test_func(): pass")
     session = DSession(item.config)
     node = MockNode()
     session.addnode(node)
     loopstate = session._initloopstate([])
     session.queueevent("pytest_rescheduleitems", items=[item])
     session.loop_once(loopstate)
     # check that RescheduleEvents are not immediately
     # rescheduled if there are no nodes
     assert loopstate.dowork == False
     session.queueevent(None)
     session.loop_once(loopstate)
     session.queueevent(None)
     session.loop_once(loopstate)
     assert node.sent == [[item]]
     session.queueevent("pytest_runtest_logreport", report=run(item, node))
     session.loop_once(loopstate)
     assert loopstate.shuttingdown
     assert not loopstate.testsfailed
Exemplo n.º 19
0
 def test_rescheduleevent(self, testdir):
     item = testdir.getitem("def test_func(): pass")
     session = DSession(item.config)
     node = MockNode()
     session.addnode(node)
     ev = event.RescheduleItems([item])
     loopstate = session._initloopstate([])
     session.queueevent("rescheduleitems", ev)
     session.loop_once(loopstate)
     # check that RescheduleEvents are not immediately
     # rescheduled if there are no nodes
     assert loopstate.dowork == False 
     session.queueevent("anonymous", event.NOP())
     session.loop_once(loopstate)
     session.queueevent("anonymous", event.NOP())
     session.loop_once(loopstate)
     assert node.sent == [[item]]
     session.queueevent("itemtestreport", run(item, node))
     session.loop_once(loopstate)
     assert loopstate.shuttingdown 
     assert not loopstate.testsfailed 
Exemplo n.º 20
0
    def test_removeitem_from_failing_teardown(self, testdir):
        # teardown reports only come in when they signal a failure
        # internal session-management should basically ignore them
        # XXX probably it'S best to invent a new error hook for
        # teardown/setup related failures
        modcol = testdir.getmodulecol("""
            def test_one(): 
                pass 
            def teardown_function(function):
                assert 0
        """)
        item1, = 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_each([item1])
        nodes = session.item2nodes[item1]

        class rep:
            failed = True
            item = item1
            node = nodes[0]
            when = "call"

        session.queueevent("pytest_runtest_logreport", report=rep)
        reprec = testdir.getreportrecorder(session)
        print session.item2nodes
        loopstate = session._initloopstate([])
        assert len(session.item2nodes[item1]) == 2
        session.loop_once(loopstate)
        assert len(session.item2nodes[item1]) == 1
        rep.when = "teardown"
        session.queueevent("pytest_runtest_logreport", report=rep)
        session.loop_once(loopstate)
        assert len(session.item2nodes[item1]) == 1