Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(367)

Side by Side Diff: testing/test_env.py

Issue 605063004: Pass lsan GYP variable to swarming's test_env so that we can disable the sandbox when it's set. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix nacl Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ppapi/native_client/tools/browser_tester/browser_tester.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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())
OLDNEW
« no previous file with comments | « ppapi/native_client/tools/browser_tester/browser_tester.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698