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 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 # TODO(glider): remove the symbolizer path once | 66 # TODO(glider): remove the symbolizer path once |
67 # https://code.google.com/p/address-sanitizer/issues/detail?id=134 is fixed. | 67 # https://code.google.com/p/address-sanitizer/issues/detail?id=134 is fixed. |
68 symbolizer_path = os.path.abspath(os.path.join(ROOT_DIR, 'third_party', | 68 symbolizer_path = os.path.abspath(os.path.join(ROOT_DIR, 'third_party', |
69 'llvm-build', 'Release+Asserts', 'bin', 'llvm-symbolizer')) | 69 'llvm-build', 'Release+Asserts', 'bin', 'llvm-symbolizer')) |
70 | 70 |
71 if lsan or tsan: | 71 if lsan or tsan: |
72 # LSan is not sandbox-compatible, so we can use online symbolization. In | 72 # LSan is not sandbox-compatible, so we can use online symbolization. In |
73 # fact, it needs symbolization to be able to apply suppressions. | 73 # fact, it needs symbolization to be able to apply suppressions. |
74 symbolization_options = ['symbolize=1', | 74 symbolization_options = ['symbolize=1', |
75 'external_symbolizer_path=%s' % symbolizer_path] | 75 'external_symbolizer_path=%s' % symbolizer_path] |
76 elif asan or msan: | 76 elif (asan or msan) and sys.platform not in ['win32', 'cygwin']: |
77 # ASan uses a script for offline symbolization. | 77 # ASan uses a script for offline symbolization, except on Windows. |
78 # Important note: when running ASan with leak detection enabled, we must use | 78 # Important note: when running ASan with leak detection enabled, we must use |
79 # the LSan symbolization options above. | 79 # the LSan symbolization options above. |
80 symbolization_options = ['symbolize=0'] | 80 symbolization_options = ['symbolize=0'] |
81 # Set the path to llvm-symbolizer to be used by asan_symbolize.py | 81 # Set the path to llvm-symbolizer to be used by asan_symbolize.py |
82 extra_env['LLVM_SYMBOLIZER_PATH'] = symbolizer_path | 82 extra_env['LLVM_SYMBOLIZER_PATH'] = symbolizer_path |
| 83 else: |
| 84 symbolization_options = [] |
83 | 85 |
84 if asan: | 86 if asan: |
85 asan_options = symbolization_options[:] | 87 asan_options = symbolization_options[:] |
86 if lsan: | 88 if lsan: |
87 asan_options.append('detect_leaks=1') | 89 asan_options.append('detect_leaks=1') |
88 | 90 |
89 extra_env['ASAN_OPTIONS'] = ' '.join(asan_options) | 91 if asan_options: |
| 92 extra_env['ASAN_OPTIONS'] = ' '.join(asan_options) |
90 | 93 |
91 if sys.platform == 'darwin': | 94 if sys.platform == 'darwin': |
92 isolate_output_dir = os.path.abspath(os.path.dirname(cmd[0])) | 95 isolate_output_dir = os.path.abspath(os.path.dirname(cmd[0])) |
93 # This is needed because the test binary has @executable_path embedded in | 96 # This is needed because the test binary has @executable_path embedded in |
94 # it that the OS tries to resolve to the cache directory and not the | 97 # it that the OS tries to resolve to the cache directory and not the |
95 # mapped directory. | 98 # mapped directory. |
96 extra_env['DYLD_LIBRARY_PATH'] = str(isolate_output_dir) | 99 extra_env['DYLD_LIBRARY_PATH'] = str(isolate_output_dir) |
97 | 100 |
98 if lsan: | 101 if lsan: |
99 if asan or msan: | 102 if asan or msan: |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 # Used by base/base_paths_linux.cc as an override. Just make sure the default | 179 # Used by base/base_paths_linux.cc as an override. Just make sure the default |
177 # logic is used. | 180 # logic is used. |
178 env.pop('CR_SOURCE_ROOT', None) | 181 env.pop('CR_SOURCE_ROOT', None) |
179 extra_env.update(get_sandbox_env(env)) | 182 extra_env.update(get_sandbox_env(env)) |
180 | 183 |
181 # Copy logic from tools/build/scripts/slave/runtest.py. | 184 # Copy logic from tools/build/scripts/slave/runtest.py. |
182 asan = '--asan=1' in cmd | 185 asan = '--asan=1' in cmd |
183 lsan = '--lsan=1' in cmd | 186 lsan = '--lsan=1' in cmd |
184 msan = '--msan=1' in cmd | 187 msan = '--msan=1' in cmd |
185 tsan = '--tsan=1' in cmd | 188 tsan = '--tsan=1' in cmd |
186 use_symbolization_script = (asan or msan) and not lsan | 189 if sys.platform in ['win32', 'cygwin']: |
| 190 # Symbolization works in-process on Windows even when sandboxed. |
| 191 use_symbolization_script = False |
| 192 else: |
| 193 # LSan doesn't support sandboxing yet, so we use the in-process symbolizer. |
| 194 # Note that ASan and MSan can work together with LSan. |
| 195 use_symbolization_script = (asan or msan) and not lsan |
187 | 196 |
188 if asan or lsan or msan or tsan: | 197 if asan or lsan or msan or tsan: |
189 extra_env.update(get_sanitizer_env(cmd, asan, lsan, msan, tsan)) | 198 extra_env.update(get_sanitizer_env(cmd, asan, lsan, msan, tsan)) |
190 | 199 |
191 if lsan or tsan: | 200 if lsan or tsan: |
192 # LSan and TSan are not sandbox-friendly. | 201 # LSan and TSan are not sandbox-friendly. |
193 cmd.append('--no-sandbox') | 202 cmd.append('--no-sandbox') |
194 | 203 |
195 cmd = trim_cmd(cmd) | 204 cmd = trim_cmd(cmd) |
196 | 205 |
(...skipping 28 matching lines...) Expand all Loading... |
225 print >> sys.stderr, 'Failed to start %s' % cmd | 234 print >> sys.stderr, 'Failed to start %s' % cmd |
226 raise | 235 raise |
227 | 236 |
228 | 237 |
229 def main(): | 238 def main(): |
230 return run_executable(sys.argv[1:], os.environ.copy()) | 239 return run_executable(sys.argv[1:], os.environ.copy()) |
231 | 240 |
232 | 241 |
233 if __name__ == '__main__': | 242 if __name__ == '__main__': |
234 sys.exit(main()) | 243 sys.exit(main()) |
OLD | NEW |