OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Sets environment variables needed to run a chromium unit test.""" | 6 """Sets environment variables needed to run a chromium unit test.""" |
7 | 7 |
8 import os | 8 import os |
9 import stat | 9 import stat |
10 import subprocess | 10 import subprocess |
11 import sys | 11 import sys |
12 | 12 |
13 # This is hardcoded to be src/ relative to this script. | 13 # This is hardcoded to be src/ relative to this script. |
14 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 14 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
15 | 15 |
16 CHROME_SANDBOX_ENV = 'CHROME_DEVEL_SANDBOX' | 16 CHROME_SANDBOX_ENV = 'CHROME_DEVEL_SANDBOX' |
17 CHROME_SANDBOX_PATH = '/opt/chromium/chrome_sandbox' | 17 CHROME_SANDBOX_PATH = '/opt/chromium/chrome_sandbox' |
18 | 18 |
19 | 19 |
20 def should_enable_sandbox(sandbox_path): | 20 def should_enable_sandbox(cmd, sandbox_path): |
21 """Return a boolean indicating that the current slave is capable of using the | 21 """Return a boolean indicating that the current slave is capable of using the |
22 sandbox and should enable it. This should return True iff the slave is a | 22 sandbox and should enable it. This should return True iff the slave is a |
23 Linux host with the sandbox file present and configured correctly.""" | 23 Linux host with the sandbox file present and configured correctly.""" |
24 if not (sys.platform.startswith('linux') and | 24 if not (sys.platform.startswith('linux') and |
25 os.path.exists(sandbox_path)): | 25 os.path.exists(sandbox_path)): |
26 return False | 26 return False |
| 27 |
| 28 # Copy the check in tools/build/scripts/slave/runtest.py. |
| 29 if '--lsan=1' in cmd: |
| 30 return False |
| 31 |
27 sandbox_stat = os.stat(sandbox_path) | 32 sandbox_stat = os.stat(sandbox_path) |
28 if ((sandbox_stat.st_mode & stat.S_ISUID) and | 33 if ((sandbox_stat.st_mode & stat.S_ISUID) and |
29 (sandbox_stat.st_mode & stat.S_IRUSR) and | 34 (sandbox_stat.st_mode & stat.S_IRUSR) and |
30 (sandbox_stat.st_mode & stat.S_IXUSR) and | 35 (sandbox_stat.st_mode & stat.S_IXUSR) and |
31 (sandbox_stat.st_uid == 0)): | 36 (sandbox_stat.st_uid == 0)): |
32 return True | 37 return True |
33 return False | 38 return False |
34 | 39 |
35 | 40 |
36 def enable_sandbox_if_required(env, verbose=False): | 41 def enable_sandbox_if_required(cmd, env, verbose=False): |
37 """Checks enables the sandbox if it is required, otherwise it disables it.""" | 42 """Checks enables the sandbox if it is required, otherwise it disables it.""" |
38 chrome_sandbox_path = env.get(CHROME_SANDBOX_ENV, CHROME_SANDBOX_PATH) | 43 chrome_sandbox_path = env.get(CHROME_SANDBOX_ENV, CHROME_SANDBOX_PATH) |
39 | 44 |
40 if should_enable_sandbox(chrome_sandbox_path): | 45 if should_enable_sandbox(cmd, chrome_sandbox_path): |
41 if verbose: | 46 if verbose: |
42 print 'Enabling sandbox. Setting environment variable:' | 47 print 'Enabling sandbox. Setting environment variable:' |
43 print ' %s="%s"' % (CHROME_SANDBOX_ENV, chrome_sandbox_path) | 48 print ' %s="%s"' % (CHROME_SANDBOX_ENV, chrome_sandbox_path) |
44 env[CHROME_SANDBOX_ENV] = chrome_sandbox_path | 49 env[CHROME_SANDBOX_ENV] = chrome_sandbox_path |
45 else: | 50 else: |
46 if verbose: | 51 if verbose: |
47 print 'Sandbox not properly installed. Unsetting:' | 52 print 'Disabling sandbox. Setting environment variable:' |
48 print ' %s' % CHROME_SANDBOX_ENV | 53 print ' CHROME_DEVEL_SANDBOX=""' |
49 # The variable should be removed from the environment, making | 54 env['CHROME_DEVEL_SANDBOX'] = '' |
50 # the variable empty silently disables the sandbox. | |
51 if env.get(CHROME_SANDBOX_ENV): | |
52 env.pop(CHROME_SANDBOX_ENV) | |
53 | 55 |
54 | 56 |
55 def fix_python_path(cmd): | 57 def fix_python_path(cmd): |
56 """Returns the fixed command line to call the right python executable.""" | 58 """Returns the fixed command line to call the right python executable.""" |
57 out = cmd[:] | 59 out = cmd[:] |
58 if out[0] == 'python': | 60 if out[0] == 'python': |
59 out[0] = sys.executable | 61 out[0] = sys.executable |
60 elif out[0].endswith('.py'): | 62 elif out[0].endswith('.py'): |
61 out.insert(0, sys.executable) | 63 out.insert(0, sys.executable) |
62 return out | 64 return out |
63 | 65 |
64 | 66 |
65 def run_executable(cmd, env): | 67 def run_executable(cmd, env): |
66 """Runs an executable with: | 68 """Runs an executable with: |
67 - environment variable CR_SOURCE_ROOT set to the root directory. | 69 - environment variable CR_SOURCE_ROOT set to the root directory. |
68 - environment variable LANGUAGE to en_US.UTF-8. | 70 - environment variable LANGUAGE to en_US.UTF-8. |
69 - environment variable CHROME_DEVEL_SANDBOX set if need | 71 - environment variable CHROME_DEVEL_SANDBOX set if need |
70 - Reuses sys.executable automatically. | 72 - Reuses sys.executable automatically. |
71 """ | 73 """ |
72 # Many tests assume a English interface... | 74 # Many tests assume a English interface... |
73 env['LANG'] = 'en_US.UTF-8' | 75 env['LANG'] = 'en_US.UTF-8' |
74 # Used by base/base_paths_linux.cc as an override. Just make sure the default | 76 # Used by base/base_paths_linux.cc as an override. Just make sure the default |
75 # logic is used. | 77 # logic is used. |
76 env.pop('CR_SOURCE_ROOT', None) | 78 env.pop('CR_SOURCE_ROOT', None) |
77 enable_sandbox_if_required(env) | 79 enable_sandbox_if_required(cmd, env) |
78 # Ensure paths are correctly separated on windows. | 80 # Ensure paths are correctly separated on windows. |
79 cmd[0] = cmd[0].replace('/', os.path.sep) | 81 cmd[0] = cmd[0].replace('/', os.path.sep) |
80 cmd = fix_python_path(cmd) | 82 cmd = fix_python_path(cmd) |
81 try: | 83 try: |
82 return subprocess.call(cmd, env=env) | 84 return subprocess.call(cmd, env=env) |
83 except OSError: | 85 except OSError: |
84 print >> sys.stderr, 'Failed to start %s' % cmd | 86 print >> sys.stderr, 'Failed to start %s' % cmd |
85 raise | 87 raise |
86 | 88 |
87 | 89 |
88 def main(): | 90 def main(): |
89 return run_executable(sys.argv[1:], os.environ.copy()) | 91 return run_executable(sys.argv[1:], os.environ.copy()) |
90 | 92 |
91 | 93 |
92 if __name__ == '__main__': | 94 if __name__ == '__main__': |
93 sys.exit(main()) | 95 sys.exit(main()) |
OLD | NEW |