OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 |
| 3 # This Source Code Form is subject to the terms of the Mozilla Public |
| 4 # License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| 5 # You can obtain one at http://mozilla.org/MPL/2.0/. |
| 6 |
| 7 import os |
| 8 import subprocess |
| 9 import sys |
| 10 import unittest |
| 11 from time import sleep |
| 12 |
| 13 from mozprocess import processhandler |
| 14 |
| 15 here = os.path.dirname(os.path.abspath(__file__)) |
| 16 |
| 17 # This tests specifically the case reported in bug 671316 |
| 18 # TODO: Because of the way mutt works we can't just load a utils.py in here. |
| 19 # so, for all process handler tests, copy these two |
| 20 # utility functions to to the top of your source. |
| 21 |
| 22 def make_proclaunch(aDir): |
| 23 """ |
| 24 Makes the proclaunch executable. |
| 25 Params: |
| 26 aDir - the directory in which to issue the make commands |
| 27 Returns: |
| 28 the path to the proclaunch executable that is generated |
| 29 """ |
| 30 # Ideally make should take care of this, but since it doesn't - on windows, |
| 31 # anyway, let's just call out both targets explicitly. |
| 32 p = subprocess.call(["make", "-C", "iniparser"],stdout=subprocess.PIPE, stde
rr=subprocess.PIPE, cwd=aDir) |
| 33 p = subprocess.call(["make"],stdout=subprocess.PIPE, stderr=subprocess.PIPE,
cwd=aDir) |
| 34 if sys.platform == "win32": |
| 35 exepath = os.path.join(aDir, "proclaunch.exe") |
| 36 else: |
| 37 exepath = os.path.join(aDir, "proclaunch") |
| 38 return exepath |
| 39 |
| 40 def check_for_process(processName): |
| 41 """ |
| 42 Use to determine if process is still running. |
| 43 |
| 44 Returns: |
| 45 detected -- True if process is detected to exist, False otherwise |
| 46 output -- if process exists, stdout of the process, '' otherwise |
| 47 """ |
| 48 output = '' |
| 49 if sys.platform == "win32": |
| 50 # On windows we use tasklist |
| 51 p1 = subprocess.Popen(["tasklist"], stdout=subprocess.PIPE) |
| 52 output = p1.communicate()[0] |
| 53 detected = False |
| 54 for line in output.splitlines(): |
| 55 if processName in line: |
| 56 detected = True |
| 57 break |
| 58 else: |
| 59 p1 = subprocess.Popen(["ps", "-ef"], stdout=subprocess.PIPE) |
| 60 p2 = subprocess.Popen(["grep", processName], stdin=p1.stdout, stdout=sub
process.PIPE) |
| 61 p1.stdout.close() |
| 62 output = p2.communicate()[0] |
| 63 detected = False |
| 64 for line in output.splitlines(): |
| 65 if "grep %s" % processName in line: |
| 66 continue |
| 67 elif processName in line and not 'defunct' in line: |
| 68 detected = True |
| 69 break |
| 70 |
| 71 return detected, output |
| 72 |
| 73 class ProcTest2(unittest.TestCase): |
| 74 |
| 75 def __init__(self, *args, **kwargs): |
| 76 |
| 77 # Ideally, I'd use setUpClass but that only exists in 2.7. |
| 78 # So, we'll do this make step now. |
| 79 self.proclaunch = make_proclaunch(here) |
| 80 unittest.TestCase.__init__(self, *args, **kwargs) |
| 81 |
| 82 def test_process_waitnotimeout(self): |
| 83 """ Process is started, runs to completion before our wait times out |
| 84 """ |
| 85 p = processhandler.ProcessHandler([self.proclaunch, |
| 86 "process_waittimeout_10s.ini"], |
| 87 cwd=here) |
| 88 p.run(timeout=30) |
| 89 p.wait() |
| 90 |
| 91 detected, output = check_for_process(self.proclaunch) |
| 92 self.determine_status(detected, |
| 93 output, |
| 94 p.proc.returncode, |
| 95 p.didTimeout) |
| 96 |
| 97 def test_process_wait(self): |
| 98 """ Process is started runs to completion while we wait indefinitely |
| 99 """ |
| 100 |
| 101 p = processhandler.ProcessHandler([self.proclaunch, |
| 102 "process_waittimeout_10s.ini"], |
| 103 cwd=here) |
| 104 p.run() |
| 105 p.wait() |
| 106 |
| 107 detected, output = check_for_process(self.proclaunch) |
| 108 self.determine_status(detected, |
| 109 output, |
| 110 p.proc.returncode, |
| 111 p.didTimeout) |
| 112 |
| 113 def test_process_waittimeout(self): |
| 114 """ |
| 115 Process is started, then wait is called and times out. |
| 116 Process is still running and didn't timeout |
| 117 """ |
| 118 p = processhandler.ProcessHandler([self.proclaunch, |
| 119 "process_waittimeout_10s.ini"], |
| 120 cwd=here) |
| 121 |
| 122 p.run() |
| 123 p.wait(timeout=5) |
| 124 |
| 125 detected, output = check_for_process(self.proclaunch) |
| 126 self.determine_status(detected, |
| 127 output, |
| 128 p.proc.returncode, |
| 129 p.didTimeout, |
| 130 True, |
| 131 []) |
| 132 |
| 133 def test_process_output_twice(self): |
| 134 """ |
| 135 Process is started, then processOutput is called a second time explicitl
y |
| 136 """ |
| 137 p = processhandler.ProcessHandler([self.proclaunch, |
| 138 "process_waittimeout_10s.ini"], |
| 139 cwd=here) |
| 140 |
| 141 p.run() |
| 142 p.processOutput(timeout=5) |
| 143 p.wait() |
| 144 |
| 145 detected, output = check_for_process(self.proclaunch) |
| 146 self.determine_status(detected, |
| 147 output, |
| 148 p.proc.returncode, |
| 149 p.didTimeout, |
| 150 False, |
| 151 []) |
| 152 |
| 153 |
| 154 def determine_status(self, |
| 155 detected=False, |
| 156 output = '', |
| 157 returncode = 0, |
| 158 didtimeout = False, |
| 159 isalive=False, |
| 160 expectedfail=[]): |
| 161 """ |
| 162 Use to determine if the situation has failed. |
| 163 Parameters: |
| 164 detected -- value from check_for_process to determine if the process
is detected |
| 165 output -- string of data from detected process, can be '' |
| 166 returncode -- return code from process, defaults to 0 |
| 167 didtimeout -- True if process timed out, defaults to False |
| 168 isalive -- Use True to indicate we pass if the process exists; howev
er, by default |
| 169 the test will pass if the process does not exist (isalive
== False) |
| 170 expectedfail -- Defaults to [], used to indicate a list of fields th
at are expected to fail |
| 171 """ |
| 172 if 'returncode' in expectedfail: |
| 173 self.assertTrue(returncode, "Detected an unexpected return code of:
%s" % returncode) |
| 174 elif not isalive: |
| 175 self.assertTrue(returncode == 0, "Detected non-zero return code of:
%d" % returncode) |
| 176 |
| 177 if 'didtimeout' in expectedfail: |
| 178 self.assertTrue(didtimeout, "Detected that process didn't time out") |
| 179 else: |
| 180 self.assertTrue(not didtimeout, "Detected that process timed out") |
| 181 |
| 182 if isalive: |
| 183 self.assertTrue(detected, "Detected process is not running, process
output: %s" % output) |
| 184 else: |
| 185 self.assertTrue(not detected, "Detected process is still running, pr
ocess output: %s" % output) |
| 186 |
| 187 if __name__ == '__main__': |
| 188 unittest.main() |
OLD | NEW |