# 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():
    if hasattr(os, 'setsid'):
        return unittest.makeSuite(DaemonTest)
    else:
        return None
