| import os |
| import sys |
| import unittest |
| import psutil |
| |
| here = os.path.dirname(os.path.abspath(__file__)) |
| |
| |
| class ProcTest(unittest.TestCase): |
| |
| @classmethod |
| def setUpClass(cls): |
| cls.proclaunch = os.path.join(here, "proclaunch.py") |
| cls.python = sys.executable |
| |
| def determine_status(self, proc, isalive=False, expectedfail=()): |
| """ |
| Use to determine if the situation has failed. |
| Parameters: |
| proc -- the processhandler instance |
| isalive -- Use True to indicate we pass if the process exists; however, by default |
| the test will pass if the process does not exist (isalive == False) |
| expectedfail -- Defaults to [], used to indicate a list of fields that are expected to fail |
| """ |
| returncode = proc.proc.returncode |
| didtimeout = proc.didTimeout |
| detected = psutil.pid_exists(proc.pid) |
| output = '' |
| # ProcessHandler has output when store_output is set to True in the constructor |
| # (this is the default) |
| if getattr(proc, 'output'): |
| output = proc.output |
| |
| if 'returncode' in expectedfail: |
| self.assertTrue(returncode, "Detected an unexpected return code of: %s" % returncode) |
| elif isalive: |
| self.assertEqual(returncode, None, "Detected not None return code of: %s" % returncode) |
| else: |
| self.assertNotEqual(returncode, None, "Detected unexpected None return code of") |
| |
| if 'didtimeout' in expectedfail: |
| self.assertTrue(didtimeout, "Detected that process didn't time out") |
| else: |
| self.assertTrue(not didtimeout, "Detected that process timed out") |
| |
| if isalive: |
| self.assertTrue(detected, "Detected process is not running, process output: %s" % output) |
| else: |
| self.assertTrue(not detected, "Detected process is still running, process output: %s" % output) |