def testPidFile(self):
    pidfile = os.path.join(self.tmpdir, "pid")
    checkfile = os.path.join(self.tmpdir, "abort")

    pid = utils.StartDaemon("while sleep 5; do :; done", pidfile=pidfile,
                            output=self.tmpfile)
    try:
      fd = os.open(pidfile, os.O_RDONLY)
      try:
        # Check file is locked
        self.assertRaises(errors.LockError, utils.LockFile, fd)

        pidtext = os.read(fd, 100)
      finally:
        os.close(fd)

      self.assertEqual(int(pidtext.strip()), pid)

      self.assert_(utils.IsProcessAlive(pid))
    finally:
      # No matter what happens, kill daemon
      utils.KillProcess(pid, timeout=5.0, waitpid=False)
      self.failIf(utils.IsProcessAlive(pid))

    self.assertEqual(utils.ReadFile(self.tmpfile), "")
예제 #2
0
    def testKill(self):
        pid_file = self.f_dpn("child")
        r_fd, w_fd = os.pipe()
        new_pid = os.fork()
        if new_pid == 0:  #child
            utils.WritePidFile(self.f_dpn("child"))
            os.write(w_fd, "a")
            signal.pause()
            os._exit(0)
            return
        # else we are in the parent
        # wait until the child has written the pid file
        os.read(r_fd, 1)
        read_pid = utils.ReadPidFile(pid_file)
        self.failUnlessEqual(read_pid, new_pid)
        self.failUnless(utils.IsProcessAlive(new_pid))

        # Try writing to locked file
        try:
            utils.WritePidFile(pid_file)
        except errors.PidFileLockError as err:
            errmsg = str(err)
            self.assertTrue(errmsg.endswith(" %s" % new_pid),
                            msg=("Error message ('%s') didn't contain correct"
                                 " PID (%s)" % (errmsg, new_pid)))
        else:
            self.fail("Writing to locked file didn't fail")

        utils.KillProcess(new_pid, waitpid=True)
        self.failIf(utils.IsProcessAlive(new_pid))
        utils.RemoveFile(self.f_dpn("child"))
        self.failUnlessRaises(errors.ProgrammerError, utils.KillProcess, 0)
예제 #3
0
 def testPidFileFunctions(self):
     pid_file = self.f_dpn("test")
     fd = utils.WritePidFile(self.f_dpn("test"))
     self.failUnless(os.path.exists(pid_file),
                     "PID file should have been created")
     read_pid = utils.ReadPidFile(pid_file)
     self.failUnlessEqual(read_pid, os.getpid())
     self.failUnless(utils.IsProcessAlive(read_pid))
     self.failUnlessRaises(errors.PidFileLockError, utils.WritePidFile,
                           self.f_dpn("test"))
     os.close(fd)
     utils.RemoveFile(self.f_dpn("test"))
     self.failIf(os.path.exists(pid_file),
                 "PID file should not exist anymore")
     self.failUnlessEqual(
         utils.ReadPidFile(pid_file), 0,
         "ReadPidFile should return 0 for missing pid file")
     fh = open(pid_file, "w")
     fh.write("blah\n")
     fh.close()
     self.failUnlessEqual(
         utils.ReadPidFile(pid_file), 0,
         "ReadPidFile should return 0 for invalid pid file")
     # but now, even with the file existing, we should be able to lock it
     fd = utils.WritePidFile(self.f_dpn("test"))
     os.close(fd)
     utils.RemoveFile(self.f_dpn("test"))
     self.failIf(os.path.exists(pid_file),
                 "PID file should not exist anymore")
 def testNotExisting(self):
   pid_non_existing = os.fork()
   if pid_non_existing == 0:
     os._exit(0)
   elif pid_non_existing < 0:
     raise SystemError("can't fork")
   os.waitpid(pid_non_existing, 0)
   self.assertFalse(utils.IsProcessAlive(pid_non_existing),
                    "nonexisting process detected")
 def testExists(self):
   mypid = os.getpid()
   self.assert_(utils.IsProcessAlive(mypid), "can't find myself running")
예제 #6
0
        self.failUnlessEqual(read_pid, new_pid)
        self.failUnless(utils.IsProcessAlive(new_pid))

        # Try writing to locked file
        try:
            utils.WritePidFile(pid_file)
        except errors.PidFileLockError, err:
            errmsg = str(err)
            self.assertTrue(errmsg.endswith(" %s" % new_pid),
                            msg=("Error message ('%s') didn't contain correct"
                                 " PID (%s)" % (errmsg, new_pid)))
        else:
            self.fail("Writing to locked file didn't fail")

        utils.KillProcess(new_pid, waitpid=True)
        self.failIf(utils.IsProcessAlive(new_pid))
        utils.RemoveFile(self.f_dpn("child"))
        self.failUnlessRaises(errors.ProgrammerError, utils.KillProcess, 0)

    def testExceptionType(self):
        # Make sure the PID lock error is a subclass of LockError in case some code
        # depends on it
        self.assertTrue(issubclass(errors.PidFileLockError, errors.LockError))

    def tearDown(self):
        shutil.rmtree(self.dir)


class TestNewUUID(unittest.TestCase):
    """Test case for NewUUID"""
    def runTest(self):