| #!/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. | |
| """Sets environment variables needed to run a chromium unit test.""" | |
| import os | |
| import stat | |
| import subprocess | |
| import sys | |
| # This is hardcoded to be src/ relative to this script. | |
| ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
| CHROME_SANDBOX_ENV = 'CHROME_DEVEL_SANDBOX' | |
| CHROME_SANDBOX_PATH = '/opt/chromium/chrome_sandbox' | |
| def should_enable_sandbox(sandbox_path): | |
| """Return a boolean indicating that the current slave is capable of using the | |
| sandbox and should enable it. This should return True iff the slave is a | |
| Linux host with the sandbox file present and configured correctly.""" | |
| if not (sys.platform.startswith('linux') and | |
| os.path.exists(sandbox_path)): | |
| return False | |
| sandbox_stat = os.stat(sandbox_path) | |
| if ((sandbox_stat.st_mode & stat.S_ISUID) and | |
| (sandbox_stat.st_mode & stat.S_IRUSR) and | |
| (sandbox_stat.st_mode & stat.S_IXUSR) and | |
| (sandbox_stat.st_uid == 0)): | |
| return True | |
| return False | |
| def enable_sandbox_if_required(env, verbose=False): | |
| """Checks enables the sandbox if it is required, otherwise it disables it.""" | |
| chrome_sandbox_path = env.get(CHROME_SANDBOX_ENV, CHROME_SANDBOX_PATH) | |
| if should_enable_sandbox(chrome_sandbox_path): | |
| if verbose: | |
| print 'Enabling sandbox. Setting environment variable:' | |
| print ' %s="%s"' % (CHROME_SANDBOX_ENV, chrome_sandbox_path) | |
| env[CHROME_SANDBOX_ENV] = chrome_sandbox_path | |
| else: | |
| if verbose: | |
| print 'Disabling sandbox. Setting environment variable:' | |
| print ' %s=""' % CHROME_SANDBOX_ENV | |
| env[CHROME_SANDBOX_ENV] = '' | |
| def fix_python_path(cmd): | |
| """Returns the fixed command line to call the right python executable.""" | |
| out = cmd[:] | |
| if out[0] == 'python': | |
| out[0] = sys.executable | |
| elif out[0].endswith('.py'): | |
| out.insert(0, sys.executable) | |
| return out | |
| def run_executable(cmd, env): | |
| """Runs an executable with: | |
| - environment variable CR_SOURCE_ROOT set to the root directory. | |
| - environment variable LANGUAGE to en_US.UTF-8. | |
| - environment variable CHROME_DEVEL_SANDBOX set if need | |
| - Reuses sys.executable automatically. | |
| """ | |
| # Many tests assume a English interface... | |
| env['LANG'] = 'en_US.UTF-8' | |
| # Used by base/base_paths_linux.cc as an override. Just make sure the default | |
| # logic is used. | |
| env.pop('CR_SOURCE_ROOT', None) | |
| enable_sandbox_if_required(env) | |
| # Ensure paths are correctly separated on windows. | |
| cmd[0] = cmd[0].replace('/', os.path.sep) | |
| cmd = fix_python_path(cmd) | |
| try: | |
| return subprocess.call(cmd, env=env) | |
| except OSError: | |
| print >> sys.stderr, 'Failed to start %s' % cmd | |
| raise | |
| def main(): | |
| return run_executable(sys.argv[1:], os.environ.copy()) | |
| if __name__ == '__main__': | |
| sys.exit(main()) |