[Zodb-checkins] CVS: Zope/lib/python/zdaemon/tests - __init__.py:1.1 testDaemon.py:1.1

Jeremy Hylton jeremy@zope.com
Mon, 22 Apr 2002 18:09:27 -0400


Update of /cvs-repository/Zope/lib/python/zdaemon/tests
In directory cvs.zope.org:/tmp/cvs-serv17942/tests

Added Files:
	__init__.py testDaemon.py 
Log Message:
Improve error reporting when child exits or is killed by a signal.

Report explicitly what happened and include either the exit status or
the signal number.

XXX Not sure what to do if the process is just stopped.  The previous
version of the code treated it as an error.  This version doesn't
change that but does log a message saying its stopped.

XXX Not sure how to report whether a core was created.  The old code
did this implicitly if the platform/C library supported it.



=== Added File Zope/lib/python/zdaemon/tests/__init__.py ===


=== Added File Zope/lib/python/zdaemon/tests/testDaemon.py ===
# This file contains unit tests and a simple script that is explicitly
# invoked by the tests.  The script block goes first so that I don't
# have to bother getting the imports right.

# The script just kills itself or exits in a variety of ways.
import os
import sys

if __name__ == "__main__":

    arg = sys.argv[1]
    if arg == "signal":
        import signal
        f = open("/tmp/%d" % os.getpid(), "w")
        f.write("x")
        f.close()
        os.kill(os.getpid(), signal.SIGKILL)
    elif arg == "exit":
        os._exit(2)
    os._exit(0)    

# The rest is unittest stuff that can be run by testrunner.py.

import unittest
import zdaemon
import zdaemon.tests
import zdaemon.Daemon
import zdaemon.ZDaemonLogging
import zLOG

class TestDoneError(RuntimeError):
    pass

def pstamp(message, sev):
    zdaemon.ZDaemonLogging.pstamp(message, sev)
    if sev >= zLOG.ERROR:
        raise TestDoneError(message)

zdaemon.Daemon.pstamp = pstamp

class DaemonTest(unittest.TestCase):

    dir, file = os.path.split(zdaemon.tests.__file__)
    script = os.path.join(dir, "testDaemon.py")

    def setUp(self):
        os.environ["Z_DEBUG_MODE"] = ""
        if os.environ.has_key("ZDAEMON_MANAGED"):
            del os.environ["ZDAEMON_MANAGED"]

    def tearDown(self):
        pass

    def run(self, arg):
        try:
            zdaemon.run((self.script, arg))
        except SystemExit:
            pass

    def testDeathBySignal(self):
        try:
            self.run("signal")
        except TestDoneError, msg:
            self.assert_(str(msg).find("terminated by signal") != -1)
        else:
            self.fail("signal was not caught")

    def testDeathByExit(self):
        try:
            self.run("exit")
        except TestDoneError, msg:
            self.assert_(str(msg).find("exit status") != -1)
        else:
            self.fail("exit didn't raise an exception")

def test_suite():
    return unittest.makeSuite(DaemonTest)