Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 1 | # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | # pylint: disable=W0702 |
| 6 | |
| 7 | import os |
| 8 | import signal |
| 9 | import subprocess |
| 10 | import sys |
| 11 | import time |
| 12 | |
| 13 | |
| 14 | def _IsLinux(): |
| 15 | """Return True if on Linux; else False.""" |
| 16 | return sys.platform.startswith('linux') |
| 17 | |
| 18 | |
| 19 | class Xvfb(object): |
| 20 | """Class to start and stop Xvfb if relevant. Nop if not Linux.""" |
| 21 | |
| 22 | def __init__(self): |
| 23 | self._pid = 0 |
| 24 | |
| 25 | def Start(self): |
| 26 | """Start Xvfb and set an appropriate DISPLAY environment. Linux only. |
| 27 | |
| 28 | Copied from tools/code_coverage/coverage_posix.py |
| 29 | """ |
| 30 | if not _IsLinux(): |
| 31 | return |
| 32 | proc = subprocess.Popen(['Xvfb', ':9', '-screen', '0', '1024x768x24', |
| 33 | '-ac'], |
| 34 | stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
| 35 | self._pid = proc.pid |
| 36 | if not self._pid: |
| 37 | raise Exception('Could not start Xvfb') |
| 38 | os.environ['DISPLAY'] = ':9' |
| 39 | |
| 40 | # Now confirm, giving a chance for it to start if needed. |
| 41 | for _ in range(10): |
| 42 | proc = subprocess.Popen('xdpyinfo >/dev/null', shell=True) |
| 43 | _, retcode = os.waitpid(proc.pid, 0) |
| 44 | if retcode == 0: |
| 45 | break |
| 46 | time.sleep(0.25) |
| 47 | if retcode != 0: |
| 48 | raise Exception('Could not confirm Xvfb happiness') |
| 49 | |
| 50 | def Stop(self): |
| 51 | """Stop Xvfb if needed. Linux only.""" |
| 52 | if self._pid: |
| 53 | try: |
| 54 | os.kill(self._pid, signal.SIGKILL) |
| 55 | except: |
| 56 | pass |
| 57 | del os.environ['DISPLAY'] |
| 58 | self._pid = 0 |