import mozinfo import os import subprocess import sys import unittest here = os.path.dirname(os.path.abspath(__file__)) def check_for_process(processName): """ Use to determine if process of the given name is still running. Returns: detected -- True if process is detected to exist, False otherwise output -- if process exists, stdout of the process, '' otherwise """ # TODO: replace with # https://github.com/mozilla/mozbase/blob/master/mozprocess/mozprocess/pid.py # which should be augmented from talos # see https://bugzilla.mozilla.org/show_bug.cgi?id=705864 output = '' if mozinfo.isWin: # On windows we use tasklist p1 = subprocess.Popen(["tasklist"], stdout=subprocess.PIPE) output = p1.communicate()[0] detected = False for line in output.splitlines(): if processName in line: detected = True break else: p1 = subprocess.Popen(["ps", "-ef"], stdout=subprocess.PIPE) p2 = subprocess.Popen(["grep", processName], stdin=p1.stdout, stdout=subprocess.PIPE) p1.stdout.close() output = p2.communicate()[0] detected = False for line in output.splitlines(): if "grep %s" % processName in line: continue elif processName in line and not 'defunct' in line: detected = True break return detected, output class ProcTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.proclaunch = os.path.join(here, "proclaunch.py") cls.python = sys.executable def determine_status(self, detected=False, output='', returncode=0, didtimeout=False, isalive=False, expectedfail=()): """ Use to determine if the situation has failed. Parameters: detected -- value from check_for_process to determine if the process is detected output -- string of data from detected process, can be '' returncode -- return code from process, defaults to 0 didtimeout -- True if process timed out, defaults to False 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 """ if 'returncode' in expectedfail: self.assertTrue(returncode, "Detected an unexpected return code of: %s" % returncode) elif not isalive: self.assertTrue(returncode == 0, "Detected non-zero return code of: %d" % returncode) 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)