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

Side by Side Diff: testing/test_env.py

Issue 859293002: Fix report symbolization on swarming bots. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 10 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
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
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 msan_options.append('detect_leaks=1') 117 msan_options.append('detect_leaks=1')
118 extra_env['MSAN_OPTIONS'] = ' '.join(msan_options) 118 extra_env['MSAN_OPTIONS'] = ' '.join(msan_options)
119 119
120 if tsan: 120 if tsan:
121 tsan_options = symbolization_options[:] 121 tsan_options = symbolization_options[:]
122 extra_env['TSAN_OPTIONS'] = ' '.join(tsan_options) 122 extra_env['TSAN_OPTIONS'] = ' '.join(tsan_options)
123 123
124 return extra_env 124 return extra_env
125 125
126 126
127 def get_sanitizer_symbolize_command(json_path=None): 127 def get_sanitizer_symbolize_command(json_path=None, executable_path=None):
128 """Construct the command to invoke offline symbolization script.""" 128 """Construct the command to invoke offline symbolization script."""
129 script_path = '../tools/valgrind/asan/asan_symbolize.py' 129 script_path = '../tools/valgrind/asan/asan_symbolize.py'
130 cmd = [sys.executable, script_path] 130 cmd = [sys.executable, script_path]
131 if json_path is not None: 131 if json_path is not None:
132 cmd.append('--test-summary-json-file=%s' % json_path) 132 cmd.append('--test-summary-json-file=%s' % json_path)
133 if executable_path is not None:
134 cmd.append('--executable-path=%s' % executable_path)
133 return cmd 135 return cmd
134 136
135 137
136 def get_json_path(cmd): 138 def get_json_path(cmd):
137 """Extract the JSON test summary path from a command line.""" 139 """Extract the JSON test summary path from a command line."""
138 json_path_flag = '--test-launcher-summary-output=' 140 json_path_flag = '--test-launcher-summary-output='
139 for arg in cmd: 141 for arg in cmd:
140 if arg.startswith(json_path_flag): 142 if arg.startswith(json_path_flag):
141 return arg.split(json_path_flag).pop() 143 return arg.split(json_path_flag).pop()
142 return None 144 return None
143 145
144 146
145 def symbolize_snippets_in_json(cmd, env): 147 def symbolize_snippets_in_json(cmd, env):
146 """Symbolize output snippets inside the JSON test summary.""" 148 """Symbolize output snippets inside the JSON test summary."""
147 json_path = get_json_path(cmd) 149 json_path = get_json_path(cmd)
148 if json_path is None: 150 if json_path is None:
149 return 151 return
150 152
151 try: 153 try:
152 symbolize_command = get_sanitizer_symbolize_command(json_path=json_path) 154 symbolize_command = get_sanitizer_symbolize_command(
155 json_path=json_path, executable_path=cmd[0])
153 p = subprocess.Popen(symbolize_command, stderr=subprocess.PIPE, env=env) 156 p = subprocess.Popen(symbolize_command, stderr=subprocess.PIPE, env=env)
154 (_, stderr) = p.communicate() 157 (_, stderr) = p.communicate()
155 except OSError as e: 158 except OSError as e:
156 print 'Exception while symbolizing snippets: %s' % e 159 print 'Exception while symbolizing snippets: %s' % e
157 160
158 if p.returncode != 0: 161 if p.returncode != 0:
159 print "Error: failed to symbolize snippets in JSON:\n" 162 print "Error: failed to symbolize snippets in JSON:\n"
160 print stderr 163 print stderr
161 164
162 165
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 '\n'.join(' %s=%s' % 203 '\n'.join(' %s=%s' %
201 (k, v) for k, v in sorted(extra_env.iteritems())), 204 (k, v) for k, v in sorted(extra_env.iteritems())),
202 ' '.join(cmd))) 205 ' '.join(cmd)))
203 env.update(extra_env or {}) 206 env.update(extra_env or {})
204 try: 207 try:
205 # See above comment regarding offline symbolization. 208 # See above comment regarding offline symbolization.
206 if use_symbolization_script: 209 if use_symbolization_script:
207 # Need to pipe to the symbolizer script. 210 # Need to pipe to the symbolizer script.
208 p1 = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE, 211 p1 = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE,
209 stderr=sys.stdout) 212 stderr=sys.stdout)
210 p2 = subprocess.Popen(get_sanitizer_symbolize_command(), 213 p2 = subprocess.Popen(
211 env=env, stdin=p1.stdout) 214 get_sanitizer_symbolize_command(executable_path=cmd[0]),
215 env=env, stdin=p1.stdout)
212 p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 216 p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
213 p1.wait() 217 p1.wait()
214 p2.wait() 218 p2.wait()
215 # Also feed the out-of-band JSON output to the symbolizer script. 219 # Also feed the out-of-band JSON output to the symbolizer script.
216 symbolize_snippets_in_json(cmd, env) 220 symbolize_snippets_in_json(cmd, env)
217 return p1.returncode 221 return p1.returncode
218 else: 222 else:
219 return subprocess.call(cmd, env=env) 223 return subprocess.call(cmd, env=env)
220 except OSError: 224 except OSError:
221 print >> sys.stderr, 'Failed to start %s' % cmd 225 print >> sys.stderr, 'Failed to start %s' % cmd
222 raise 226 raise
223 227
224 228
225 def main(): 229 def main():
226 return run_executable(sys.argv[1:], os.environ.copy()) 230 return run_executable(sys.argv[1:], os.environ.copy())
227 231
228 232
229 if __name__ == '__main__': 233 if __name__ == '__main__':
230 sys.exit(main()) 234 sys.exit(main())
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698