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

Side by Side Diff: build/android/pylib/gtest/gtest_test_instance.py

Issue 2141723002: [Android] Fix handling of intentional crashes during death tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 5 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 | « no previous file | build/android/pylib/gtest/gtest_test_instance_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import logging 5 import logging
6 import os 6 import os
7 import re 7 import re
8 import tempfile 8 import tempfile
9 9
10 from devil.android import apk_helper 10 from devil.android import apk_helper
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 'ShardNanoTimeout') 83 'ShardNanoTimeout')
84 _EXTRA_SHARD_SIZE_LIMIT = ( 84 _EXTRA_SHARD_SIZE_LIMIT = (
85 'org.chromium.native_test.NativeTestInstrumentationTestRunner.' 85 'org.chromium.native_test.NativeTestInstrumentationTestRunner.'
86 'ShardSizeLimit') 86 'ShardSizeLimit')
87 87
88 # TODO(jbudorick): Remove these once we're no longer parsing stdout to generate 88 # TODO(jbudorick): Remove these once we're no longer parsing stdout to generate
89 # results. 89 # results.
90 _RE_TEST_STATUS = re.compile( 90 _RE_TEST_STATUS = re.compile(
91 r'\[ +((?:RUN)|(?:FAILED)|(?:OK)|(?:CRASHED)) +\]' 91 r'\[ +((?:RUN)|(?:FAILED)|(?:OK)|(?:CRASHED)) +\]'
92 r' ?([^ ]+)?(?: \((\d+) ms\))?$') 92 r' ?([^ ]+)?(?: \((\d+) ms\))?$')
93 _RE_TEST_RUN_STATUS = re.compile(
94 r'\[ +(PASSED|RUNNER_FAILED|CRASHED) \] ?[^ ]+')
95 # Crash detection constants. 93 # Crash detection constants.
96 _RE_TEST_ERROR = re.compile(r'FAILURES!!! Tests run: \d+,' 94 _RE_TEST_ERROR = re.compile(r'FAILURES!!! Tests run: \d+,'
97 r' Failures: \d+, Errors: 1') 95 r' Failures: \d+, Errors: 1')
98 _RE_TEST_CURRENTLY_RUNNING = re.compile(r'\[ERROR:.*?\]' 96 _RE_TEST_CURRENTLY_RUNNING = re.compile(r'\[ERROR:.*?\]'
99 r' Currently running: (.*)') 97 r' Currently running: (.*)')
100 98
101 def ParseGTestListTests(raw_list): 99 def ParseGTestListTests(raw_list):
102 """Parses a raw test list as provided by --gtest_list_tests. 100 """Parses a raw test list as provided by --gtest_list_tests.
103 101
104 Args: 102 Args:
(...skipping 27 matching lines...) Expand all
132 130
133 131
134 def ParseGTestOutput(output): 132 def ParseGTestOutput(output):
135 """Parses raw gtest output and returns a list of results. 133 """Parses raw gtest output and returns a list of results.
136 134
137 Args: 135 Args:
138 output: A list of output lines. 136 output: A list of output lines.
139 Returns: 137 Returns:
140 A list of base_test_result.BaseTestResults. 138 A list of base_test_result.BaseTestResults.
141 """ 139 """
140 duration = 0
141 fallback_result_type = None
142 log = [] 142 log = []
143 result_type = None 143 result_type = None
144 results = [] 144 results = []
145 test_name = None 145 test_name = None
146 146
147 def handle_possibly_unknown_test(): 147 def handle_possibly_unknown_test():
148 if test_name is not None: 148 if test_name is not None:
149 results.append(base_test_result.BaseTestResult( 149 results.append(base_test_result.BaseTestResult(
150 test_name, base_test_result.ResultType.UNKNOWN, 0, 150 test_name,
151 log=('\n'.join(log) if log else ''))) 151 fallback_result_type or base_test_result.ResultType.UNKNOWN,
152 duration, log=('\n'.join(log) if log else '')))
152 153
153 for l in output: 154 for l in output:
154 logging.info(l) 155 logging.info(l)
155 matcher = _RE_TEST_STATUS.match(l) 156 matcher = _RE_TEST_STATUS.match(l)
156 if matcher: 157 if matcher:
157 if matcher.group(1) == 'RUN': 158 if matcher.group(1) == 'RUN':
158 handle_possibly_unknown_test() 159 handle_possibly_unknown_test()
160 duration = 0
161 fallback_result_type = None
159 log = [] 162 log = []
163 result_type = None
160 elif matcher.group(1) == 'OK': 164 elif matcher.group(1) == 'OK':
161 result_type = base_test_result.ResultType.PASS 165 result_type = base_test_result.ResultType.PASS
162 elif matcher.group(1) == 'FAILED': 166 elif matcher.group(1) == 'FAILED':
163 result_type = base_test_result.ResultType.FAIL 167 result_type = base_test_result.ResultType.FAIL
164 elif matcher.group(1) == 'CRASHED': 168 elif matcher.group(1) == 'CRASHED':
165 result_type = base_test_result.ResultType.CRASH 169 fallback_result_type = base_test_result.ResultType.CRASH
166 # Be aware that test name and status might not appear on same line. 170 # Be aware that test name and status might not appear on same line.
167 test_name = matcher.group(2) if matcher.group(2) else test_name 171 test_name = matcher.group(2) if matcher.group(2) else test_name
168 duration = int(matcher.group(3)) if matcher.group(3) else 0 172 duration = int(matcher.group(3)) if matcher.group(3) else 0
169 173
170 else: 174 else:
171 # Needs another matcher here to match crashes, like those of DCHECK. 175 # Needs another matcher here to match crashes, like those of DCHECK.
172 matcher = _RE_TEST_CURRENTLY_RUNNING.match(l) 176 matcher = _RE_TEST_CURRENTLY_RUNNING.match(l)
173 if matcher: 177 if matcher:
174 test_name = matcher.group(1) 178 test_name = matcher.group(1)
175 result_type = base_test_result.ResultType.CRASH 179 result_type = base_test_result.ResultType.CRASH
176 duration = 0 # Don't know. 180 duration = 0 # Don't know.
177 181
178 if log is not None: 182 if log is not None:
179 log.append(l) 183 log.append(l)
180 184
181 if result_type and test_name: 185 if result_type and test_name:
182 results.append(base_test_result.BaseTestResult( 186 results.append(base_test_result.BaseTestResult(
183 test_name, result_type, duration, 187 test_name, result_type, duration,
184 log=('\n'.join(log) if log else ''))) 188 log=('\n'.join(log) if log else '')))
185 log = None
186 result_type = None
187 test_name = None 189 test_name = None
188 190
189 handle_possibly_unknown_test() 191 handle_possibly_unknown_test()
190 192
191 return results 193 return results
192 194
193 195
194 class GtestTestInstance(test_instance.TestInstance): 196 class GtestTestInstance(test_instance.TestInstance):
195 197
196 def __init__(self, args, isolate_delegate, error_func): 198 def __init__(self, args, isolate_delegate, error_func):
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 if l and not l.startswith('#')] 410 if l and not l.startswith('#')]
409 411
410 return '*-%s' % ':'.join(disabled_filter_items) 412 return '*-%s' % ':'.join(disabled_filter_items)
411 413
412 #override 414 #override
413 def TearDown(self): 415 def TearDown(self):
414 """Clear the mappings created by SetUp.""" 416 """Clear the mappings created by SetUp."""
415 if self._isolate_delegate: 417 if self._isolate_delegate:
416 self._isolate_delegate.Clear() 418 self._isolate_delegate.Clear()
417 419
OLDNEW
« no previous file with comments | « no previous file | build/android/pylib/gtest/gtest_test_instance_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698