[py-svn] r63160 - in py/trunk/py/test/dsession: . testing
hpk at codespeak.net
hpk at codespeak.net
Fri Mar 20 22:19:04 CET 2009
Author: hpk
Date: Fri Mar 20 22:19:03 2009
New Revision: 63160
Added:
py/trunk/py/test/dsession/testing/test_txnode.py
- copied, changed from r63154, py/trunk/py/test/dsession/testing/test_masterslave.py
py/trunk/py/test/dsession/txnode.py
- copied, changed from r63153, py/trunk/py/test/dsession/masterslave.py
Removed:
py/trunk/py/test/dsession/masterslave.py
py/trunk/py/test/dsession/testing/test_masterslave.py
Modified:
py/trunk/py/test/dsession/nodemanage.py
py/trunk/py/test/dsession/testing/test_functional_dsession.py
Log:
rename masterslave -> txnode
Deleted: /py/trunk/py/test/dsession/masterslave.py
==============================================================================
--- /py/trunk/py/test/dsession/masterslave.py Fri Mar 20 22:19:03 2009
+++ (empty file)
@@ -1,123 +0,0 @@
-"""
- Manage setup, running and local representation of remote nodes/processes.
-"""
-import py
-from py.__.test import event
-from py.__.test.dsession.mypickle import PickleChannel
-
-class MasterNode(object):
- """ Install slave code, manage sending test tasks & receiving results """
- ENDMARK = -1
-
- def __init__(self, gateway, config, putevent):
- self.config = config
- self.putevent = putevent
- self.gateway = gateway
- self.channel = install_slave(gateway, config)
- self.channel.setcallback(self.callback, endmarker=self.ENDMARK)
- self._down = False
-
- def notify(self, eventname, *args, **kwargs):
- self.putevent((eventname, args, kwargs))
-
- def callback(self, eventcall):
- """ this gets called for each object we receive from
- the other side and if the channel closes.
-
- Note that channel callbacks run in the receiver
- thread of execnet gateways - we need to
- avoid raising exceptions or doing heavy work.
- """
- try:
- if eventcall == self.ENDMARK:
- err = self.channel._getremoteerror()
- if not self._down:
- if not err:
- err = "Not properly terminated"
- self.notify("testnodedown", self, err)
- self._down = True
- return
- eventname, args, kwargs = eventcall
- if eventname == "slaveready":
- self.notify("testnodeready", self)
- elif eventname == "slavefinished":
- self._down = True
- self.notify("testnodedown", self, None)
- else:
- self.notify(eventname, *args, **kwargs)
- except KeyboardInterrupt:
- # should not land in receiver-thread
- raise
- except:
- excinfo = py.code.ExceptionInfo()
- print "!" * 20, excinfo
- self.notify("internalerror", event.InternalException(excinfo))
-
- def send(self, item):
- assert item is not None
- self.channel.send(item)
-
- def sendlist(self, itemlist):
- self.channel.send(itemlist)
-
- def shutdown(self):
- self.channel.send(None)
-
-# setting up slave code
-def install_slave(gateway, config):
- channel = gateway.remote_exec(source="""
- from py.__.test.dsession.mypickle import PickleChannel
- from py.__.test.dsession.masterslave import SlaveNode
- channel = PickleChannel(channel)
- slavenode = SlaveNode(channel)
- slavenode.run()
- """)
- channel = PickleChannel(channel)
- basetemp = None
- if gateway.spec.popen:
- popenbase = config.ensuretemp("popen")
- basetemp = py.path.local.make_numbered_dir(prefix="slave-",
- keep=0, rootdir=popenbase)
- basetemp = str(basetemp)
- channel.send((config, basetemp))
- return channel
-
-class SlaveNode(object):
- def __init__(self, channel):
- self.channel = channel
-
- def __repr__(self):
- return "<%s channel=%s>" %(self.__class__.__name__, self.channel)
-
- def sendevent(self, eventname, *args, **kwargs):
- self.channel.send((eventname, args, kwargs))
-
- def run(self):
- channel = self.channel
- self.config, basetemp = channel.receive()
- if basetemp:
- self.config.basetemp = py.path.local(basetemp)
- self.config.pytestplugins.do_configure(self.config)
- self.sendevent("slaveready")
- try:
- while 1:
- task = channel.receive()
- if task is None:
- self.sendevent("slavefinished")
- break
- if isinstance(task, list):
- for item in task:
- self.runtest(item)
- else:
- self.runtest(task)
- except KeyboardInterrupt:
- raise
- except:
- self.sendevent("internalerror", event.InternalException())
- raise
-
- def runtest(self, item):
- runner = item._getrunner()
- testrep = runner(item)
- self.sendevent("itemtestreport", testrep)
-
Modified: py/trunk/py/test/dsession/nodemanage.py
==============================================================================
--- py/trunk/py/test/dsession/nodemanage.py (original)
+++ py/trunk/py/test/dsession/nodemanage.py Fri Mar 20 22:19:03 2009
@@ -1,8 +1,7 @@
import py
import sys, os
-from py.__.test.dsession.masterslave import MasterNode
+from py.__.test.dsession.txnode import MasterNode
from py.__.execnet.gwmanage import GatewayManager
-from py.__.test import event
class NodeManager(object):
Modified: py/trunk/py/test/dsession/testing/test_functional_dsession.py
==============================================================================
--- py/trunk/py/test/dsession/testing/test_functional_dsession.py (original)
+++ py/trunk/py/test/dsession/testing/test_functional_dsession.py Fri Mar 20 22:19:03 2009
@@ -1,6 +1,6 @@
import py
from py.__.test.dsession.dsession import DSession
-from test_masterslave import EventQueue
+from test_txnode import EventQueue
class TestAsyncFunctional:
def test_conftest_options(self, testdir):
Deleted: /py/trunk/py/test/dsession/testing/test_masterslave.py
==============================================================================
--- /py/trunk/py/test/dsession/testing/test_masterslave.py Fri Mar 20 22:19:03 2009
+++ (empty file)
@@ -1,145 +0,0 @@
-
-import py
-from py.__.test.dsession.masterslave import MasterNode
-
-class EventQueue:
- def __init__(self, bus, queue=None):
- if queue is None:
- queue = py.std.Queue.Queue()
- self.queue = queue
- bus.register(self)
-
- def pyevent(self, eventname, *args, **kwargs):
- self.queue.put((eventname, args, kwargs))
-
- def geteventargs(self, eventname, timeout=2.0):
- events = []
- while 1:
- try:
- eventcall = self.queue.get(timeout=timeout)
- except py.std.Queue.Empty:
- #print "node channel", self.node.channel
- #print "remoteerror", self.node.channel._getremoteerror()
- print "seen events", events
- raise IOError("did not see %r events" % (eventname))
- else:
- name, args, kwargs = eventcall
- assert isinstance(name, str)
- if name == eventname:
- return args
- events.append(name)
-
-class MySetup:
- def __init__(self, pyfuncitem):
- self.pyfuncitem = pyfuncitem
-
- def geteventargs(self, eventname, timeout=2.0):
- eq = EventQueue(self.config.bus, self.queue)
- return eq.geteventargs(eventname, timeout=timeout)
-
- def makenode(self, config=None):
- if config is None:
- config = py.test.config._reparse([])
- self.config = config
- self.queue = py.std.Queue.Queue()
- self.xspec = py.execnet.XSpec("popen")
- self.gateway = py.execnet.makegateway(self.xspec)
- self.node = MasterNode(self.gateway, self.config, putevent=self.queue.put)
- assert not self.node.channel.isclosed()
- return self.node
-
- def finalize(self):
- if hasattr(self, 'node'):
- gw = self.node.gateway
- print "exiting:", gw
- gw.exit()
-
-def pytest_pyfuncarg_mysetup(pyfuncitem):
- mysetup = MySetup(pyfuncitem)
- pyfuncitem.addfinalizer(mysetup.finalize)
- return mysetup
-
-def pytest_pyfuncarg_testdir(__call__, pyfuncitem):
- # decorate to make us always change to testdir
- testdir = __call__.execute(firstresult=True)
- testdir.chdir()
- return testdir
-
-def test_node_hash_equality(mysetup):
- node = mysetup.makenode()
- node2 = mysetup.makenode()
- assert node != node2
- assert node == node
- assert not (node != node)
-
-class TestMasterSlaveConnection:
- def test_crash_invalid_item(self, mysetup):
- node = mysetup.makenode()
- node.send(123) # invalid item
- n, error = mysetup.geteventargs("testnodedown")
- assert n is node
- assert str(error).find("AttributeError") != -1
-
- def test_crash_killed(self, testdir, mysetup):
- if not hasattr(py.std.os, 'kill'):
- py.test.skip("no os.kill")
- item = testdir.getitem("""
- def test_func():
- import os
- os.kill(os.getpid(), 15)
- """)
- node = mysetup.makenode(item.config)
- node.send(item)
- n, error = mysetup.geteventargs("testnodedown")
- assert n is node
- assert str(error).find("Not properly terminated") != -1
-
- def test_node_down(self, mysetup):
- node = mysetup.makenode()
- node.shutdown()
- n, error = mysetup.geteventargs("testnodedown")
- assert n is node
- assert not error
- node.callback(node.ENDMARK)
- excinfo = py.test.raises(IOError,
- "mysetup.geteventargs('testnodedown', timeout=0.01)")
-
- def test_send_on_closed_channel(self, testdir, mysetup):
- item = testdir.getitem("def test_func(): pass")
- node = mysetup.makenode(item.config)
- node.channel.close()
- py.test.raises(IOError, "node.send(item)")
- #ev = self.geteventargs(event.InternalException)
- #assert ev.excinfo.errisinstance(IOError)
-
- def test_send_one(self, testdir, mysetup):
- item = testdir.getitem("def test_func(): pass")
- node = mysetup.makenode(item.config)
- node.send(item)
- ev, = mysetup.geteventargs("itemtestreport")
- assert ev.passed
- assert ev.colitem == item
- #assert event.item == item
- #assert event.item is not item
-
- def test_send_some(self, testdir, mysetup):
- items = testdir.getitems("""
- def test_pass():
- pass
- def test_fail():
- assert 0
- def test_skip():
- import py
- py.test.skip("x")
- """)
- node = mysetup.makenode(items[0].config)
- for item in items:
- node.send(item)
- for outcome in "passed failed skipped".split():
- ev, = mysetup.geteventargs("itemtestreport")
- assert getattr(ev, outcome)
-
- node.sendlist(items)
- for outcome in "passed failed skipped".split():
- ev, = mysetup.geteventargs("itemtestreport")
- assert getattr(ev, outcome)
Copied: py/trunk/py/test/dsession/testing/test_txnode.py (from r63154, py/trunk/py/test/dsession/testing/test_masterslave.py)
==============================================================================
--- py/trunk/py/test/dsession/testing/test_masterslave.py (original)
+++ py/trunk/py/test/dsession/testing/test_txnode.py Fri Mar 20 22:19:03 2009
@@ -1,6 +1,6 @@
import py
-from py.__.test.dsession.masterslave import MasterNode
+from py.__.test.dsession.txnode import MasterNode
class EventQueue:
def __init__(self, bus, queue=None):
Copied: py/trunk/py/test/dsession/txnode.py (from r63153, py/trunk/py/test/dsession/masterslave.py)
==============================================================================
--- py/trunk/py/test/dsession/masterslave.py (original)
+++ py/trunk/py/test/dsession/txnode.py Fri Mar 20 22:19:03 2009
@@ -67,7 +67,7 @@
def install_slave(gateway, config):
channel = gateway.remote_exec(source="""
from py.__.test.dsession.mypickle import PickleChannel
- from py.__.test.dsession.masterslave import SlaveNode
+ from py.__.test.dsession.txnode import SlaveNode
channel = PickleChannel(channel)
slavenode = SlaveNode(channel)
slavenode.run()
More information about the pytest-commit
mailing list