| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Unit tests for subprocess2.py.""" | 6 """Unit tests for subprocess2.py.""" |
| 7 | 7 |
| 8 import logging | 8 import logging |
| 9 import optparse | 9 import optparse |
| 10 import os | 10 import os |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 | 21 |
| 22 import subprocess | 22 import subprocess |
| 23 import subprocess2 | 23 import subprocess2 |
| 24 | 24 |
| 25 from testing_support import auto_stub | 25 from testing_support import auto_stub |
| 26 | 26 |
| 27 # Method could be a function | 27 # Method could be a function |
| 28 # pylint: disable=R0201 | 28 # pylint: disable=R0201 |
| 29 | 29 |
| 30 | 30 |
| 31 # Create aliases for subprocess2 specific tests. They shouldn't be used for |
| 32 # regression tests. |
| 33 TIMED_OUT = subprocess2.TIMED_OUT |
| 34 VOID = subprocess2.VOID |
| 35 PIPE = subprocess2.PIPE |
| 36 STDOUT = subprocess2.STDOUT |
| 37 |
| 38 |
| 31 def convert_to_crlf(string): | 39 def convert_to_crlf(string): |
| 32 """Unconditionally convert LF to CRLF.""" | 40 """Unconditionally convert LF to CRLF.""" |
| 33 return string.replace('\n', '\r\n') | 41 return string.replace('\n', '\r\n') |
| 34 | 42 |
| 35 | 43 |
| 36 def convert_to_cr(string): | 44 def convert_to_cr(string): |
| 37 """Unconditionally convert LF to CR.""" | 45 """Unconditionally convert LF to CR.""" |
| 38 return string.replace('\n', '\r') | 46 return string.replace('\n', '\r') |
| 39 | 47 |
| 40 | 48 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 """ | 203 """ |
| 196 noop = lambda x: x | 204 noop = lambda x: x |
| 197 for subp in (subprocess, subprocess2): | 205 for subp in (subprocess, subprocess2): |
| 198 function(noop, self.exe, False, subp) | 206 function(noop, self.exe, False, subp) |
| 199 function(convert_to_cr, self.exe + ['--cr'], False, subp) | 207 function(convert_to_cr, self.exe + ['--cr'], False, subp) |
| 200 function(convert_to_crlf, self.exe + ['--crlf'], False, subp) | 208 function(convert_to_crlf, self.exe + ['--crlf'], False, subp) |
| 201 function(noop, self.exe, True, subp) | 209 function(noop, self.exe, True, subp) |
| 202 function(noop, self.exe + ['--cr'], True, subp) | 210 function(noop, self.exe + ['--cr'], True, subp) |
| 203 function(noop, self.exe + ['--crlf'], True, subp) | 211 function(noop, self.exe + ['--crlf'], True, subp) |
| 204 | 212 |
| 205 def _check_pipes(self, subp, e, stdout, stderr): | 213 def _check_exception(self, subp, e, stdout, stderr, returncode): |
| 206 """On exception, look if the exception members are set correctly.""" | 214 """On exception, look if the exception members are set correctly.""" |
| 215 self.assertEquals(returncode, e.returncode) |
| 207 if subp is subprocess: | 216 if subp is subprocess: |
| 208 # subprocess never save the output. | 217 # subprocess never save the output. |
| 209 self.assertFalse(hasattr(e, 'stdout')) | 218 self.assertFalse(hasattr(e, 'stdout')) |
| 210 self.assertFalse(hasattr(e, 'stderr')) | 219 self.assertFalse(hasattr(e, 'stderr')) |
| 211 elif subp is subprocess2: | 220 elif subp is subprocess2: |
| 212 self.assertEquals(stdout, e.stdout) | 221 self.assertEquals(stdout, e.stdout) |
| 213 self.assertEquals(stderr, e.stderr) | 222 self.assertEquals(stderr, e.stderr) |
| 214 else: | 223 else: |
| 215 self.fail() | 224 self.fail() |
| 216 | 225 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 232 | 241 |
| 233 def test_check_output_throw_stdout(self): | 242 def test_check_output_throw_stdout(self): |
| 234 def fn(c, e, un, subp): | 243 def fn(c, e, un, subp): |
| 235 if not hasattr(subp, 'check_output'): | 244 if not hasattr(subp, 'check_output'): |
| 236 return | 245 return |
| 237 try: | 246 try: |
| 238 subp.check_output( | 247 subp.check_output( |
| 239 e + ['--fail', '--stdout'], universal_newlines=un) | 248 e + ['--fail', '--stdout'], universal_newlines=un) |
| 240 self.fail() | 249 self.fail() |
| 241 except subp.CalledProcessError, e: | 250 except subp.CalledProcessError, e: |
| 242 self._check_pipes(subp, e, c('A\nBB\nCCC\n'), None) | 251 self._check_exception(subp, e, c('A\nBB\nCCC\n'), None, 64) |
| 243 self.assertEquals(64, e.returncode) | |
| 244 self._run_test(fn) | 252 self._run_test(fn) |
| 245 | 253 |
| 246 def test_check_output_throw_no_stderr(self): | 254 def test_check_output_throw_no_stderr(self): |
| 247 def fn(c, e, un, subp): | 255 def fn(c, e, un, subp): |
| 248 if not hasattr(subp, 'check_output'): | 256 if not hasattr(subp, 'check_output'): |
| 249 return | 257 return |
| 250 try: | 258 try: |
| 251 subp.check_output( | 259 subp.check_output( |
| 252 e + ['--fail', '--stderr'], universal_newlines=un) | 260 e + ['--fail', '--stderr'], universal_newlines=un) |
| 253 self.fail() | 261 self.fail() |
| 254 except subp.CalledProcessError, e: | 262 except subp.CalledProcessError, e: |
| 255 self._check_pipes(subp, e, c(''), None) | 263 self._check_exception(subp, e, c(''), None, 64) |
| 256 self.assertEquals(64, e.returncode) | |
| 257 self._run_test(fn) | 264 self._run_test(fn) |
| 258 | 265 |
| 259 def test_check_output_throw_stderr(self): | 266 def test_check_output_throw_stderr(self): |
| 260 def fn(c, e, un, subp): | 267 def fn(c, e, un, subp): |
| 261 if not hasattr(subp, 'check_output'): | 268 if not hasattr(subp, 'check_output'): |
| 262 return | 269 return |
| 263 try: | 270 try: |
| 264 subp.check_output( | 271 subp.check_output( |
| 265 e + ['--fail', '--stderr'], | 272 e + ['--fail', '--stderr'], |
| 266 stderr=subp.PIPE, | 273 stderr=subp.PIPE, |
| 267 universal_newlines=un) | 274 universal_newlines=un) |
| 268 self.fail() | 275 self.fail() |
| 269 except subp.CalledProcessError, e: | 276 except subp.CalledProcessError, e: |
| 270 self._check_pipes(subp, e, '', c('a\nbb\nccc\n')) | 277 self._check_exception(subp, e, '', c('a\nbb\nccc\n'), 64) |
| 271 self.assertEquals(64, e.returncode) | |
| 272 self._run_test(fn) | 278 self._run_test(fn) |
| 273 | 279 |
| 274 def test_check_output_throw_stderr_stdout(self): | 280 def test_check_output_throw_stderr_stdout(self): |
| 275 def fn(c, e, un, subp): | 281 def fn(c, e, un, subp): |
| 276 if not hasattr(subp, 'check_output'): | 282 if not hasattr(subp, 'check_output'): |
| 277 return | 283 return |
| 278 try: | 284 try: |
| 279 subp.check_output( | 285 subp.check_output( |
| 280 e + ['--fail', '--stderr'], | 286 e + ['--fail', '--stderr'], |
| 281 stderr=subp.STDOUT, | 287 stderr=subp.STDOUT, |
| 282 universal_newlines=un) | 288 universal_newlines=un) |
| 283 self.fail() | 289 self.fail() |
| 284 except subp.CalledProcessError, e: | 290 except subp.CalledProcessError, e: |
| 285 self._check_pipes(subp, e, c('a\nbb\nccc\n'), None) | 291 self._check_exception(subp, e, c('a\nbb\nccc\n'), None, 64) |
| 286 self.assertEquals(64, e.returncode) | |
| 287 self._run_test(fn) | 292 self._run_test(fn) |
| 288 | 293 |
| 289 def test_check_call_throw(self): | 294 def test_check_call_throw(self): |
| 290 for subp in (subprocess, subprocess2): | 295 for subp in (subprocess, subprocess2): |
| 291 try: | 296 try: |
| 292 subp.check_call(self.exe + ['--fail', '--stderr']) | 297 subp.check_call(self.exe + ['--fail', '--stderr']) |
| 293 self.fail() | 298 self.fail() |
| 294 except subp.CalledProcessError, e: | 299 except subp.CalledProcessError, e: |
| 295 self._check_pipes(subp, e, None, None) | 300 self._check_exception(subp, e, None, None, 64) |
| 296 self.assertEquals(64, e.returncode) | |
| 297 | 301 |
| 298 | 302 |
| 299 class S2Test(BaseTestCase): | 303 class S2Test(BaseTestCase): |
| 300 # Tests that can only run in subprocess2, e.g. new functionalities. | 304 # Tests that can only run in subprocess2, e.g. new functionalities. |
| 301 # In particular, subprocess2.communicate() doesn't exist in subprocess. | 305 # In particular, subprocess2.communicate() doesn't exist in subprocess. |
| 302 def _run_test(self, function): | 306 def _run_test(self, function): |
| 303 """Runs tests in 6 combinations: | 307 """Runs tests in 6 combinations: |
| 304 - LF output with universal_newlines=False | 308 - LF output with universal_newlines=False |
| 305 - CR output with universal_newlines=False | 309 - CR output with universal_newlines=False |
| 306 - CRLF output with universal_newlines=False | 310 - CRLF output with universal_newlines=False |
| 307 - LF output with universal_newlines=True | 311 - LF output with universal_newlines=True |
| 308 - CR output with universal_newlines=True | 312 - CR output with universal_newlines=True |
| 309 - CRLF output with universal_newlines=True | 313 - CRLF output with universal_newlines=True |
| 310 | 314 |
| 311 First |function| argument is the convertion for the origianl expected LF | 315 First |function| argument is the convertion for the origianl expected LF |
| 312 string to the right EOL. | 316 string to the right EOL. |
| 313 Second |function| argument is the executable and initial flag to run, to | 317 Second |function| argument is the executable and initial flag to run, to |
| 314 control what EOL is used by the child process. | 318 control what EOL is used by the child process. |
| 315 Third |function| argument is universal_newlines value. | 319 Third |function| argument is universal_newlines value. |
| 316 """ | 320 """ |
| 317 noop = lambda x: x | 321 noop = lambda x: x |
| 318 function(noop, self.exe, False) | 322 function(noop, self.exe, False) |
| 319 function(convert_to_cr, self.exe + ['--cr'], False) | 323 function(convert_to_cr, self.exe + ['--cr'], False) |
| 320 function(convert_to_crlf, self.exe + ['--crlf'], False) | 324 function(convert_to_crlf, self.exe + ['--crlf'], False) |
| 321 function(noop, self.exe, True) | 325 function(noop, self.exe, True) |
| 322 function(noop, self.exe + ['--cr'], True) | 326 function(noop, self.exe + ['--cr'], True) |
| 323 function(noop, self.exe + ['--crlf'], True) | 327 function(noop, self.exe + ['--crlf'], True) |
| 324 | 328 |
| 329 def _check_res(self, res, stdout, stderr, returncode): |
| 330 (out, err), code = res |
| 331 self.assertEquals(stdout, out) |
| 332 self.assertEquals(stderr, err) |
| 333 self.assertEquals(returncode, code) |
| 334 |
| 325 def test_timeout(self): | 335 def test_timeout(self): |
| 326 # timeout doesn't exist in subprocess. | 336 # timeout doesn't exist in subprocess. |
| 327 def fn(c, e, un): | 337 def fn(c, e, un): |
| 328 out, returncode = subprocess2.communicate( | 338 res = subprocess2.communicate( |
| 329 self.exe + ['--sleep_first', '--stdout'], | 339 self.exe + ['--sleep_first', '--stdout'], |
| 330 timeout=0.01, | 340 timeout=0.01, |
| 331 stdout=subprocess2.PIPE, | 341 stdout=PIPE, |
| 332 shell=False) | 342 shell=False) |
| 333 self.assertEquals(subprocess2.TIMED_OUT, returncode) | 343 self._check_res(res, '', None, TIMED_OUT) |
| 334 self.assertEquals(('', None), out) | 344 self._run_test(fn) |
| 345 |
| 346 def test_timeout_shell_throws(self): |
| 347 def fn(c, e, un): |
| 348 try: |
| 349 # With shell=True, it needs a string. |
| 350 subprocess2.communicate(' '.join(self.exe), timeout=0.01, shell=True) |
| 351 self.fail() |
| 352 except TypeError: |
| 353 pass |
| 335 self._run_test(fn) | 354 self._run_test(fn) |
| 336 | 355 |
| 337 def test_stdout_void(self): | 356 def test_stdout_void(self): |
| 338 def fn(c, e, un): | 357 def fn(c, e, un): |
| 339 (out, err), code = subprocess2.communicate( | 358 res = subprocess2.communicate( |
| 340 e + ['--stdout', '--stderr'], | 359 e + ['--stdout', '--stderr'], |
| 341 stdout=subprocess2.VOID, | 360 stdout=VOID, |
| 342 stderr=subprocess2.PIPE, | 361 stderr=PIPE, |
| 343 universal_newlines=un) | 362 universal_newlines=un) |
| 344 self.assertEquals(None, out) | 363 self._check_res(res, None, c('a\nbb\nccc\n'), 0) |
| 345 self.assertEquals(c('a\nbb\nccc\n'), err) | |
| 346 self.assertEquals(0, code) | |
| 347 self._run_test(fn) | 364 self._run_test(fn) |
| 348 | 365 |
| 349 def test_stderr_void(self): | 366 def test_stderr_void(self): |
| 350 def fn(c, e, un): | 367 def fn(c, e, un): |
| 351 (out, err), code = subprocess2.communicate( | 368 res = subprocess2.communicate( |
| 352 e + ['--stdout', '--stderr'], | 369 e + ['--stdout', '--stderr'], |
| 353 stdout=subprocess2.PIPE, | 370 stdout=PIPE, |
| 354 stderr=subprocess2.VOID, | 371 stderr=VOID, |
| 355 universal_newlines=un) | 372 universal_newlines=un) |
| 356 self.assertEquals(c('A\nBB\nCCC\n'), out) | 373 self._check_res(res, c('A\nBB\nCCC\n'), None, 0) |
| 357 self.assertEquals(None, err) | 374 self._run_test(fn) |
| 358 self.assertEquals(0, code) | 375 |
| 376 def test_stdout_void_stderr_redirect(self): |
| 377 def fn(c, e, un): |
| 378 res = subprocess2.communicate( |
| 379 e + ['--stdout', '--stderr'], |
| 380 stdout=VOID, |
| 381 stderr=STDOUT, |
| 382 universal_newlines=un) |
| 383 self._check_res(res, None, None, 0) |
| 359 self._run_test(fn) | 384 self._run_test(fn) |
| 360 | 385 |
| 361 def test_check_output_redirect_stderr_to_stdout_pipe(self): | 386 def test_check_output_redirect_stderr_to_stdout_pipe(self): |
| 362 def fn(c, e, un): | 387 def fn(c, e, un): |
| 363 (out, err), code = subprocess2.communicate( | 388 # stderr output into stdout. |
| 389 res = subprocess2.communicate( |
| 364 e + ['--stderr'], | 390 e + ['--stderr'], |
| 365 stdout=subprocess2.PIPE, | 391 stdout=PIPE, |
| 366 stderr=subprocess2.STDOUT, | 392 stderr=STDOUT, |
| 367 universal_newlines=un) | 393 universal_newlines=un) |
| 368 # stderr output into stdout. | 394 self._check_res(res, c('a\nbb\nccc\n'), None, 0) |
| 369 self.assertEquals(c('a\nbb\nccc\n'), out) | |
| 370 self.assertEquals(None, err) | |
| 371 self.assertEquals(0, code) | |
| 372 self._run_test(fn) | 395 self._run_test(fn) |
| 373 | 396 |
| 374 def test_check_output_redirect_stderr_to_stdout(self): | 397 def test_check_output_redirect_stderr_to_stdout(self): |
| 375 def fn(c, e, un): | 398 def fn(c, e, un): |
| 376 (out, err), code = subprocess2.communicate( | |
| 377 e + ['--stderr'], | |
| 378 stderr=subprocess2.STDOUT, | |
| 379 universal_newlines=un) | |
| 380 # stderr output into stdout but stdout is not piped. | 399 # stderr output into stdout but stdout is not piped. |
| 381 self.assertEquals(None, out) | 400 res = subprocess2.communicate( |
| 382 self.assertEquals(None, err) | 401 e + ['--stderr'], stderr=STDOUT, universal_newlines=un) |
| 383 self.assertEquals(0, code) | 402 self._check_res(res, None, None, 0) |
| 384 self._run_test(fn) | 403 self._run_test(fn) |
| 385 | 404 |
| 386 | 405 |
| 387 def child_main(args): | 406 def child_main(args): |
| 388 if sys.platform == 'win32': | 407 if sys.platform == 'win32': |
| 389 # Annoying, make sure the output is not translated on Windows. | 408 # Annoying, make sure the output is not translated on Windows. |
| 390 # pylint: disable=E1101,F0401 | 409 # pylint: disable=E1101,F0401 |
| 391 import msvcrt | 410 import msvcrt |
| 392 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) | 411 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) |
| 393 msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY) | 412 msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 return options.return_value | 460 return options.return_value |
| 442 | 461 |
| 443 | 462 |
| 444 if __name__ == '__main__': | 463 if __name__ == '__main__': |
| 445 logging.basicConfig(level= | 464 logging.basicConfig(level= |
| 446 [logging.WARNING, logging.INFO, logging.DEBUG][ | 465 [logging.WARNING, logging.INFO, logging.DEBUG][ |
| 447 min(2, sys.argv.count('-v'))]) | 466 min(2, sys.argv.count('-v'))]) |
| 448 if len(sys.argv) > 1 and sys.argv[1] == '--child': | 467 if len(sys.argv) > 1 and sys.argv[1] == '--child': |
| 449 sys.exit(child_main(sys.argv[2:])) | 468 sys.exit(child_main(sys.argv[2:])) |
| 450 unittest.main() | 469 unittest.main() |
| OLD | NEW |