Index: build/android/pylib/utils/xvfb.py |
diff --git a/build/android/pylib/utils/xvfb.py b/build/android/pylib/utils/xvfb.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cb9d50e8fd97509092e080736796137c05e37a04 |
--- /dev/null |
+++ b/build/android/pylib/utils/xvfb.py |
@@ -0,0 +1,58 @@ |
+# Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+# pylint: disable=W0702 |
+ |
+import os |
+import signal |
+import subprocess |
+import sys |
+import time |
+ |
+ |
+def _IsLinux(): |
+ """Return True if on Linux; else False.""" |
+ return sys.platform.startswith('linux') |
+ |
+ |
+class Xvfb(object): |
+ """Class to start and stop Xvfb if relevant. Nop if not Linux.""" |
+ |
+ def __init__(self): |
+ self._pid = 0 |
+ |
+ def Start(self): |
+ """Start Xvfb and set an appropriate DISPLAY environment. Linux only. |
+ |
+ Copied from tools/code_coverage/coverage_posix.py |
+ """ |
+ if not _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 _ in range(10): |
+ proc = subprocess.Popen('xdpyinfo >/dev/null', shell=True) |
+ _, 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 |