Index: build/android/run_tests.py |
diff --git a/build/android/run_tests.py b/build/android/run_tests.py |
index 353429177df2ea515491acd38e6c43876a3fd8dc..a04dce642c313004b250a6e7891edb54d9f2e9ba 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) |
+ 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,9 @@ def Dispatch(options): |
options.log_dump) |
if buildbot_emulator: |
buildbot_emulator.Shutdown() |
+ if options.use_xvfb: |
+ xvfb.Stop() |
+ |
return len(test_results.failed) |
def ListTestSuites(): |
@@ -195,6 +250,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:] |