Changeset 213722 in webkit


Ignore:
Timestamp:
Mar 10, 2017 11:24:47 AM (7 years ago)
Author:
commit-queue@webkit.org
Message:

Add support for Bindings EWS
https://bugs.webkit.org/show_bug.cgi?id=169308

Patch by Srinivasan Vijayaraghavan <svijayaraghavan@apple.com> on 2017-03-10
Reviewed by Alexey Proskuryakov.

  • Scripts/webkitpy/common/config/ews.json: Add bindings-ews. Can test without building; should_build = False.
  • Scripts/webkitpy/common/net/bindingstestresults.py:

(BindingsTestResults.init): Removed 'errors'.
(BindingsTestResults.results_from_string): Ditto.
(BindingsTestResults.is_subset): Ditto.
(BindingsTestResults.equals): Ditto.
(BindingsTestResults.all_passed): Ditto.
(BindingsTestResults.failing_tests): Ditto.

  • Scripts/webkitpy/common/net/bindingstestresults_unittest.py:

(BindingsTestResultsTest.test_results_from_string): Removed 'errors'.
(BindingsTestResultsTest.test_results_from_string_success): Removed 'errors'.

  • Scripts/webkitpy/tool/bot/earlywarningsystemtask.py:

(EarlyWarningSystemTask.init): Add should_build parameter.
(EarlyWarningSystemTask.run): Check should_build before calling self._build().

  • Scripts/webkitpy/tool/bot/retrylogic_unittest.py: Renamed from Tools/Scripts/webkitpy/tool/bot/jscews_unittest.py.

(MockBindingsEarlyWarningSystem): Based of MockJSCEarlyWarningSystem. Mocked so we can provide test results.
(MockBindingsEarlyWarningSystem.init): Sets attributes.
(MockBindingsEarlyWarningSystem.test_results): Returns test results provided by us, instead of JSON output.
(BindingsEarlyWarningSystemTest): Class to test retry logic in below situations.
(BindingsEarlyWarningSystemTest._results_indicate_all_passed): False if None or or has failures, else True.
(BindingsEarlyWarningSystemTest._create_task):
(BindingsEarlyWarningSystemTest.test_success_case): Clean patch on clean tree.
(BindingsEarlyWarningSystemTest.test_test_failure): Red patch on clean tree.
(BindingsEarlyWarningSystemTest.test_fix): Clean patch on red tree.
(BindingsEarlyWarningSystemTest.test_ineffective_patch): Red patch on red tree.
(BindingsEarlyWarningSystemTest.test_partially_effective_patch): Red patch on redder tree.
(BindingsEarlyWarningSystemTest.test_different_test_failures_in_patch_and_tree): Red patch on red tree.

  • Scripts/webkitpy/tool/bot/patchanalysistask.py:

(PatchAnalysisTask._build_and_test_without_patch): Don't build if should_build is False (eg. on Bindings EWS).
(PatchAnalysisTask._retry_bindings_tests): Retry logic for Bindings tests.
(PatchAnalysisTask._test_patch): If tests failed on Bindings EWS, and call _retry_bindings_tests.

  • Scripts/webkitpy/tool/commands/earlywarningsystem.py:

(AbstractEarlyWarningSystem.begin_work_queue): Use BindingsTestResultsReader on Bindings EWS.
(AbstractEarlyWarningSystem._create_task): Pass should_build argument.
(AbstractEarlyWarningSystem.load_ews_classes): Add should_build argument (True by default).

  • Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py:

(TestBindingsEWS): Bindings EWS class, derived from AbstractEarlyWarningSystem.
(AbstractEarlyWarningSystemTest.test_failing_bindings_tests_message): Unit test message posted to Bugzilla.
(EarlyWarningSystemTest._default_expected_logs): Not building on all ewses anymore; make build line optional.
(EarlyWarningSystemTest.test_ews_name): Add bindings-ews.

  • Scripts/webkitpy/tool/steps/checkpatchrelevance.py:

(CheckPatchRelevance): Add bindings paths.
(CheckPatchRelevance._changes_are_relevant): Cleaner way to check if we should perform this step.

  • Scripts/webkitpy/tool/steps/steps_unittest.py: Add unit tests for Bindings EWS patch relevance.

(test_patch_relevant_bindings): Test for patch relevant to bindings.
(test_patch_not_relevant_bindings): Test for patch not relevant to bindings.

Location:
trunk/Tools
Files:
10 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r213719 r213722  
     12017-03-10  Srinivasan Vijayaraghavan  <svijayaraghavan@apple.com>
     2
     3        Add support for Bindings EWS
     4        https://bugs.webkit.org/show_bug.cgi?id=169308
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        * Scripts/webkitpy/common/config/ews.json: Add bindings-ews. Can test without building; should_build = False.
     9        * Scripts/webkitpy/common/net/bindingstestresults.py:
     10        (BindingsTestResults.__init__): Removed 'errors'.
     11        (BindingsTestResults.results_from_string): Ditto.
     12        (BindingsTestResults.is_subset): Ditto.
     13        (BindingsTestResults.equals): Ditto.
     14        (BindingsTestResults.all_passed): Ditto.
     15        (BindingsTestResults.failing_tests): Ditto.
     16        * Scripts/webkitpy/common/net/bindingstestresults_unittest.py:
     17        (BindingsTestResultsTest.test_results_from_string): Removed 'errors'.
     18        (BindingsTestResultsTest.test_results_from_string_success): Removed 'errors'.
     19        * Scripts/webkitpy/tool/bot/earlywarningsystemtask.py:
     20        (EarlyWarningSystemTask.__init__): Add should_build parameter.
     21        (EarlyWarningSystemTask.run): Check should_build before calling self._build().
     22        * Scripts/webkitpy/tool/bot/retrylogic_unittest.py: Renamed from Tools/Scripts/webkitpy/tool/bot/jscews_unittest.py.
     23        (MockBindingsEarlyWarningSystem): Based of MockJSCEarlyWarningSystem. Mocked so we can provide test results.
     24        (MockBindingsEarlyWarningSystem.__init__): Sets attributes.
     25        (MockBindingsEarlyWarningSystem.test_results): Returns test results provided by us, instead of JSON output.
     26        (BindingsEarlyWarningSystemTest): Class to test retry logic in below situations.
     27        (BindingsEarlyWarningSystemTest._results_indicate_all_passed): False if None or or has failures, else True.
     28        (BindingsEarlyWarningSystemTest._create_task):
     29        (BindingsEarlyWarningSystemTest.test_success_case): Clean patch on clean tree.
     30        (BindingsEarlyWarningSystemTest.test_test_failure): Red patch on clean tree.
     31        (BindingsEarlyWarningSystemTest.test_fix): Clean patch on red tree.
     32        (BindingsEarlyWarningSystemTest.test_ineffective_patch): Red patch on red tree.
     33        (BindingsEarlyWarningSystemTest.test_partially_effective_patch): Red patch on redder tree.
     34        (BindingsEarlyWarningSystemTest.test_different_test_failures_in_patch_and_tree): Red patch on red tree.
     35        * Scripts/webkitpy/tool/bot/patchanalysistask.py:
     36        (PatchAnalysisTask._build_and_test_without_patch): Don't build if should_build is False (eg. on Bindings EWS).
     37        (PatchAnalysisTask._retry_bindings_tests): Retry logic for Bindings tests.
     38        (PatchAnalysisTask._test_patch): If tests failed on Bindings EWS, and call _retry_bindings_tests.
     39        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
     40        (AbstractEarlyWarningSystem.begin_work_queue): Use BindingsTestResultsReader on Bindings EWS.
     41        (AbstractEarlyWarningSystem._create_task): Pass should_build argument.
     42        (AbstractEarlyWarningSystem.load_ews_classes): Add should_build argument (True by default).
     43        * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py:
     44        (TestBindingsEWS): Bindings EWS class, derived from AbstractEarlyWarningSystem.
     45        (AbstractEarlyWarningSystemTest.test_failing_bindings_tests_message): Unit test message posted to Bugzilla.
     46        (EarlyWarningSystemTest._default_expected_logs): Not building on all ewses anymore; make build line optional.
     47        (EarlyWarningSystemTest.test_ews_name): Add bindings-ews.
     48        * Scripts/webkitpy/tool/steps/checkpatchrelevance.py:
     49        (CheckPatchRelevance): Add bindings paths.
     50        (CheckPatchRelevance._changes_are_relevant): Cleaner way to check if we should perform this step.
     51        * Scripts/webkitpy/tool/steps/steps_unittest.py: Add unit tests for Bindings EWS patch relevance.
     52        (test_patch_relevant_bindings): Test for patch relevant to bindings.
     53        (test_patch_not_relevant_bindings): Test for patch not relevant to bindings.
     54
    1552017-03-09  Simon Fraser  <simon.fraser@apple.com>
    256
  • trunk/Tools/Scripts/webkitpy/common/config/ews.json

    r213654 r213722  
    5252        "group": "jsc",
    5353        "runTests": true
     54    },
     55    "Bindings EWS": {
     56        "port": "mac",
     57        "name": "bindings-ews",
     58        "group": "bindings",
     59        "runTests": true,
     60        "shouldBuild": false
    5461    }
    5562}
  • trunk/Tools/Scripts/webkitpy/common/net/bindingstestresults.py

    r213321 r213722  
    2929
    3030class BindingsTestResults(AbstractTestResults):
    31     def __init__(self, failures, errors):
     31    def __init__(self, failures):
    3232        self._failures = failures
    33         self._errors = errors
    34 
    35         self._failing_test_names = failures + errors
    3633
    3734    @classmethod
     
    4138            return None
    4239
    43         if 'failures' not in parsed_results or 'errors' not in parsed_results:
     40        if 'failures' not in parsed_results:
    4441            return None
    4542
    46         return cls(parsed_results['failures'], parsed_results['errors'])
     43        return cls(parsed_results['failures'])
    4744
    4845    def is_subset(self, other):
    49         return set(self._failures) <= set(other._failures) and set(self._errors) <= set(other._errors)
     46        return set(self._failures) <= set(other._failures)
    5047
    5148    def equals(self, other):
    52         return set(self._failures) == set(other._failures) and set(self._errors) == set(other._errors)
     49        return set(self._failures) == set(other._failures)
    5350
    5451    def all_passed(self):
    55         return not self._failures and not self._errors
     52        return not self._failures
    5653
    5754    def failing_tests(self):
    58         return self._failing_test_names
     55        return self._failures
    5956
    6057    # No defined failure limit for bindings tests.
  • trunk/Tools/Scripts/webkitpy/common/net/bindingstestresults_unittest.py

    r213321 r213722  
    2828class BindingsTestResultsTest(unittest.TestCase):
    2929    def test_results_from_string(self):
    30         incomplete_json_v1 = '{"failures": []}'
    31         incomplete_json_v2 = '{"errors":[]}'
    32         self.assertEqual(None, BindingsTestResults.results_from_string(incomplete_json_v1))
    33         self.assertEqual(None, BindingsTestResults.results_from_string(incomplete_json_v2))
     30        incomplete_json = '{"key2": []}'
     31        self.assertEqual(None, BindingsTestResults.results_from_string(incomplete_json))
    3432
    3533    def test_results_from_string_success(self):
    36         no_failures_string = '{"failures": [], "errors":[]}'
    37         no_failures_results = BindingsTestResults([], [])
     34        no_failures_string = '{"failures": []}'
     35        no_failures_results = BindingsTestResults([])
    3836        self.assertTrue(no_failures_results.equals(BindingsTestResults.results_from_string(no_failures_string)))
    3937        self.assertTrue(no_failures_results.all_passed())
    4038
    41         test_string = '{"failures": ["failure1"], "errors": ["error1", "error2"]}'
    42         test_results = BindingsTestResults(["failure1"], ["error1", "error2"])
     39        test_string = '{"failures": ["failure1"]}'
     40        test_results = BindingsTestResults(["failure1"])
    4341        self.assertTrue(test_results.equals(BindingsTestResults.results_from_string(test_string)))
  • trunk/Tools/Scripts/webkitpy/tool/bot/earlywarningsystemtask.py

    r212579 r213722  
    3636
    3737class EarlyWarningSystemTask(PatchAnalysisTask):
    38     def __init__(self, delegate, patch, should_run_tests=True):
     38    def __init__(self, delegate, patch, should_run_tests=True, should_build=True):
    3939        PatchAnalysisTask.__init__(self, delegate, patch)
    4040        self._should_run_tests = should_run_tests
     41        self._should_build = should_build
    4142
    4243    def validate(self):
     
    6263        if not self._check_patch_relevance():
    6364            raise PatchIsNotApplicable(self._patch)
    64         if not self._build():
    65             if not self._build_without_patch():
    66                 return False
    67             return self.report_failure()
     65        if self._should_build:
     66            if not self._build():
     67                if not self._build_without_patch():
     68                    return False
     69                return self.report_failure()
    6870        if not self._should_run_tests:
    6971            return True
  • trunk/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py

    r212579 r213722  
    187187            "--force-clean",
    188188            "--no-update",
    189             "--build",
    190189            "--test",
    191190            "--non-interactive",
    192191            "--build-style=%s" % self._delegate.build_style(),
    193192        ]
     193
     194        if getattr(self._delegate, 'should_build', True):
     195            args.append("--build")
    194196
    195197        if hasattr(self._delegate, 'group'):
     
    236238        return False
    237239
     240    def _retry_bindings_tests(self):
     241        first_results = self._delegate.test_results()
     242        first_script_error = self._script_error
     243        first_failure_status_id = self.failure_status_id
     244        if first_results is None:
     245            return False
     246
     247        # Some errors are not correctly reported by the run-bindings-tests script
     248        # https://bugs.webkit.org/show_bug.cgi?id=169449
     249        # In affected cases, add a message requesting to look at test output instead.
     250        if not first_results._failures:
     251            first_results._failures = ["Please see test output for results"]
     252
     253        self._build_and_test_without_patch()
     254        clean_tree_results = self._delegate.test_results()
     255        if clean_tree_results is None:
     256            return False
     257
     258        if first_results.is_subset(clean_tree_results):
     259            return True
     260
     261        self.failure_status_id = first_failure_status_id
     262        return self.report_failure(None, first_results, first_script_error)
     263
    238264    # FIXME: Abstract out common parts of the retry logic.
    239265    def _retry_jsc_tests(self):
     
    339365        if hasattr(self._delegate, 'group') and self._delegate.group() == "jsc":
    340366            return self._retry_jsc_tests()
     367        elif hasattr(self._delegate, 'group') and self._delegate.group() == "bindings":
     368            return self._retry_bindings_tests()
    341369        else:
    342370            return self._retry_layout_tests()
  • trunk/Tools/Scripts/webkitpy/tool/bot/retrylogic_unittest.py

    r213719 r213722  
    2424import unittest
    2525
     26from webkitpy.common.net.bindingstestresults import BindingsTestResults
    2627from webkitpy.common.net.jsctestresults import JSCTestResults
    2728from webkitpy.common.system.executive import ScriptError
     
    217218        self.assertTrue(return_value)
    218219        self.assertEqual(task.test_run_count(), 3)
     220
     221
     222class MockBindingsEarlyWarningSystem(AbstractEarlyWarningSystem):
     223    def __init__(self, first_test_results, clean_test_results):
     224        AbstractEarlyWarningSystem.__init__(self)
     225        self._group = 'bindings'
     226        self._results_in_order = [clean_test_results, first_test_results]
     227
     228    def test_results(self):
     229        return self._results_in_order.pop()
     230
     231
     232class BindingsEarlyWarningSystemTest(unittest.TestCase):
     233    def _results_indicate_all_passed(self, results):
     234        if results == None:
     235            return False
     236        return results.all_passed()
     237
     238    def _create_task(self, first_test_results, clean_test_results):
     239        queue = MockBindingsEarlyWarningSystem(first_test_results, clean_test_results)
     240        tool = MockTool(log_executive=True)
     241        patch = tool.bugs.fetch_attachment(10000)
     242        patches_passed_all_tests = [self._results_indicate_all_passed(first_test_results)]
     243        return MockPatchAnalysisTask(queue, patch, patches_passed_all_tests)
     244
     245    def test_success_case(self):
     246        first_test_results = BindingsTestResults([])
     247        clean_test_results = BindingsTestResults([])
     248        task = self._create_task(first_test_results, clean_test_results)
     249
     250        return_value = task._test_patch()
     251        self.assertEqual(task.test_run_count(), 1)
     252        self.assertTrue(return_value)
     253
     254    def test_test_failure(self):
     255        first_test_results = BindingsTestResults(['TestMapLike.idl'])
     256        clean_test_results = BindingsTestResults([])
     257        task = self._create_task(first_test_results, clean_test_results)
     258
     259        with self.assertRaises(ScriptError):
     260            return_value = task._test_patch()
     261        self.assertEqual(task.test_run_count(), 2)
     262
     263    def test_fix(self):
     264        first_test_results = BindingsTestResults([])
     265        clean_test_results = BindingsTestResults(['TestMapLike.idl'])
     266        task = self._create_task(first_test_results, clean_test_results)
     267
     268        return_value = task._test_patch()
     269        self.assertEqual(task.test_run_count(), 1)
     270        self.assertTrue(return_value)
     271
     272    def test_ineffective_patch(self):
     273        first_test_results = BindingsTestResults(['TestMapLike.idl'])
     274        clean_test_results = BindingsTestResults(['TestMapLike.idl'])
     275        task = self._create_task(first_test_results, clean_test_results)
     276
     277        return_value = task._test_patch()
     278        self.assertEqual(task.test_run_count(), 2)
     279        self.assertTrue(return_value)
     280
     281    def test_partially_effective_patch(self):
     282        first_test_results = BindingsTestResults(['TestMapLike.idl'])
     283        clean_test_results = BindingsTestResults(['TestMapLike.idl', 'TestNode.idl'])
     284        task = self._create_task(first_test_results, clean_test_results)
     285
     286        return_value = task._test_patch()
     287        self.assertEqual(task.test_run_count(), 2)
     288        self.assertTrue(return_value)
     289
     290    def test_different_test_failures_in_patch_and_tree(self):
     291        first_test_results = BindingsTestResults(['TestNode.idl'])
     292        clean_test_results = BindingsTestResults(['TestMapLike.idl'])
     293        task = self._create_task(first_test_results, clean_test_results)
     294
     295        with self.assertRaises(ScriptError):
     296            return_value = task._test_patch()
     297        self.assertEqual(task.test_run_count(), 2)
  • trunk/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py

    r212579 r213722  
    3838from webkitpy.common.system.executive import ScriptError
    3939from webkitpy.tool.bot.earlywarningsystemtask import EarlyWarningSystemTask, EarlyWarningSystemTaskDelegate
     40from webkitpy.tool.bot.bindingstestresultsreader import BindingsTestResultsReader
    4041from webkitpy.tool.bot.layouttestresultsreader import LayoutTestResultsReader
    4142from webkitpy.tool.bot.jsctestresultsreader import JSCTestResultsReader
     
    6061        if self.group() == "jsc":
    6162            self._test_results_reader = JSCTestResultsReader(self._tool, self._port.jsc_results_directory())
     63        elif self.group() == "bindings":
     64            self._test_results_reader = BindingsTestResultsReader(self._tool, self._port.jsc_results_directory())
    6265        else:
    6366            self._test_results_reader = LayoutTestResultsReader(self._tool, self._port.results_directory(), self._log_directory())
     
    8992    # This exists for mocking
    9093    def _create_task(self, patch):
    91         return EarlyWarningSystemTask(self, patch, self._options.run_tests)
     94        return EarlyWarningSystemTask(self, patch, should_run_tests=self._options.run_tests, should_build=self.should_build)
    9295
    9396    def review_patch(self, patch):
     
    175178                'run_tests': config.get('runTests', cls.run_tests),
    176179                '_group': config.get('group', None),
     180                'should_build': config.get('shouldBuild', True),
    177181            }))
    178182        return classes
  • trunk/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py

    r213651 r213722  
    3131from webkitpy.common.host import Host
    3232from webkitpy.common.host_mock import MockHost
     33from webkitpy.common.net.bindingstestresults import BindingsTestResults
    3334from webkitpy.common.net.jsctestresults import JSCTestResults
    3435from webkitpy.common.net.layouttestresults import LayoutTestResults
     
    5556    _build_style = None
    5657    _group = "jsc"
     58
     59
     60class TestBindingsEWS(AbstractEarlyWarningSystem):
     61    port_name = "mac"
     62    _build_style = None
     63    _group = "bindings"
    5764
    5865
     
    8289        self._test_message(ews, results, message)
    8390
     91    def test_failing_bindings_tests_message(self):
     92        ews = TestBindingsEWS()
     93        results = lambda a: BindingsTestResults(["(JS) TestMapLike.idl", "(JS) TestNode.idl"])
     94        message = "New failing tests:\n(JS) TestMapLike.idl\n(JS) TestNode.idl"
     95        self._test_message(ews, results, message)
     96
    8497
    8598class MockEarlyWarningSystemTaskForInconclusiveJSCResults(EarlyWarningSystemTask):
     
    105118            "group": ews.group(),
    106119        }
     120
     121        if ews.should_build:
     122            build_line = "Running: webkit-patch --status-host=example.com build --no-clean --no-update --build-style=%(build_style)s --group=%(group)s --port=%(port)s%(architecture)s\n" % string_replacements
     123        else:
     124            build_line = ""
     125        string_replacements['build_line'] = build_line
     126
    107127        if ews.run_tests:
    108128            run_tests_line = "Running: webkit-patch --status-host=example.com build-and-test --no-clean --no-update --test --non-interactive --build-style=%(build_style)s --group=%(group)s --port=%(port)s%(architecture)s\n" % string_replacements
     
    124144Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10000 --port=%(port)s%(architecture)s
    125145Running: webkit-patch --status-host=example.com check-patch-relevance --group=%(group)s --port=%(port)s%(architecture)s
    126 Running: webkit-patch --status-host=example.com build --no-clean --no-update --build-style=%(build_style)s --group=%(group)s --port=%(port)s%(architecture)s
    127 %(run_tests_line)s%(result_lines)s""" % string_replacements,
     146%(build_line)s%(run_tests_line)s%(result_lines)s""" % string_replacements,
    128147            "handle_unexpected_error": "Mock error message\n",
    129148            "handle_script_error": "ScriptError error message\n\nMOCK output\n",
     
    165184            'mac-debug-ews',
    166185            'mac-32bit-ews',
     186            'bindings-ews',
    167187            'jsc-ews',
    168188        }
  • trunk/Tools/Scripts/webkitpy/tool/steps/checkpatchrelevance.py

    r213658 r213722  
    3838        ]
    3939
     40    bindings_paths = [
     41        "Source/WebCore",
     42        "Tools",
     43    ]
     44
    4045    jsc_paths = [
    4146        "JSTests/",
     
    5358
    5459    group_to_paths_mapping = {
     60        'bindings': bindings_paths,
    5561        'jsc': jsc_paths,
    5662    }
     
    5864    def _changes_are_relevant(self, changed_files):
    5965        # In the default case, all patches are relevant
    60         if self._options.group != 'jsc':
     66        if self._options.group not in self.group_to_paths_mapping:
    6167            return True
    6268
  • trunk/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py

    r213185 r213722  
    257257"""
    258258        OutputCapture().assert_outputs(self, step.run, [{}], expected_logs=expected_logs)
     259
     260    def test_patch_relevant_bindings(self):
     261        self.maxDiff = None
     262        mock_options = self._step_options()
     263        mock_options.group = "bindings"
     264        tool = MockTool(log_executive=True)
     265        tool.scm()._mockChangedFiles = ["Source/WebCore/features.json", "Source/ChangeLog"]
     266        # FIXME: We shouldn't use a real port-object here, but there is too much to mock at the moment.
     267        tool._deprecated_port = DeprecatedPort()
     268        step = steps.CheckPatchRelevance(tool, mock_options)
     269        expected_logs = """Checking relevance of patch
     270"""
     271        OutputCapture().assert_outputs(self, step.run, [{}], expected_logs=expected_logs)
     272
     273    def test_patch_not_relevant_bindings(self):
     274        self.maxDiff = None
     275        mock_options = self._step_options()
     276        mock_options.group = "bindings"
     277        tool = MockTool(log_executive=True)
     278        tool.scm()._mockChangedFiles = ["Source/JavaScriptCore/Makefile", "Source/ChangeLog"]
     279        # FIXME: We shouldn't use a real port-object here, but there is too much to mock at the moment.
     280        tool._deprecated_port = DeprecatedPort()
     281        step = steps.CheckPatchRelevance(tool, mock_options)
     282        expected_logs = """Checking relevance of patch
     283This patch does not have relevant changes.
     284"""
Note: See TracChangeset for help on using the changeset viewer.