Chromium Code Reviews| Index: build/android/run_tests.py |
| diff --git a/build/android/run_tests.py b/build/android/run_tests.py |
| index 353429177df2ea515491acd38e6c43876a3fd8dc..e9179f12ab2f84c6c6abb79932ff96777b34ae7b 100755 |
| --- a/build/android/run_tests.py |
| +++ b/build/android/run_tests.py |
| @@ -50,6 +50,7 @@ failed on device. |
| import logging |
| import os |
| import re |
| +import subprocess |
| import sys |
| import android_commands |
| @@ -63,6 +64,53 @@ from test_result import BaseTestResult, TestResults |
| _TEST_SUITES = ['base_unittests', 'sql_unittests', 'ipc_tests'] |
| + |
| +class Xvfb(object): |
| + """Class to start and stop Xvfb if relevant. Nop if not Linux.""" |
| + |
| + def __init__(self): |
| + self._pid = 0 |
| + |
| + def _IsLinux(self): |
| + """Return True if on Linux; else False.""" |
| + return sys.platform.startswith('linux') |
| + |
| + def Start(self): |
| + """Start Xvfb and set an appropriate DISPLAY environment. Linux only. |
| + |
| + Copied from tools/code_coverage/coverage_posix.py |
| + """ |
| + if not self._IsLinux(): |
| + return |
| + proc = subprocess.Popen(["Xvfb", ":9", "-screen", "0", "1024x768x24", |
| + "-ac"], |
| + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
| + self._pid = proc.pid |
| + if not self._pid: |
| + raise Exception('Could not start Xvfb') |
| + os.environ['DISPLAY'] = ":9" |
| + |
| + # Now confirm, giving a chance for it to start if needed. |
| + for test in range(10): |
| + proc = subprocess.Popen('xdpyinfo >/dev/null', shell=True) |
| + pid, retcode = os.waitpid(proc.pid, 0) |
| + if retcode == 0: |
| + break |
| + time.sleep(0.25) |
|
bradn
2011/11/19 16:32:20
how about exponential back off?
time.sleep(0.25 *
|
| + if retcode != 0: |
| + raise Exception('Could not confirm Xvfb happiness') |
| + |
| + def Stop(self): |
| + """Stop Xvfb if needed. Linux only.""" |
| + if self._pid: |
| + try: |
| + os.kill(self._pid, signal.SIGKILL) |
| + except: |
| + pass |
| + del os.environ['DISPLAY'] |
| + self._pid = 0 |
| + |
| + |
| def RunTests(device, test_suite, gtest_filter, test_arguments, rebaseline, |
| timeout, performance_test, cleanup_test_files, tool, |
| log_dump_name): |
| @@ -140,6 +188,10 @@ def Dispatch(options): |
| buildbot_emulator = None |
| attached_devices = [] |
| + if options.use_xvfb: |
| + xvfb = Xvfb() |
| + xvfb.Start() |
| + |
| if options.use_emulator: |
| buildbot_emulator = emulator.Emulator() |
| buildbot_emulator.Launch() |
| @@ -159,6 +211,8 @@ def Dispatch(options): |
| options.log_dump) |
| if buildbot_emulator: |
| buildbot_emulator.Shutdown() |
| + xvfb.Stop() |
|
michaelbai
2011/11/21 17:16:04
Do you need?
'if options.use_xvfb: '
John Grabowski
2011/11/21 19:26:08
Yes; added
|
| + |
| return len(test_results.failed) |
| def ListTestSuites(): |
| @@ -195,6 +249,9 @@ def main(argv): |
| help='Run tests in a new instance of emulator', |
| action='store_true', |
| default=False) |
| + option_parser.add_option('-x', '--xvfb', dest='use_xvfb', |
| + action='store_true', default=False, |
| + help='Use Xvfb around tests (ignored if not Linux)') |
| options, args = option_parser.parse_args(argv) |
| if len(args) > 1: |
| print 'Unknown argument:', args[1:] |