Index: testing/xvfb.py |
diff --git a/testing/xvfb.py b/testing/xvfb.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..a5cb7aa9d15b38740b79065fc4068adda96ca43a |
--- /dev/null |
+++ b/testing/xvfb.py |
@@ -0,0 +1,108 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2012 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. |
+ |
+"""Runs the test with xvfb on linux. Runs the test normally on other platforms. |
+ |
+For simplicity in gyp targets, this script just runs the test normal on |
+non-linux platforms. |
+""" |
+ |
+import os |
+import platform |
+import signal |
+import subprocess |
+import sys |
+ |
+import test_env |
+ |
+ |
+def kill(pid): |
+ """Kills a process and traps exception if the process doesn't exist anymore. |
+ """ |
+ # If the process doesn't exist, it raises an exception that we can ignore. |
+ try: |
+ os.kill(pid, signal.SIGKILL) |
+ except OSError: |
+ pass |
+ |
+ |
+def get_xvfb_path(server_dir): |
+ """Figures out which X server to use.""" |
+ xvfb_path = os.path.join(server_dir, 'Xvfb.' + platform.architecture()[0]) |
+ if not os.path.exists(xvfb_path): |
+ xvfb_path = os.path.join(server_dir, 'Xvfb') |
+ if not os.path.exists(xvfb_path): |
+ print >> sys.stderr, ( |
+ 'No Xvfb found in designated server path: %s' % server_dir) |
+ raise Exception('No virtual server') |
+ return xvfb_path |
+ |
+ |
+def start_xvfb(xvfb_path, display): |
+ """Starts a virtual X server that we run the tests in. |
+ |
+ This makes it so we can run the tests even if we didn't start the tests from |
+ an X session. |
+ |
+ Args: |
+ xvfb_path: Path to Xvfb. |
+ """ |
+ proc = subprocess.Popen( |
+ [xvfb_path, display, '-screen', '0', '1024x768x24', '-ac'], |
+ stdout=subprocess.PIPE, |
+ stderr=subprocess.STDOUT) |
+ return proc.pid |
+ |
+ |
+def wait_for_xvfb(xdisplaycheck, env): |
+ """Waits for xvfb to be fully initialized by using xdisplaycheck.""" |
+ try: |
+ subprocess.check_call( |
+ [xdisplaycheck], |
+ stdout=subprocess.PIPE, |
+ stderr=subprocess.STDOUT, |
+ env=env) |
+ except subprocess.CalledProcessError: |
+ print >> sys.stderr, 'Xvfb failed to load properly.' |
+ return False |
+ return True |
+ |
+ |
+def run_executable(cmd, build_dir, env): |
+ """Runs an executable within a xvfb buffer on linux or normally on other |
+ platforms. |
+ |
+ Requires that both xvfb and icewm are installed on linux. |
+ """ |
+ pid = None |
+ xvfb = 'Xvfb' |
+ try: |
+ if sys.platform == 'linux2': |
+ # Defaults to X display 9. |
+ display = ':9' |
+ pid = start_xvfb(xvfb, display) |
+ env['DISPLAY'] = display |
+ if not wait_for_xvfb(os.path.join(build_dir, 'xdisplaycheck'), env): |
+ return 3 |
+ # Some ChromeOS tests need a window manager. Technically, it could be |
+ # another script but that would be overkill. |
+ subprocess.Popen( |
+ 'icewm', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env) |
+ return test_env.run_executable(cmd, env) |
+ finally: |
+ if pid: |
+ kill(pid) |
+ |
+ |
+def main(): |
+ if len(sys.argv) < 3: |
+ print >> sys.stderr, ( |
+ 'Usage: xvfb.py [path to build_dir] [command args...]') |
+ return 2 |
+ return run_executable(sys.argv[2:], sys.argv[1], os.environ.copy()) |
+ |
+ |
+if __name__ == "__main__": |
+ sys.exit(main()) |