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

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

Issue 2362143002: [Android] Add experimental gtest xml result handling. (Closed)
Patch Set: Created 4 years, 3 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 # 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 HTMLParser
5 import logging 6 import logging
6 import os 7 import os
7 import re 8 import re
8 import tempfile 9 import tempfile
10 import xml.etree.ElementTree
9 11
10 from devil.android import apk_helper 12 from devil.android import apk_helper
11 from pylib import constants 13 from pylib import constants
12 from pylib.constants import host_paths 14 from pylib.constants import host_paths
13 from pylib.base import base_test_result 15 from pylib.base import base_test_result
14 from pylib.base import test_instance 16 from pylib.base import test_instance
15 from pylib.utils import isolator 17 from pylib.utils import isolator
16 18
17 with host_paths.SysPath(host_paths.BUILD_COMMON_PATH): 19 with host_paths.SysPath(host_paths.BUILD_COMMON_PATH):
18 import unittest_util # pylint: disable=import-error 20 import unittest_util # pylint: disable=import-error
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 results.append(base_test_result.BaseTestResult( 164 results.append(base_test_result.BaseTestResult(
163 test_name, result_type, duration, 165 test_name, result_type, duration,
164 log=('\n'.join(log) if log else ''))) 166 log=('\n'.join(log) if log else '')))
165 test_name = None 167 test_name = None
166 168
167 handle_possibly_unknown_test() 169 handle_possibly_unknown_test()
168 170
169 return results 171 return results
170 172
171 173
174 def ParseGTestXML(xml_content):
175 """Parse gtest XML result."""
176 results = []
177
178 html = HTMLParser.HTMLParser()
179
180 # TODO(jbudorick): Unclear how this handles crashes.
181 testsuites = xml.etree.ElementTree.fromstring(xml_content)
182 for testsuite in testsuites:
183 suite_name = testsuite.attrib['name']
184 for testcase in testsuite:
185 case_name = testcase.attrib['name']
186 result_type = base_test_result.ResultType.PASS
187 log = []
188 for failure in testcase:
189 result_type = base_test_result.ResultType.FAIL
190 log.append(html.unescape(failure.attrib['message']))
191
192 results.append(base_test_result.BaseTestResult(
193 '%s.%s' % (suite_name, case_name),
194 result_type,
195 int(float(testcase.attrib['time']) * 1000),
196 log=('\n'.join(log) if log else '')))
197
198 return results
199
200
172 class GtestTestInstance(test_instance.TestInstance): 201 class GtestTestInstance(test_instance.TestInstance):
173 202
174 def __init__(self, args, isolate_delegate, error_func): 203 def __init__(self, args, isolate_delegate, error_func):
175 super(GtestTestInstance, self).__init__() 204 super(GtestTestInstance, self).__init__()
176 # TODO(jbudorick): Support multiple test suites. 205 # TODO(jbudorick): Support multiple test suites.
177 if len(args.suite_name) > 1: 206 if len(args.suite_name) > 1:
178 raise ValueError('Platform mode currently supports only 1 gtest suite') 207 raise ValueError('Platform mode currently supports only 1 gtest suite')
179 self._extract_test_list_from_filter = args.extract_test_list_from_filter 208 self._extract_test_list_from_filter = args.extract_test_list_from_filter
180 self._shard_timeout = args.shard_timeout 209 self._shard_timeout = args.shard_timeout
181 self._suite = args.suite_name[0] 210 self._suite = args.suite_name[0]
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 self._app_data_file_dir = args.app_data_file_dir 273 self._app_data_file_dir = args.app_data_file_dir
245 else: 274 else:
246 self._app_data_file_dir = tempfile.mkdtemp() 275 self._app_data_file_dir = tempfile.mkdtemp()
247 logging.critical('Saving app files to %s', self._app_data_file_dir) 276 logging.critical('Saving app files to %s', self._app_data_file_dir)
248 else: 277 else:
249 self._app_data_files = None 278 self._app_data_files = None
250 self._app_data_file_dir = None 279 self._app_data_file_dir = None
251 280
252 self._test_arguments = args.test_arguments 281 self._test_arguments = args.test_arguments
253 282
283 # TODO(jbudorick): Remove this once it's deployed.
284 self._enable_xml_result_parsing = args.enable_xml_result_parsing
285
254 @property 286 @property
255 def activity(self): 287 def activity(self):
256 return self._apk_helper and self._apk_helper.GetActivityName() 288 return self._apk_helper and self._apk_helper.GetActivityName()
257 289
258 @property 290 @property
259 def apk(self): 291 def apk(self):
260 return self._apk_helper and self._apk_helper.path 292 return self._apk_helper and self._apk_helper.path
261 293
262 @property 294 @property
263 def apk_helper(self): 295 def apk_helper(self):
264 return self._apk_helper 296 return self._apk_helper
265 297
266 @property 298 @property
267 def app_file_dir(self): 299 def app_file_dir(self):
268 return self._app_data_file_dir 300 return self._app_data_file_dir
269 301
270 @property 302 @property
271 def app_files(self): 303 def app_files(self):
272 return self._app_data_files 304 return self._app_data_files
273 305
274 @property 306 @property
307 def enable_xml_result_parsing(self):
308 return self._enable_xml_result_parsing
309
310 @property
275 def exe_dist_dir(self): 311 def exe_dist_dir(self):
276 return self._exe_dist_dir 312 return self._exe_dist_dir
277 313
278 @property 314 @property
279 def extras(self): 315 def extras(self):
280 return self._extras 316 return self._extras
281 317
282 @property 318 @property
283 def gtest_filter(self): 319 def gtest_filter(self):
284 return self._gtest_filter 320 return self._gtest_filter
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 if l and not l.startswith('#')] 417 if l and not l.startswith('#')]
382 418
383 return '*-%s' % ':'.join(disabled_filter_items) 419 return '*-%s' % ':'.join(disabled_filter_items)
384 420
385 #override 421 #override
386 def TearDown(self): 422 def TearDown(self):
387 """Clear the mappings created by SetUp.""" 423 """Clear the mappings created by SetUp."""
388 if self._isolate_delegate: 424 if self._isolate_delegate:
389 self._isolate_delegate.Clear() 425 self._isolate_delegate.Clear()
390 426
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698