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

Side by Side Diff: third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py

Issue 2188623002: Change logging statements to not use the "%" operator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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 (C) 2010 Google Inc. All rights reserved. 1 # Copyright (C) 2010 Google Inc. All rights reserved.
2 # 2 #
3 # Redistribution and use in source and binary forms, with or without 3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are 4 # modification, are permitted provided that the following conditions are
5 # met: 5 # met:
6 # 6 #
7 # * Redistributions of source code must retain the above copyright 7 # * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer. 8 # notice, this list of conditions and the following disclaimer.
9 # * Redistributions in binary form must reproduce the above 9 # * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following disclaimer 10 # copyright notice, this list of conditions and the following disclaimer
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 file_name: The (human friendly) name or description of the file 326 file_name: The (human friendly) name or description of the file
327 you're looking for (e.g., "HTTP Server"). Used for error logging . 327 you're looking for (e.g., "HTTP Server"). Used for error logging .
328 override_step: An optional string to be logged if the check fails. 328 override_step: An optional string to be logged if the check fails.
329 more_logging: Whether or not to log the error messages. 329 more_logging: Whether or not to log the error messages.
330 330
331 Returns: 331 Returns:
332 True if the file exists, else False. 332 True if the file exists, else False.
333 """ 333 """
334 if not self._filesystem.exists(path_to_file): 334 if not self._filesystem.exists(path_to_file):
335 if more_logging: 335 if more_logging:
336 _log.error('Unable to find %s' % file_description) 336 _log.error('Unable to find %s', file_description)
337 _log.error(' at %s' % path_to_file) 337 _log.error(' at %s', path_to_file)
338 if override_step: 338 if override_step:
339 _log.error(' %s' % override_step) 339 _log.error(' %s', override_step)
340 _log.error('') 340 _log.error('')
341 return False 341 return False
342 return True 342 return True
343 343
344 def check_build(self, needs_http, printer): 344 def check_build(self, needs_http, printer):
345 result = True 345 result = True
346 346
347 dump_render_tree_binary_path = self._path_to_driver() 347 dump_render_tree_binary_path = self._path_to_driver()
348 result = self._check_file_exists(dump_render_tree_binary_path, 348 result = self._check_file_exists(dump_render_tree_binary_path,
349 'test driver') and result 349 'test driver') and result
(...skipping 19 matching lines...) Expand all
369 result = self._dump_reader.check_is_functional() and result 369 result = self._dump_reader.check_is_functional() and result
370 370
371 if needs_http: 371 if needs_http:
372 result = self.check_httpd() and result 372 result = self.check_httpd() and result
373 373
374 return test_run_results.OK_EXIT_STATUS if result else test_run_results.U NEXPECTED_ERROR_EXIT_STATUS 374 return test_run_results.OK_EXIT_STATUS if result else test_run_results.U NEXPECTED_ERROR_EXIT_STATUS
375 375
376 def _check_driver(self): 376 def _check_driver(self):
377 driver_path = self._path_to_driver() 377 driver_path = self._path_to_driver()
378 if not self._filesystem.exists(driver_path): 378 if not self._filesystem.exists(driver_path):
379 _log.error("%s was not found at %s" % (self.driver_name(), driver_pa th)) 379 _log.error("%s was not found at %s", self.driver_name(), driver_path )
380 return False 380 return False
381 return True 381 return True
382 382
383 def _check_port_build(self): 383 def _check_port_build(self):
384 # Ports can override this method to do additional checks. 384 # Ports can override this method to do additional checks.
385 return True 385 return True
386 386
387 def check_sys_deps(self, needs_http): 387 def check_sys_deps(self, needs_http):
388 """Checks whether the system is properly configured. 388 """Checks whether the system is properly configured.
389 389
(...skipping 21 matching lines...) Expand all
411 _log.error('') 411 _log.error('')
412 _log.error('For complete build requirements, please see:') 412 _log.error('For complete build requirements, please see:')
413 _log.error(self.BUILD_REQUIREMENTS_URL) 413 _log.error(self.BUILD_REQUIREMENTS_URL)
414 return test_run_results.SYS_DEPS_EXIT_STATUS 414 return test_run_results.SYS_DEPS_EXIT_STATUS
415 return test_run_results.OK_EXIT_STATUS 415 return test_run_results.OK_EXIT_STATUS
416 416
417 def check_image_diff(self): 417 def check_image_diff(self):
418 """Checks whether image_diff binary exists.""" 418 """Checks whether image_diff binary exists."""
419 image_diff_path = self._path_to_image_diff() 419 image_diff_path = self._path_to_image_diff()
420 if not self._filesystem.exists(image_diff_path): 420 if not self._filesystem.exists(image_diff_path):
421 _log.error("image_diff was not found at %s" % image_diff_path) 421 _log.error("image_diff was not found at %s", image_diff_path)
422 return False 422 return False
423 return True 423 return True
424 424
425 def check_pretty_patch(self, more_logging=True): 425 def check_pretty_patch(self, more_logging=True):
426 """Checks whether we can use the PrettyPatch ruby script.""" 426 """Checks whether we can use the PrettyPatch ruby script."""
427 try: 427 try:
428 _ = self._executive.run_command(['ruby', '--version']) 428 _ = self._executive.run_command(['ruby', '--version'])
429 except OSError as e: 429 except OSError as e:
430 if e.errno in [errno.ENOENT, errno.EACCES, errno.ECHILD]: 430 if e.errno in [errno.ENOENT, errno.EACCES, errno.ECHILD]:
431 if more_logging: 431 if more_logging:
432 _log.warning("Ruby is not installed; can't generate pretty p atches.") 432 _log.warning("Ruby is not installed; can't generate pretty p atches.")
433 _log.warning('') 433 _log.warning('')
434 return False 434 return False
435 435
436 if not self._filesystem.exists(self._pretty_patch_path): 436 if not self._filesystem.exists(self._pretty_patch_path):
437 if more_logging: 437 if more_logging:
438 _log.warning("Unable to find %s; can't generate pretty patches." % self._pretty_patch_path) 438 _log.warning("Unable to find %s; can't generate pretty patches." , self._pretty_patch_path)
439 _log.warning('') 439 _log.warning('')
440 return False 440 return False
441 441
442 return True 442 return True
443 443
444 def check_wdiff(self, more_logging=True): 444 def check_wdiff(self, more_logging=True):
445 if not self._path_to_wdiff(): 445 if not self._path_to_wdiff():
446 # Don't need to log here since this is the port choosing not to use wdiff. 446 # Don't need to log here since this is the port choosing not to use wdiff.
447 return False 447 return False
448 448
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 if not filesystem.isfile(reftest_list_path): 718 if not filesystem.isfile(reftest_list_path):
719 return None 719 return None
720 reftest_list_file = filesystem.read_text_file(reftest_list_path) 720 reftest_list_file = filesystem.read_text_file(reftest_list_path)
721 721
722 parsed_list = {} 722 parsed_list = {}
723 for line in reftest_list_file.split('\n'): 723 for line in reftest_list_file.split('\n'):
724 line = re.sub('#.+$', '', line) 724 line = re.sub('#.+$', '', line)
725 split_line = line.split() 725 split_line = line.split()
726 if len(split_line) == 4: 726 if len(split_line) == 4:
727 # FIXME: Probably one of mozilla's extensions in the reftest.lis t format. Do we need to support this? 727 # FIXME: Probably one of mozilla's extensions in the reftest.lis t format. Do we need to support this?
728 _log.warning("unsupported reftest.list line '%s' in %s" % (line, reftest_list_path)) 728 _log.warning("unsupported reftest.list line '%s' in %s", line, r eftest_list_path)
729 continue 729 continue
730 if len(split_line) < 3: 730 if len(split_line) < 3:
731 continue 731 continue
732 expectation_type, test_file, ref_file = split_line 732 expectation_type, test_file, ref_file = split_line
733 parsed_list.setdefault(filesystem.join(test_dirpath, test_file), []) .append( 733 parsed_list.setdefault(filesystem.join(test_dirpath, test_file), []) .append(
734 (expectation_type, filesystem.join(test_dirpath, ref_file))) 734 (expectation_type, filesystem.join(test_dirpath, ref_file)))
735 return parsed_list 735 return parsed_list
736 736
737 def reference_files(self, test_name): 737 def reference_files(self, test_name):
738 """Return a list of expectation (== or !=) and filename pairs""" 738 """Return a list of expectation (== or !=) and filename pairs"""
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 if line.startswith('#') or not len(line): 934 if line.startswith('#') or not len(line):
935 continue 935 continue
936 tests_to_skip.append(line) 936 tests_to_skip.append(line)
937 return tests_to_skip 937 return tests_to_skip
938 938
939 def _expectations_from_skipped_files(self, skipped_file_paths): 939 def _expectations_from_skipped_files(self, skipped_file_paths):
940 tests_to_skip = [] 940 tests_to_skip = []
941 for search_path in skipped_file_paths: 941 for search_path in skipped_file_paths:
942 filename = self._filesystem.join(self._webkit_baseline_path(search_p ath), "Skipped") 942 filename = self._filesystem.join(self._webkit_baseline_path(search_p ath), "Skipped")
943 if not self._filesystem.exists(filename): 943 if not self._filesystem.exists(filename):
944 _log.debug("Skipped does not exist: %s" % filename) 944 _log.debug("Skipped does not exist: %s", filename)
945 continue 945 continue
946 _log.debug("Using Skipped file: %s" % filename) 946 _log.debug("Using Skipped file: %s", filename)
947 skipped_file_contents = self._filesystem.read_text_file(filename) 947 skipped_file_contents = self._filesystem.read_text_file(filename)
948 tests_to_skip.extend(self._tests_from_skipped_file_contents(skipped_ file_contents)) 948 tests_to_skip.extend(self._tests_from_skipped_file_contents(skipped_ file_contents))
949 return tests_to_skip 949 return tests_to_skip
950 950
951 @memoized 951 @memoized
952 def skipped_perf_tests(self): 952 def skipped_perf_tests(self):
953 return self._expectations_from_skipped_files([self.perf_tests_dir()]) 953 return self._expectations_from_skipped_files([self.perf_tests_dir()])
954 954
955 def skips_perf_test(self, test_name): 955 def skips_perf_test(self, test_name):
956 for test_or_category in self.skipped_perf_tests(): 956 for test_or_category in self.skipped_perf_tests():
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 def create_driver(self, worker_number, no_timeout=False): 1117 def create_driver(self, worker_number, no_timeout=False):
1118 """Return a newly created Driver subclass for starting/stopping the test driver.""" 1118 """Return a newly created Driver subclass for starting/stopping the test driver."""
1119 return self._driver_class()(self, worker_number, pixel_tests=self.get_op tion('pixel_tests'), no_timeout=no_timeout) 1119 return self._driver_class()(self, worker_number, pixel_tests=self.get_op tion('pixel_tests'), no_timeout=no_timeout)
1120 1120
1121 def start_helper(self): 1121 def start_helper(self):
1122 """If a port needs to reconfigure graphics settings or do other 1122 """If a port needs to reconfigure graphics settings or do other
1123 things to ensure a known test configuration, it should override this 1123 things to ensure a known test configuration, it should override this
1124 method.""" 1124 method."""
1125 helper_path = self._path_to_helper() 1125 helper_path = self._path_to_helper()
1126 if helper_path: 1126 if helper_path:
1127 _log.debug("Starting layout helper %s" % helper_path) 1127 _log.debug("Starting layout helper %s", helper_path)
1128 # Note: Not thread safe: http://bugs.python.org/issue2320 1128 # Note: Not thread safe: http://bugs.python.org/issue2320
1129 self._helper = self._executive.popen([helper_path], 1129 self._helper = self._executive.popen([helper_path],
1130 stdin=self._executive.PIPE, std out=self._executive.PIPE, stderr=None) 1130 stdin=self._executive.PIPE, std out=self._executive.PIPE, stderr=None)
1131 is_ready = self._helper.stdout.readline() 1131 is_ready = self._helper.stdout.readline()
1132 if not is_ready.startswith('ready'): 1132 if not is_ready.startswith('ready'):
1133 _log.error("layout_test_helper failed to be ready") 1133 _log.error("layout_test_helper failed to be ready")
1134 1134
1135 def requires_http_server(self): 1135 def requires_http_server(self):
1136 """Does the port require an HTTP server for running tests? This could 1136 """Does the port require an HTTP server for running tests? This could
1137 be the case when the tests aren't run on the host platform.""" 1137 be the case when the tests aren't run on the host platform."""
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 # FIXME: rename this to test_expectations() once all the callers are upd ated to know about the ordered dict. 1284 # FIXME: rename this to test_expectations() once all the callers are upd ated to know about the ordered dict.
1285 expectations = collections.OrderedDict() 1285 expectations = collections.OrderedDict()
1286 1286
1287 for path in self.expectations_files(): 1287 for path in self.expectations_files():
1288 if self._filesystem.exists(path): 1288 if self._filesystem.exists(path):
1289 expectations[path] = self._filesystem.read_text_file(path) 1289 expectations[path] = self._filesystem.read_text_file(path)
1290 1290
1291 for path in self.get_option('additional_expectations', []): 1291 for path in self.get_option('additional_expectations', []):
1292 expanded_path = self._filesystem.expanduser(path) 1292 expanded_path = self._filesystem.expanduser(path)
1293 if self._filesystem.exists(expanded_path): 1293 if self._filesystem.exists(expanded_path):
1294 _log.debug("reading additional_expectations from path '%s'" % pa th) 1294 _log.debug("reading additional_expectations from path '%s'", pat h)
1295 expectations[path] = self._filesystem.read_text_file(expanded_pa th) 1295 expectations[path] = self._filesystem.read_text_file(expanded_pa th)
1296 else: 1296 else:
1297 _log.warning("additional_expectations path '%s' does not exist" % path) 1297 _log.warning("additional_expectations path '%s' does not exist", path)
1298 return expectations 1298 return expectations
1299 1299
1300 def bot_expectations(self): 1300 def bot_expectations(self):
1301 if not self.get_option('ignore_flaky_tests'): 1301 if not self.get_option('ignore_flaky_tests'):
1302 return {} 1302 return {}
1303 1303
1304 full_port_name = self.determine_full_port_name(self.host, self._options, self.port_name) 1304 full_port_name = self.determine_full_port_name(self.host, self._options, self.port_name)
1305 builder_category = self.get_option('ignore_builder_category', 'layout') 1305 builder_category = self.get_option('ignore_builder_category', 'layout')
1306 factory = BotTestExpectationsFactory(self.host.builders) 1306 factory = BotTestExpectationsFactory(self.host.builders)
1307 # FIXME: This only grabs release builder's flakiness data. If we're runn ing debug, 1307 # FIXME: This only grabs release builder's flakiness data. If we're runn ing debug,
1308 # when we should grab the debug builder's data. 1308 # when we should grab the debug builder's data.
1309 expectations = factory.expectations_for_port(full_port_name, builder_cat egory) 1309 expectations = factory.expectations_for_port(full_port_name, builder_cat egory)
1310 1310
1311 if not expectations: 1311 if not expectations:
1312 return {} 1312 return {}
1313 1313
1314 ignore_mode = self.get_option('ignore_flaky_tests') 1314 ignore_mode = self.get_option('ignore_flaky_tests')
1315 if ignore_mode == 'very-flaky' or ignore_mode == 'maybe-flaky': 1315 if ignore_mode == 'very-flaky' or ignore_mode == 'maybe-flaky':
1316 return expectations.flakes_by_path(ignore_mode == 'very-flaky') 1316 return expectations.flakes_by_path(ignore_mode == 'very-flaky')
1317 if ignore_mode == 'unexpected': 1317 if ignore_mode == 'unexpected':
1318 return expectations.unexpected_results_by_path() 1318 return expectations.unexpected_results_by_path()
1319 _log.warning("Unexpected ignore mode: '%s'." % ignore_mode) 1319 _log.warning("Unexpected ignore mode: '%s'.", ignore_mode)
1320 return {} 1320 return {}
1321 1321
1322 def expectations_files(self): 1322 def expectations_files(self):
1323 paths = [ 1323 paths = [
1324 self.path_to_generic_test_expectations_file(), 1324 self.path_to_generic_test_expectations_file(),
1325 self._filesystem.join(self.layout_tests_dir(), 'NeverFixTests'), 1325 self._filesystem.join(self.layout_tests_dir(), 'NeverFixTests'),
1326 self._filesystem.join(self.layout_tests_dir(), 'StaleTestExpectation s'), 1326 self._filesystem.join(self.layout_tests_dir(), 'StaleTestExpectation s'),
1327 self._filesystem.join(self.layout_tests_dir(), 'SlowTests'), 1327 self._filesystem.join(self.layout_tests_dir(), 'SlowTests'),
1328 ] 1328 ]
1329 if self.is_wptserve_enabled(): 1329 if self.is_wptserve_enabled():
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 try: 1386 try:
1387 # It's possible to raise a ScriptError we pass wdiff invalid paths. 1387 # It's possible to raise a ScriptError we pass wdiff invalid paths.
1388 return self._run_wdiff(actual_filename, expected_filename) 1388 return self._run_wdiff(actual_filename, expected_filename)
1389 except OSError as e: 1389 except OSError as e:
1390 if e.errno in [errno.ENOENT, errno.EACCES, errno.ECHILD]: 1390 if e.errno in [errno.ENOENT, errno.EACCES, errno.ECHILD]:
1391 # Silently ignore cases where wdiff is missing. 1391 # Silently ignore cases where wdiff is missing.
1392 self._wdiff_available = False 1392 self._wdiff_available = False
1393 return "" 1393 return ""
1394 raise 1394 raise
1395 except ScriptError as e: 1395 except ScriptError as e:
1396 _log.error("Failed to run wdiff: %s" % e) 1396 _log.error("Failed to run wdiff: %s", e)
1397 self._wdiff_available = False 1397 self._wdiff_available = False
1398 return self._wdiff_error_html 1398 return self._wdiff_error_html
1399 1399
1400 # This is a class variable so we can test error output easily. 1400 # This is a class variable so we can test error output easily.
1401 _pretty_patch_error_html = "Failed to run PrettyPatch, see error log." 1401 _pretty_patch_error_html = "Failed to run PrettyPatch, see error log."
1402 1402
1403 def pretty_patch_text(self, diff_path): 1403 def pretty_patch_text(self, diff_path):
1404 if self._pretty_patch_available is None: 1404 if self._pretty_patch_available is None:
1405 self._pretty_patch_available = self.check_pretty_patch(more_logging= False) 1405 self._pretty_patch_available = self.check_pretty_patch(more_logging= False)
1406 if not self._pretty_patch_available: 1406 if not self._pretty_patch_available:
1407 return self._pretty_patch_error_html 1407 return self._pretty_patch_error_html
1408 command = ("ruby", "-I", self._filesystem.dirname(self._pretty_patch_pat h), 1408 command = ("ruby", "-I", self._filesystem.dirname(self._pretty_patch_pat h),
1409 self._pretty_patch_path, diff_path) 1409 self._pretty_patch_path, diff_path)
1410 try: 1410 try:
1411 # Diffs are treated as binary (we pass decode_output=False) as they 1411 # Diffs are treated as binary (we pass decode_output=False) as they
1412 # may contain multiple files of conflicting encodings. 1412 # may contain multiple files of conflicting encodings.
1413 return self._executive.run_command(command, decode_output=False) 1413 return self._executive.run_command(command, decode_output=False)
1414 except OSError as e: 1414 except OSError as e:
1415 # If the system is missing ruby log the error and stop trying. 1415 # If the system is missing ruby log the error and stop trying.
1416 self._pretty_patch_available = False 1416 self._pretty_patch_available = False
1417 _log.error("Failed to run PrettyPatch (%s): %s" % (command, e)) 1417 _log.error("Failed to run PrettyPatch (%s): %s", command, e)
1418 return self._pretty_patch_error_html 1418 return self._pretty_patch_error_html
1419 except ScriptError as e: 1419 except ScriptError as e:
1420 # If ruby failed to run for some reason, log the command 1420 # If ruby failed to run for some reason, log the command
1421 # output and stop trying. 1421 # output and stop trying.
1422 self._pretty_patch_available = False 1422 self._pretty_patch_available = False
1423 _log.error("Failed to run PrettyPatch (%s):\n%s" % (command, e.messa ge_with_output())) 1423 _log.error("Failed to run PrettyPatch (%s):\n%s", command, e.message _with_output())
1424 return self._pretty_patch_error_html 1424 return self._pretty_patch_error_html
1425 1425
1426 def default_configuration(self): 1426 def default_configuration(self):
1427 return 'Release' 1427 return 'Release'
1428 1428
1429 def clobber_old_port_specific_results(self): 1429 def clobber_old_port_specific_results(self):
1430 pass 1430 pass
1431 1431
1432 # FIXME: This does not belong on the port object. 1432 # FIXME: This does not belong on the port object.
1433 @memoized 1433 @memoized
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1669 if path: 1669 if path:
1670 return [path] 1670 return [path]
1671 return [] 1671 return []
1672 1672
1673 def _symbols_string(self): 1673 def _symbols_string(self):
1674 symbols = '' 1674 symbols = ''
1675 for path_to_module in self._modules_to_search_for_symbols(): 1675 for path_to_module in self._modules_to_search_for_symbols():
1676 try: 1676 try:
1677 symbols += self._executive.run_command(['nm', path_to_module], e rror_handler=self._executive.ignore_error) 1677 symbols += self._executive.run_command(['nm', path_to_module], e rror_handler=self._executive.ignore_error)
1678 except OSError as e: 1678 except OSError as e:
1679 _log.warn("Failed to run nm: %s. Can't determine supported feat ures correctly." % e) 1679 _log.warning("Failed to run nm: %s. Can't determine supported f eatures correctly.", e)
1680 return symbols 1680 return symbols
1681 1681
1682 # Ports which use compile-time feature detection should define this method a nd return 1682 # Ports which use compile-time feature detection should define this method a nd return
1683 # a dictionary mapping from symbol substrings to possibly disabled test dire ctories. 1683 # a dictionary mapping from symbol substrings to possibly disabled test dire ctories.
1684 # When the symbol substrings are not matched, the directories will be skippe d. 1684 # When the symbol substrings are not matched, the directories will be skippe d.
1685 # If ports don't ever enable certain features, then those directories can ju st be 1685 # If ports don't ever enable certain features, then those directories can ju st be
1686 # in the Skipped list instead of compile-time-checked here. 1686 # in the Skipped list instead of compile-time-checked here.
1687 def _missing_symbol_to_skipped_tests(self): 1687 def _missing_symbol_to_skipped_tests(self):
1688 if self.PORT_HAS_AUDIO_CODECS_BUILT_IN: 1688 if self.PORT_HAS_AUDIO_CODECS_BUILT_IN:
1689 return {} 1689 return {}
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1787 1787
1788 def __init__(self, base, args, reference_args=None): 1788 def __init__(self, base, args, reference_args=None):
1789 self.name = base 1789 self.name = base
1790 self.base = base 1790 self.base = base
1791 self.args = args 1791 self.args = args
1792 self.reference_args = args if reference_args is None else reference_args 1792 self.reference_args = args if reference_args is None else reference_args
1793 self.tests = set() 1793 self.tests = set()
1794 1794
1795 def __repr__(self): 1795 def __repr__(self):
1796 return "PhysicalTestSuite('%s', '%s', %s, %s)" % (self.name, self.base, self.args, self.reference_args) 1796 return "PhysicalTestSuite('%s', '%s', %s, %s)" % (self.name, self.base, self.args, self.reference_args)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698