| Index: third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py
|
| diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py
|
| index 46041d631483451ea67ee6db30f84c076cec0e3e..307720efc1d68d0b21cd7e29068c8af34ed225c5 100644
|
| --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py
|
| +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py
|
| @@ -38,10 +38,8 @@ from webkitpy.layout_tests.models import test_failures
|
| from webkitpy.layout_tests.models import test_results
|
| from webkitpy.tool import grammar
|
|
|
| -
|
| _log = logging.getLogger(__name__)
|
|
|
| -
|
| TestExpectations = test_expectations.TestExpectations
|
|
|
| # Export this so callers don't need to know about message pools.
|
| @@ -50,13 +48,14 @@ WorkerException = message_pool.WorkerException
|
|
|
| class TestRunInterruptedException(Exception):
|
| """Raised when a test run should be stopped immediately."""
|
| +
|
| def __init__(self, reason):
|
| Exception.__init__(self)
|
| self.reason = reason
|
| self.msg = reason
|
|
|
| def __reduce__(self):
|
| - return self.__class__, (self.reason,)
|
| + return self.__class__, (self.reason, )
|
|
|
|
|
| class LayoutTestRunner(object):
|
| @@ -96,9 +95,9 @@ class LayoutTestRunner(object):
|
| run_results.add(result, expected=True, test_is_slow=self._test_is_slow(test_name))
|
|
|
| self._printer.write_update('Sharding tests ...')
|
| - locked_shards, unlocked_shards = self._sharder.shard_tests(test_inputs,
|
| - int(self._options.child_processes), self._options.fully_parallel,
|
| - self._options.run_singly or (self._options.batch_size == 1))
|
| + locked_shards, unlocked_shards = self._sharder.shard_tests(test_inputs, int(self._options.child_processes),
|
| + self._options.fully_parallel, self._options.run_singly or
|
| + (self._options.batch_size == 1))
|
|
|
| # We don't have a good way to coordinate the workers so that they don't
|
| # try to run the shards that need a lock. The easiest solution is to
|
| @@ -142,8 +141,7 @@ class LayoutTestRunner(object):
|
| def _worker_factory(self, worker_connection):
|
| results_directory = self._results_directory
|
| if self._retry_attempt > 0:
|
| - results_directory = self._filesystem.join(self._results_directory,
|
| - 'retry_%d' % self._retry_attempt)
|
| + results_directory = self._filesystem.join(self._results_directory, 'retry_%d' % self._retry_attempt)
|
| self._filesystem.maybe_make_directory(results_directory)
|
| return Worker(worker_connection, results_directory, self._options)
|
|
|
| @@ -165,20 +163,18 @@ class LayoutTestRunner(object):
|
| self._mark_interrupted_tests_as_skipped(run_results)
|
| raise TestRunInterruptedException(message)
|
|
|
| - interrupt_if_at_failure_limit(
|
| - self._options.exit_after_n_failures,
|
| - run_results.unexpected_failures,
|
| - run_results,
|
| - "Exiting early after %d failures." % run_results.unexpected_failures)
|
| - interrupt_if_at_failure_limit(
|
| - self._options.exit_after_n_crashes_or_timeouts,
|
| - run_results.unexpected_crashes + run_results.unexpected_timeouts,
|
| - run_results,
|
| - # This differs from ORWT because it does not include WebProcess crashes.
|
| - "Exiting early after %d crashes and %d timeouts." % (run_results.unexpected_crashes, run_results.unexpected_timeouts))
|
| + interrupt_if_at_failure_limit(self._options.exit_after_n_failures, run_results.unexpected_failures, run_results,
|
| + "Exiting early after %d failures." % run_results.unexpected_failures)
|
| + interrupt_if_at_failure_limit(self._options.exit_after_n_crashes_or_timeouts,
|
| + run_results.unexpected_crashes + run_results.unexpected_timeouts,
|
| + run_results,
|
| + # This differs from ORWT because it does not include WebProcess crashes.
|
| + "Exiting early after %d crashes and %d timeouts." %
|
| + (run_results.unexpected_crashes, run_results.unexpected_timeouts))
|
|
|
| def _update_summary_with_result(self, run_results, result):
|
| - expected = self._expectations.matches_an_expected_result(result.test_name, result.type, self._options.pixel_tests or result.reftest_type, self._options.enable_sanitizer)
|
| + expected = self._expectations.matches_an_expected_result(result.test_name, result.type, self._options.pixel_tests or
|
| + result.reftest_type, self._options.enable_sanitizer)
|
| exp_str = self._expectations.get_expectations_string(result.test_name)
|
| got_str = self._expectations.expectation_to_string(result.type)
|
|
|
| @@ -284,10 +280,8 @@ class Worker(object):
|
|
|
| _log.debug("%s %s started" % (self._name, test_input.test_name))
|
| self._caller.post('started_test', test_input)
|
| - result = single_test_runner.run_single_test(
|
| - self._port, self._options, self._results_directory, self._name,
|
| - self._primary_driver, self._secondary_driver, test_input,
|
| - stop_when_done)
|
| + result = single_test_runner.run_single_test(self._port, self._options, self._results_directory, self._name,
|
| + self._primary_driver, self._secondary_driver, test_input, stop_when_done)
|
|
|
| result.shard_name = shard_name
|
| result.worker_name = self._name
|
| @@ -422,7 +416,7 @@ class Sharder(object):
|
| # The locked shards still need to be limited to self._max_locked_shards in order to not
|
| # overload the http server for the http tests.
|
| return (self._resize_shards(locked_virtual_shards + locked_shards, self._max_locked_shards, 'locked_shard'),
|
| - unlocked_virtual_shards + unlocked_shards)
|
| + unlocked_virtual_shards + unlocked_shards)
|
|
|
| def _shard_by_directory(self, test_inputs):
|
| """Returns two lists of shards, each shard containing all the files in a directory.
|
| @@ -464,8 +458,7 @@ class Sharder(object):
|
| # can handle multiple shards, we should probably do something like
|
| # limit this to no more than a quarter of all workers, e.g.:
|
| # return max(math.ceil(num_workers / 4.0), 1)
|
| - return (self._resize_shards(locked_shards, self._max_locked_shards, 'locked_shard'),
|
| - unlocked_slow_shards + unlocked_shards)
|
| + return (self._resize_shards(locked_shards, self._max_locked_shards, 'locked_shard'), unlocked_slow_shards + unlocked_shards)
|
|
|
| def _resize_shards(self, old_shards, max_new_shards, shard_name_prefix):
|
| """Takes a list of shards and redistributes the tests into no more
|
|
|