WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-162458-20170105181811.patch (text/plain), 48.56 KB, created by
Srinivasan Vijayaraghavan
on 2017-01-05 18:19:40 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Srinivasan Vijayaraghavan
Created:
2017-01-05 18:19:40 PST
Size:
48.56 KB
patch
obsolete
>Subversion Revision: 206377 >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 9b756a7f616e344b1abac61dfed2a1eb86f7e44d..4f4b09c9828e116c197b3399e4af0a41f1f2d7d5 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,82 @@ >+2017-01-05 Srinivasan Vijayaraghavan <svijayaraghavan@apple.com> >+ >+ EWS should run JavaScriptCore tests >+ https://bugs.webkit.org/show_bug.cgi?id=162458 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * Scripts/webkitpy/common/config/ews.json: Add config info for JSC EWS. >+ * Scripts/webkitpy/common/config/ports.py: Add support for JSC EWS in Mac Port. >+ (DeprecatedPort.build_jsc_command): Added - command to build JSC only (quicker than building all of WebKit). >+ (DeprecatedPort.run_javascriptcore_tests_command): Allow JSC EWS to only run JSC tests. >+ (MacPort.run_webkit_tests_command): Check for JSC. >+ * Scripts/webkitpy/common/net/jsctestresults.py: Added. >+ (JSCTestResults): >+ (JSCTestResults.results_from_string): Use json library to parse results. >+ (JSCTestResults.__init__): Initialize members. >+ (JSCTestResults.__eq__): This enables unit testing. >+ (JSCTestResults.stress_test_failures): Getter. >+ (JSCTestResults.all_api_tests_passed): Getter. >+ (JSCTestResults.all_passed): Getter. >+ (JSCTestResults.failing_test_results): Getter. Some of these exist for interopability reasons. >+ (JSCTestResults.test_results): Getter. >+ (JSCTestResults.failing_tests): Getter. >+ (JSCTestResults.did_exceed_test_failure_limit): Getter. >+ * Scripts/webkitpy/tool/bot/jscews_unittest.py: Added. >+ (MockPatchAnalysisTask): Mocked-out version of PatchAnalysisTask that doesn't run commands. >+ (MockPatchAnalysisTask.__init__): Sets attributes. >+ (MockPatchAnalysisTask._test): Override to not run command. >+ (MockPatchAnalysisTask._build_and_test_without_patch): Override to not run command. >+ (MockPatchAnalysisTask.validate): Assume mocked patch is valid for purposes of testing retry logic. >+ (MockPatchAnalysisTask.test_run_count): Specific to the mocked version, to test retry logic. >+ (MockJSCEarlyWarningSystem): Mocked-out version of AbstarctEarlyWarningSystem so we can provide test results. >+ (MockJSCEarlyWarningSystem.__init__): Sets attributes, also sets group to jsc. >+ (MockJSCEarlyWarningSystem.test_results): Returns test results provided by us, instead of using a JSON reader. >+ (JSCEarlyWarningSystemTest): Class to test retry logic in below situations. >+ (JSCEarlyWarningSystemTest._create_task): Helper function to abstract out common code. >+ (JSCEarlyWarningSystemTest.test_success_case): Clean patch on clean tree. >+ (JSCEarlyWarningSystemTest.test_test_failure): Failed patch on clean tree. >+ (JSCEarlyWarningSystemTest.test_fix): Patch that fixes all tree redness. >+ (JSCEarlyWarningSystemTest.test_ineffective_patch): Patch that has same failures as tree. >+ (JSCEarlyWarningSystemTest.test_partially_effective_patch): Patch fixes some failures but adds no new failures. >+ (JSCEarlyWarningSystemTest.test_different_test_failures): Patch that has some failures not present in tree. >+ * Scripts/webkitpy/common/net/jsctestresults_unittest.py: Added. >+ (JSCTestResultsTest): Class to test JSCTestResults. >+ (JSCTestResultsTest.test_results_from_string): Tests parsing. >+ * Scripts/webkitpy/tool/bot/jsctestresultsreader.py: Added. >+ (JSCTestResultsReader): Reads results file. >+ (JSCTestResultsReader.__init__): Sets attributes. >+ (JSCTestResultsReader._read_file_contents): Reads file. >+ (JSCTestResultsReader._create_jsc_test_results): Creates a JSCTestResults object. >+ (JSCTestResultsReader.results): Invokes _create_jsc_test_results to return a JSCTestResults object. >+ * Scripts/webkitpy/tool/bot/patchanalysistask.py: >+ (PatchAnalysisTask._build): Check for JSC. >+ (PatchAnalysisTask._build_without_patch): Check for JSC. >+ (PatchAnalysisTask._test): Check for JSC. >+ (PatchAnalysisTask._build_and_test_without_patch): Check for JSC. >+ (PatchAnalysisTask._test_patch): Add retry logic for JSC. >+ * Scripts/webkitpy/tool/commands/earlywarningsystem.py: >+ (AbstractEarlyWarningSystem.begin_work_queue): Use JSCTestResultsReader instead of LayoutTestResultsReader in JSC EWS. >+ (AbstractEarlyWarningSystem.test_results): _layout_test_results_reader -> _test_results_reader. >+ (AbstractEarlyWarningSystem.archive_last_test_results): _layout_test_results_reader -> _test_results_reader. >+ (AbstractEarlyWarningSystem.group): This attribute determines the type of EWS (eg. JSC). >+ (AbstractEarlyWarningSystem.load_ews_classes): Add _group. >+ * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py: >+ (EarlyWarningSystemTest._default_expected_logs): Add _group. >+ * Scripts/webkitpy/tool/steps/build.py: >+ (Build.options): Check for JSC. >+ (Build.build): Check for JSC. >+ (Build.run): Check for JSC. >+ * Scripts/webkitpy/tool/steps/options.py: >+ (Options): Add --group command line option. >+ * Scripts/webkitpy/tool/steps/runtests.py: >+ (RunTests.options): Add group. >+ (RunTests.run): Check for JSC. >+ (RunTests._run_webkit_tests): Check for JSC. >+ (RunTests): Add _group attribute. >+ (RunTests._run_javascriptcore_tests): New. >+ * Scripts/webkitpy/tool/steps/steps_unittest.py: Change expected command for running jsc tests. >+ > 2016-09-25 Gyuyoung Kim <gyuyoung.kim@webkit.org> > > [EFL] Adjust EFL indentation to EFL MiniBrowser >diff --git a/Tools/Scripts/webkitpy/common/config/ews.json b/Tools/Scripts/webkitpy/common/config/ews.json >index 35d4985ab0f93d127b3721e4601cd6d89dfccf3c..e5340fe5c3c21ae81ad1ef7e03f7fb81f3839cff 100644 >--- a/Tools/Scripts/webkitpy/common/config/ews.json >+++ b/Tools/Scripts/webkitpy/common/config/ews.json >@@ -50,5 +50,11 @@ > "port": "mac", > "name": "mac-32bit-ews", > "architecture": "i386" >+ }, >+ "JSC EWS": { >+ "port": "mac", >+ "name": "jsc-ews", >+ "group": "jsc", >+ "runTests": true > } > } >diff --git a/Tools/Scripts/webkitpy/common/config/ports.py b/Tools/Scripts/webkitpy/common/config/ports.py >index a0d50dcb6ea0b5fde0b3c17ef159ceafee1a2e98..4fcc86843629b3636b5ca406b31c7aab606302fa 100644 >--- a/Tools/Scripts/webkitpy/common/config/ports.py >+++ b/Tools/Scripts/webkitpy/common/config/ports.py >@@ -1,6 +1,6 @@ > # Copyright (C) 2009, Google Inc. All rights reserved. > # Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies). >-# Copyright (C) 2015 Apple Inc. All rights reserved. >+# Copyright (C) 2015-2016 Apple Inc. All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions are >@@ -103,8 +103,19 @@ class DeprecatedPort(object): > command.append("--release") > return command > >- def run_javascriptcore_tests_command(self): >- return self.script_shell_command("run-javascriptcore-tests") >+ def build_jsc_command(self, build_style=None): >+ command = self.script_shell_command("build-jsc") >+ if build_style == "debug": >+ command.append("--debug") >+ return command >+ >+ def run_javascriptcore_tests_command(self, build_style=None): >+ command = self.script_shell_command("run-javascriptcore-tests") >+ command.append("--no-fail-fast") >+ command.append("--json-output=jsc_test_results.json") >+ if (build_style == "debug"): >+ command.append("--debug") >+ return command > > def run_webkit_tests_command(self, build_style=None): > command = self.script_shell_command("run-webkit-tests") >@@ -150,7 +161,10 @@ class IOSSimulatorWK2Port(DeprecatedPort): > class MacPort(DeprecatedPort): > port_flag_name = "mac" > >- def run_webkit_tests_command(self, build_style=None): >+ def run_webkit_tests_command(self, build_style=None, test_suite=None): >+ if (test_suite == "jsc"): >+ return super(MacPort, self).run_javascriptcore_tests_command(build_style) >+ > command = super(MacPort, self).run_webkit_tests_command(build_style) > command.append("--dump-render-tree") > return command >diff --git a/Tools/Scripts/webkitpy/common/net/jsctestresults.py b/Tools/Scripts/webkitpy/common/net/jsctestresults.py >new file mode 100644 >index 0000000000000000000000000000000000000000..5960159ec61e3f27aea08d9cf4a4ac054f38b3a7 >--- /dev/null >+++ b/Tools/Scripts/webkitpy/common/net/jsctestresults.py >@@ -0,0 +1,72 @@ >+# Copyright (C) 2016 Apple Inc. All rights reserved. >+# >+# Redistribution and use in source and binary forms, with or without >+# modification, are permitted provided that the following conditions >+# are met: >+# 1. Redistributions of source code must retain the above copyright >+# notice, this list of conditions and the following disclaimer. >+# 2. Redistributions in binary form must reproduce the above copyright >+# notice, this list of conditions and the following disclaimer in the >+# documentation and/or other materials provided with the distribution. >+# >+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND >+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED >+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE >+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR >+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL >+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR >+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER >+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, >+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ >+import json >+import logging >+ >+_log = logging.getLogger(__name__) >+ >+ >+class JSCTestResults(object): >+ @classmethod >+ def results_from_string(cls, string): >+ if not string: >+ return None >+ parsed_results = json.loads(string) >+ >+ return cls(parsed_results['allApiTestsPassed'], parsed_results['stressTestFailures']) >+ >+ def __init__(self, all_api_tests_passed, stress_test_failures): >+ self._all_api_tests_passed = all_api_tests_passed >+ self._stress_test_failures = stress_test_failures >+ >+ self._test_results = stress_test_failures >+ if self._all_api_tests_passed == False: >+ self._test_results += "apiTests" >+ >+ def __eq__(self, other): >+ return self._all_api_tests_passed == other._all_api_tests_passed and set(self._stress_test_failures) == set(other._stress_test_failures) >+ >+ def __le__(self, other): >+ return set(self.test_results()) <= set(other.test_results()) >+ >+ def stress_test_failures(self): >+ return self._stress_test_failures >+ >+ def all_api_tests_passed(self): >+ return self._all_api_tests_passed >+ >+ def all_passed(self): >+ return self._all_api_tests_passed == True and len(self._stress_test_failures) == 0 >+ >+ def failing_test_results(self): >+ return self.stress_test_failures() >+ >+ def test_results(self): >+ return self._test_results >+ >+ def failing_tests(self): >+ return self._test_results >+ >+ # No defined failure limit for JSC >+ def did_exceed_test_failure_limit(self): >+ return False >diff --git a/Tools/Scripts/webkitpy/common/net/jsctestresults_unittest.py b/Tools/Scripts/webkitpy/common/net/jsctestresults_unittest.py >new file mode 100644 >index 0000000000000000000000000000000000000000..a1e49fdccc61da7daf10e33fca4dbffd42e5cd68 >--- /dev/null >+++ b/Tools/Scripts/webkitpy/common/net/jsctestresults_unittest.py >@@ -0,0 +1,40 @@ >+# Copyright (C) 2016 Apple Inc. All rights reserved. >+# >+# Redistribution and use in source and binary forms, with or without >+# modification, are permitted provided that the following conditions >+# are met: >+# 1. Redistributions of source code must retain the above copyright >+# notice, this list of conditions and the following disclaimer. >+# 2. Redistributions in binary form must reproduce the above copyright >+# notice, this list of conditions and the following disclaimer in the >+# documentation and/or other materials provided with the distribution. >+# >+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND >+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED >+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE >+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR >+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL >+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR >+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER >+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, >+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ >+import unittest >+ >+from webkitpy.common.net.jsctestresults import JSCTestResults >+ >+ >+class JSCTestResultsTest(unittest.TestCase): >+ def test_results_from_string(self): >+ no_failures_string = '{"allApiTestsPassed": true, "stressTestFailures":[]}' >+ no_failures_results = JSCTestResults(True, []) >+ self.assertEqual(no_failures_results, JSCTestResults.results_from_string(no_failures_string)) >+ >+ api_test_failures_string = '{"allApiTestsPassed": false, "stressTestFailures":[]}' >+ api_test_failures_results = JSCTestResults(False, []) >+ self.assertEqual(api_test_failures_results, JSCTestResults.results_from_string(api_test_failures_string)) >+ >+ many_failures_string = '{"allApiTestsPassed": false, "stressTestFailures":["es6.yaml/es6/typed_arrays_Int16Array.js.default", "es6.yaml/es6/typed_arrays_Int8Array.js.default"]}' >+ many_failures_results = JSCTestResults(False, ["es6.yaml/es6/typed_arrays_Int16Array.js.default", "es6.yaml/es6/typed_arrays_Int8Array.js.default"]) >+ self.assertEqual(many_failures_results, JSCTestResults.results_from_string(many_failures_string)) >diff --git a/Tools/Scripts/webkitpy/tool/bot/jscews_unittest.py b/Tools/Scripts/webkitpy/tool/bot/jscews_unittest.py >new file mode 100644 >index 0000000000000000000000000000000000000000..6af6eff6ac65a492bc92e0def93164ffbbf1db8c >--- /dev/null >+++ b/Tools/Scripts/webkitpy/tool/bot/jscews_unittest.py >@@ -0,0 +1,136 @@ >+# Copyright (C) 2017 Apple Inc. All rights reserved. >+# >+# Redistribution and use in source and binary forms, with or without >+# modification, are permitted provided that the following conditions >+# are met: >+# 1. Redistributions of source code must retain the above copyright >+# notice, this list of conditions and the following disclaimer. >+# 2. Redistributions in binary form must reproduce the above copyright >+# notice, this list of conditions and the following disclaimer in the >+# documentation and/or other materials provided with the distribution. >+# >+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND >+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED >+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE >+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR >+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL >+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR >+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER >+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, >+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ >+import logging >+import unittest >+ >+from webkitpy.common.net.jsctestresults import JSCTestResults >+from webkitpy.common.system.executive import ScriptError >+from webkitpy.tool.bot.patchanalysistask import * >+from webkitpy.tool.commands.earlywarningsystem import AbstractEarlyWarningSystem >+from webkitpy.tool.mocktool import MockTool >+ >+_log = logging.getLogger(__name__) >+ >+ >+class MockPatchAnalysisTask(PatchAnalysisTask): >+ def __init__(self, delegate, patch, first_test_all_passed): >+ self._delegate = delegate >+ self._patch = patch >+ self._script_error = None >+ self._results_archive_from_patch_test_run = None >+ self._results_from_patch_test_run = None >+ self.error = None >+ self._first_test_all_passed = first_test_all_passed >+ self._test_run_count = 0 >+ >+ def _test(self): >+ self._test_run_count += 1 >+ >+ if self._first_test_all_passed == True: >+ return True >+ else: >+ self._script_error = ScriptError("Expected failure in regression test") >+ return False >+ >+ def _build_and_test_without_patch(self): >+ self._test_run_count += 1 >+ return True >+ >+ def validate(self): >+ return True >+ >+ def test_run_count(self): >+ return self._test_run_count >+ >+ >+# This is the delegate to be used with MockPatchAnalysisTask, above. >+class MockJSCEarlyWarningSystem(AbstractEarlyWarningSystem): >+ def __init__(self, first_test_results, clean_test_results): >+ AbstractEarlyWarningSystem.__init__(self) >+ self._group = "jsc" >+ self._results_in_order = [clean_test_results, first_test_results] >+ >+ def test_results(self): >+ return self._results_in_order.pop() >+ >+ >+class JSCEarlyWarningSystemTest(unittest.TestCase): >+ def _create_task(self, first_test_results, clean_test_results): >+ queue = MockJSCEarlyWarningSystem(first_test_results, clean_test_results) >+ tool = MockTool(log_executive=True) >+ patch = tool.bugs.fetch_attachment(10000) >+ return MockPatchAnalysisTask(queue, patch, first_test_results.all_passed()) >+ >+ def test_success_case(self): >+ first_test_results = JSCTestResults(True, []) >+ clean_test_results = JSCTestResults(True, []) >+ task = self._create_task(first_test_results, clean_test_results) >+ >+ return_value = task._test_patch() >+ self.assertEqual(task.test_run_count(), 1) >+ self.assertEqual(return_value, True) >+ >+ def test_test_failure(self): >+ first_test_results = JSCTestResults(True, ['Fail.js']) >+ clean_test_results = JSCTestResults(True, []) >+ task = self._create_task(first_test_results, clean_test_results) >+ >+ with self.assertRaises(ScriptError): >+ return_value = task._test_patch() >+ self.assertEqual(task.test_run_count(), 2) >+ >+ def test_fix(self): >+ first_test_results = JSCTestResults(True, []) >+ clean_test_results = JSCTestResults(True, ['Fail.js']) >+ task = self._create_task(first_test_results, clean_test_results) >+ >+ return_value = task._test_patch() >+ self.assertEqual(task.test_run_count(), 1) >+ self.assertEqual(return_value, True) >+ >+ def test_ineffective_patch(self): >+ first_test_results = JSCTestResults(False, ['failure1.js', 'failure2.js']) >+ clean_test_results = JSCTestResults(False, ['failure1.js', 'failure2.js']) >+ task = self._create_task(first_test_results, clean_test_results) >+ >+ return_value = task._test_patch() >+ self.assertEqual(task.test_run_count(), 2) >+ self.assertEqual(return_value, True) >+ >+ def test_partially_effective_patch(self): >+ first_test_results = JSCTestResults(True, ['failure2.js']) >+ clean_test_results = JSCTestResults(False, ['failure1.js', 'failure2.js']) >+ task = self._create_task(first_test_results, clean_test_results) >+ >+ return_value = task._test_patch() >+ self.assertEqual(task.test_run_count(), 2) >+ self.assertEqual(return_value, True) >+ >+ def test_different_test_failures(self): >+ first_test_results = JSCTestResults(False, []) >+ clean_test_results = JSCTestResults(True, ['failure1.js', 'failure2.js']) >+ task = self._create_task(first_test_results, clean_test_results) >+ >+ with self.assertRaises(ScriptError): >+ return_value = task._test_patch() >+ self.assertEqual(task.test_run_count(), 2) >diff --git a/Tools/Scripts/webkitpy/tool/bot/jsctestresultsreader.py b/Tools/Scripts/webkitpy/tool/bot/jsctestresultsreader.py >new file mode 100644 >index 0000000000000000000000000000000000000000..bd293b4616ebc3d140b3e859b3f4156621523e10 >--- /dev/null >+++ b/Tools/Scripts/webkitpy/tool/bot/jsctestresultsreader.py >@@ -0,0 +1,47 @@ >+# Copyright (C) 2016 Apple Inc. All rights reserved. >+# >+# Redistribution and use in source and binary forms, with or without >+# modification, are permitted provided that the following conditions >+# are met: >+# 1. Redistributions of source code must retain the above copyright >+# notice, this list of conditions and the following disclaimer. >+# 2. Redistributions in binary form must reproduce the above copyright >+# notice, this list of conditions and the following disclaimer in the >+# documentation and/or other materials provided with the distribution. >+# >+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND >+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED >+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE >+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR >+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL >+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR >+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER >+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, >+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ >+import logging >+import json >+from webkitpy.common.net.jsctestresults import JSCTestResults >+ >+_log = logging.getLogger(__name__) >+ >+ >+class JSCTestResultsReader(object): >+ def __init__(self, host, results_directory): >+ self._host = host >+ self._results_directory = results_directory >+ >+ def _read_file_contents(self, path): >+ try: >+ return self._host.filesystem.read_text_file(path) >+ except IOError, e: # File does not exist or can't be read. >+ return None >+ >+ def _create_jsc_test_results(self): >+ results_path = self._host.filesystem.join(self._results_directory, "jsc_test_results.json") >+ contents = self._read_file_contents(results_path) >+ return JSCTestResults.results_from_string(contents) >+ >+ def results(self): >+ return self._create_jsc_test_results() >diff --git a/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py b/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py >index 752316416c5f9d0a3e59ef6d05e31785f9174629..b6a62f6b3ace9f9b10bde17d7caea0360a98443c 100644 >--- a/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py >+++ b/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py >@@ -1,4 +1,5 @@ > # Copyright (c) 2010 Google Inc. All rights reserved. >+# Copyright (c) 2016 Apple Inc. All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions are >@@ -123,27 +124,39 @@ class PatchAnalysisTask(object): > "Patch does not apply") > > def _build(self): >- return self._run_command([ >+ args = [ > "build", > "--no-clean", > "--no-update", > "--build-style=%s" % self._delegate.build_style(), >- ], >- "Built patch", >- "Patch does not build") >+ ] >+ >+ try: >+ args.append("--group=%s" % self._delegate.group()) >+ finally: >+ return self._run_command( >+ args, >+ "Built patch", >+ "Patch does not build") > > def _build_without_patch(self): >- return self._run_command([ >+ args = [ > "build", > "--force-clean", > "--no-update", > "--build-style=%s" % self._delegate.build_style(), >- ], >- "Able to build without patch", >- "Unable to build without patch") >+ ] >+ >+ try: >+ args.append("--group=%s" % self._delegate.group()) >+ finally: >+ return self._run_command( >+ args, >+ "Able to build without patch", >+ "Unable to build without patch") > > def _test(self): >- return self._run_command([ >+ args = [ > "build-and-test", > "--no-clean", > "--no-update", >@@ -151,12 +164,18 @@ class PatchAnalysisTask(object): > "--test", > "--non-interactive", > "--build-style=%s" % self._delegate.build_style(), >- ], >- "Passed tests", >- "Patch does not pass tests") >+ ] >+ >+ try: >+ args.append("--group=%s" % self._delegate.group()) >+ finally: >+ return self._run_command( >+ args, >+ "Passed tests", >+ "Patch does not pass tests") > > def _build_and_test_without_patch(self): >- return self._run_command([ >+ args = [ > "build-and-test", > "--force-clean", > "--no-update", >@@ -164,9 +183,15 @@ class PatchAnalysisTask(object): > "--test", > "--non-interactive", > "--build-style=%s" % self._delegate.build_style(), >- ], >- "Able to pass tests without patch", >- "Unable to pass tests without patch (tree is red?)") >+ ] >+ >+ try: >+ args.append("--group=%s" % self._delegate.group()) >+ finally: >+ return self._run_command( >+ args, >+ "Able to pass tests without patch", >+ "Unable to pass tests without patch (tree is red?)") > > def _land(self): > # Unclear if this should pass --quiet or not. If --parent-command always does the reporting, then it should. >@@ -210,69 +235,85 @@ class PatchAnalysisTask(object): > if self._test(): > return True > >- # Note: archive_last_test_results deletes the results directory, making these calls order-sensitve. >- # We could remove this dependency by building the test_results from the archive. >- first_results = self._delegate.test_results() >- first_results_archive = self._delegate.archive_last_test_results(self._patch) >- first_script_error = self._script_error >- first_failure_status_id = self.failure_status_id >- >- if self._test() and not first_results.did_exceed_test_failure_limit(): >- # Only report flaky tests if we were successful at parsing results.json and archiving results. >- if first_results and first_results_archive: >- self._report_flaky_tests(first_results.failing_test_results(), first_results_archive) >- return True >- >- second_results = self._delegate.test_results() >- second_results_archive = self._delegate.archive_last_test_results(self._patch) >- second_script_error = self._script_error >- second_failure_status_id = self.failure_status_id >- >- if second_results.did_exceed_test_failure_limit() and first_results.did_exceed_test_failure_limit(): >- self._build_and_test_without_patch() >- clean_tree_results = self._delegate.test_results() >- >- if (len(first_results.failing_tests()) - len(clean_tree_results.failing_tests())) <= 5: >+ if hasattr(self._delegate, 'group') and self._delegate.group() == "jsc": >+ first_results = self._delegate.test_results() >+ first_script_error = self._script_error >+ if first_results.all_api_tests_passed() is True and len(first_results.stress_test_failures()) == 0: >+ return True >+ else: >+ self._build_and_test_without_patch() >+ clean_tree_results = self._delegate.test_results() >+ >+ # If the patch's failures are a subset of the tree's failures, the patch should pass EWS. >+ if first_results <= clean_tree_results: >+ return True >+ >+ return self.report_failure(None, first_results, first_script_error) >+ >+ else: >+ # Note: archive_last_test_results deletes the results directory, making these calls order-sensitve. >+ # We could remove this dependency by building the test_results from the archive. >+ first_results = self._delegate.test_results() >+ first_results_archive = self._delegate.archive_last_test_results(self._patch) >+ first_script_error = self._script_error >+ first_failure_status_id = self.failure_status_id >+ >+ if self._test() and not first_results.did_exceed_test_failure_limit(): >+ # Only report flaky tests if we were successful at parsing results.json and archiving results. >+ if first_results and first_results_archive: >+ self._report_flaky_tests(first_results.failing_test_results(), first_results_archive) >+ return True >+ >+ second_results = self._delegate.test_results() >+ second_results_archive = self._delegate.archive_last_test_results(self._patch) >+ second_script_error = self._script_error >+ second_failure_status_id = self.failure_status_id >+ >+ if second_results.did_exceed_test_failure_limit() and first_results.did_exceed_test_failure_limit(): >+ self._build_and_test_without_patch() >+ clean_tree_results = self._delegate.test_results() >+ >+ if (len(first_results.failing_tests()) - len(clean_tree_results.failing_tests())) <= 5: >+ return False >+ >+ self.failure_status_id = first_failure_status_id >+ >+ return self.report_failure(first_results_archive, first_results, first_script_error) >+ >+ if second_results.did_exceed_test_failure_limit(): >+ self._should_defer_patch_or_throw(first_results.failing_test_results(), first_results_archive, first_script_error, first_failure_status_id) > return False > >- self.failure_status_id = first_failure_status_id >- >- return self.report_failure(first_results_archive, first_results, first_script_error) >- >- if second_results.did_exceed_test_failure_limit(): >- self._should_defer_patch_or_throw(first_results.failing_test_results(), first_results_archive, first_script_error, first_failure_status_id) >- return False >- >- if first_results.did_exceed_test_failure_limit(): >- self._should_defer_patch_or_throw(second_results.failing_test_results(), second_results_archive, second_script_error, second_failure_status_id) >- return False >+ if first_results.did_exceed_test_failure_limit(): >+ self._should_defer_patch_or_throw(second_results.failing_test_results(), second_results_archive, second_script_error, second_failure_status_id) >+ return False > >- if self._results_failed_different_tests(first_results, second_results): >- first_failing_results_set = frozenset(first_results.failing_test_results()) >- second_failing_results_set = frozenset(second_results.failing_test_results()) >+ if self._results_failed_different_tests(first_results, second_results): >+ first_failing_results_set = frozenset(first_results.failing_test_results()) >+ second_failing_results_set = frozenset(second_results.failing_test_results()) > >- tests_that_only_failed_first = first_failing_results_set.difference(second_failing_results_set) >- self._report_flaky_tests(tests_that_only_failed_first, first_results_archive) >+ tests_that_only_failed_first = first_failing_results_set.difference(second_failing_results_set) >+ self._report_flaky_tests(tests_that_only_failed_first, first_results_archive) > >- tests_that_only_failed_second = second_failing_results_set.difference(first_failing_results_set) >- self._report_flaky_tests(tests_that_only_failed_second, second_results_archive) >+ tests_that_only_failed_second = second_failing_results_set.difference(first_failing_results_set) >+ self._report_flaky_tests(tests_that_only_failed_second, second_results_archive) > >- tests_that_consistently_failed = first_failing_results_set.intersection(second_failing_results_set) >- if tests_that_consistently_failed: >- if self._should_defer_patch_or_throw(tests_that_consistently_failed, first_results_archive, first_script_error, first_failure_status_id): >- return False # Defer patch >+ tests_that_consistently_failed = first_failing_results_set.intersection(second_failing_results_set) >+ if tests_that_consistently_failed: >+ if self._should_defer_patch_or_throw(tests_that_consistently_failed, first_results_archive, first_script_error, first_failure_status_id): >+ return False # Defer patch > >- # At this point we know that at least one test flaked, but no consistent failures >- # were introduced. This is a bit of a grey-zone. >- return False # Defer patch >+ # At this point we know that at least one test flaked, but no consistent failures >+ # were introduced. This is a bit of a grey-zone. >+ return False # Defer patch > >- if self._should_defer_patch_or_throw(first_results.failing_test_results(), first_results_archive, first_script_error, first_failure_status_id): >- return False # Defer patch >+ if self._should_defer_patch_or_throw(first_results.failing_test_results(), first_results_archive, first_script_error, first_failure_status_id): >+ return False # Defer patch > >- # At this point, we know that the first and second runs had the exact same failures, >- # and that those failures are all present on the clean tree, so we can say with certainty >- # that the patch is good. >- return True >+ # At this point, we know that the first and second runs had the exact same failures, >+ # and that those failures are all present on the clean tree, so we can say with certainty >+ # that the patch is good. >+ return True > > def results_archive_from_patch_test_run(self, patch): > assert(self._patch.id() == patch.id()) # PatchAnalysisTask is not currently re-useable. >diff --git a/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py b/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py >index 9bc041860ce67454454e4b251438a9dbe5264513..d94f833816459c6a2772acce20e97b0425657284 100644 >--- a/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py >+++ b/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py >@@ -1,4 +1,5 @@ > # Copyright (c) 2009 Google Inc. All rights reserved. >+# Copyright (c) 2016 Apple Inc. All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions are >@@ -28,6 +29,7 @@ > > import json > import logging >+import os > from optparse import make_option > > from webkitpy.common.config.committers import CommitterList >@@ -36,6 +38,7 @@ from webkitpy.common.system.filesystem import FileSystem > from webkitpy.common.system.executive import ScriptError > from webkitpy.tool.bot.earlywarningsystemtask import EarlyWarningSystemTask, EarlyWarningSystemTaskDelegate > from webkitpy.tool.bot.layouttestresultsreader import LayoutTestResultsReader >+from webkitpy.tool.bot.jsctestresultsreader import JSCTestResultsReader > from webkitpy.tool.bot.patchanalysistask import UnableToApplyPatch, PatchIsNotValid > from webkitpy.tool.bot.queueengine import QueueEngine > from webkitpy.tool.commands.queues import AbstractReviewQueue >@@ -53,7 +56,12 @@ class AbstractEarlyWarningSystem(AbstractReviewQueue, EarlyWarningSystemTaskDele > > def begin_work_queue(self): > AbstractReviewQueue.begin_work_queue(self) >- self._layout_test_results_reader = LayoutTestResultsReader(self._tool, self._port.results_directory(), self._log_directory()) >+ >+ if self.group() == "jsc": >+ dir = os.path.dirname(os.path.dirname(os.path.dirname(self._port.results_directory()))) >+ self._test_results_reader = JSCTestResultsReader(self._tool, dir) >+ else: >+ self._test_results_reader = LayoutTestResultsReader(self._tool, self._port.results_directory(), self._log_directory()) > > def _failing_tests_message(self, task, patch): > results = task.results_from_patch_test_run(patch) >@@ -117,14 +125,20 @@ class AbstractEarlyWarningSystem(AbstractReviewQueue, EarlyWarningSystemTaskDele > return self._update_status(message, patch=patch, results_file=failure_log) > > def test_results(self): >- return self._layout_test_results_reader.results() >+ return self._test_results_reader.results() > > def archive_last_test_results(self, patch): >- return self._layout_test_results_reader.archive(patch) >+ return self._test_results_reader.archive(patch) > > def build_style(self): > return self._build_style > >+ def group(self): >+ if hasattr(self, "_group"): >+ return self._group >+ else: >+ return None >+ > def refetch_patch(self, patch): > return self._tool.bugs.fetch_attachment(patch.id()) > >@@ -156,5 +170,6 @@ class AbstractEarlyWarningSystem(AbstractReviewQueue, EarlyWarningSystemTaskDele > '_build_style': config.get('style', "release"), > 'watchers': config.get('watchers', []), > 'run_tests': config.get('runTests', cls.run_tests), >+ '_group': config.get('group', None), > })) > return classes >diff --git a/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py b/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py >index 08887813ce2e93a8ec9da37636ecbde9eff3c9e7..369989a07d878f348c56e8cd3e6cf870a4981a35 100644 >--- a/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py >+++ b/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py >@@ -1,4 +1,5 @@ > # Copyright (C) 2009 Google Inc. All rights reserved. >+# Copyright (C) 2016 Apple Inc. All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions are >@@ -68,9 +69,10 @@ class EarlyWarningSystemTest(QueuesTest): > "port": ews.port_name, > "architecture": " --architecture=%s" % ews.architecture if ews.architecture else "", > "build_style": ews.build_style(), >+ "group": ews.group(), > } > if ews.run_tests: >- 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 --port=%(port)s%(architecture)s\n" % string_replacements >+ 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 > else: > run_tests_line = "" > string_replacements['run_tests_line'] = run_tests_line >@@ -81,7 +83,7 @@ class EarlyWarningSystemTest(QueuesTest): > Running: webkit-patch --status-host=example.com clean --port=%(port)s%(architecture)s > Running: webkit-patch --status-host=example.com update --port=%(port)s%(architecture)s > Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10000 --port=%(port)s%(architecture)s >-Running: webkit-patch --status-host=example.com build --no-clean --no-update --build-style=%(build_style)s --port=%(port)s%(architecture)s >+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 > %(run_tests_line)sMOCK: update_status: %(name)s Pass > MOCK: release_work_item: %(name)s 10000 > """ % string_replacements, >diff --git a/Tools/Scripts/webkitpy/tool/steps/build.py b/Tools/Scripts/webkitpy/tool/steps/build.py >index f74ffce70941c61e596792e4c60dcd7f8b65e9ec..f4bf2ee39e034338556c3ac7c74cf5da93a22b04 100644 >--- a/Tools/Scripts/webkitpy/tool/steps/build.py >+++ b/Tools/Scripts/webkitpy/tool/steps/build.py >@@ -1,4 +1,5 @@ > # Copyright (C) 2010 Google Inc. All rights reserved. >+# Copyright (C) 2016 Apple Inc. All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions are >@@ -41,28 +42,38 @@ class Build(AbstractStep): > Options.build, > Options.quiet, > Options.build_style, >+ Options.group, > ] > >- def build(self, build_style): >+ def build(self, build_style, group): > environment = self._tool.copy_current_environment() > environment.disable_gcc_smartquotes() > environment.disable_jhbuild_VT100_output() > env = environment.to_dictionary() > >- build_webkit_command = self._tool.deprecated_port().build_webkit_command(build_style=build_style) >+ if group == "jsc": >+ build_command = self._tool.deprecated_port().build_jsc_command(build_style=build_style) >+ else: >+ build_command = self._tool.deprecated_port().build_webkit_command(build_style=build_style) > > if self._options.architecture: >- build_webkit_command += ['ARCHS=%s' % self._options.architecture] >+ build_command += ['ARCHS=%s' % self._options.architecture] > >- self._tool.executive.run_and_throw_if_fail(build_webkit_command, self._options.quiet, >+ self._tool.executive.run_and_throw_if_fail(build_command, self._options.quiet, > cwd=self._tool.scm().checkout_root, env=env) > > def run(self, state): > if not self._options.build: > return > _log.info("Building WebKit") >+ >+ if hasattr(self._options, 'group') and self._options.group == "jsc": >+ group = self._options.group >+ else: >+ group = None >+ > if self._options.build_style == "both": >- self.build("debug") >- self.build("release") >+ self.build("debug", group) >+ self.build("release", group) > else: >- self.build(self._options.build_style) >+ self.build(self._options.build_style, group) >diff --git a/Tools/Scripts/webkitpy/tool/steps/options.py b/Tools/Scripts/webkitpy/tool/steps/options.py >index 3ef47d008a59e050d4ca0c4877ddd1a60731a409..8f1458db5c4f2448a7afbf29e1c39641752116b1 100644 >--- a/Tools/Scripts/webkitpy/tool/steps/options.py >+++ b/Tools/Scripts/webkitpy/tool/steps/options.py >@@ -1,4 +1,5 @@ > # Copyright (C) 2010 Google Inc. All rights reserved. >+# Copyright (C) 2016 Apple Inc. All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions are >@@ -46,6 +47,7 @@ class Options(object): > email = make_option("--email", action="store", type="string", dest="email", help="Email address to use in ChangeLogs.") > force_clean = make_option("--force-clean", action="store_true", dest="force_clean", default=False, help="Clean working directory before applying patches (removes local changes and commits)") > git_commit = make_option("-g", "--git-commit", action="store", dest="git_commit", help="Operate on a local commit. If a range, the commits are squashed into one. <ref>.... includes the working copy changes. UPSTREAM can be used for the upstream/tracking branch.") >+ group = make_option("--group", action="store", dest="group", default=None, help="") > local_commit = make_option("--local-commit", action="store_true", dest="local_commit", default=False, help="Make a local commit for each applied patch") > non_interactive = make_option("--non-interactive", action="store_true", dest="non_interactive", default=False, help="Never prompt the user, fail as fast as possible.") > obsolete_patches = make_option("--no-obsolete", action="store_false", dest="obsolete_patches", default=True, help="Do not obsolete old patches before posting this one.") >diff --git a/Tools/Scripts/webkitpy/tool/steps/runtests.py b/Tools/Scripts/webkitpy/tool/steps/runtests.py >index 75d72bc9ad2f4e36d45fdac90f1819481cf0288b..ed90dfd438c31cfadcefd832f15ded992a97ddbc 100644 >--- a/Tools/Scripts/webkitpy/tool/steps/runtests.py >+++ b/Tools/Scripts/webkitpy/tool/steps/runtests.py >@@ -1,4 +1,5 @@ > # Copyright (C) 2010 Google Inc. All rights reserved. >+# Copyright (C) 2016 Apple Inc. All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions are >@@ -53,6 +54,7 @@ class RunTests(AbstractStep): > Options.iterate_on_new_tests, > Options.non_interactive, > Options.quiet, >+ Options.group, > ] > > def run(self, state): >@@ -63,6 +65,10 @@ class RunTests(AbstractStep): > if not self._options.test: > return > >+ if hasattr(self._options, "group") and self._options.group == "jsc": >+ self._run_javascriptcore_tests() >+ return >+ > python_unittests_command = self._tool.deprecated_port().run_python_unittests_command() > if python_unittests_command: > _log.info("Running Python unit tests") >@@ -143,3 +149,7 @@ class RunTests(AbstractStep): > args.append("--iterations=%d" % iterate_on_new_tests) > > self._tool.executive.run_and_throw_if_fail(args, cwd=self._tool.scm().checkout_root) >+ >+ def _run_javascriptcore_tests(self): >+ args = self._tool.deprecated_port().run_javascriptcore_tests_command(self._options.build_style) >+ self._tool.executive.run_and_throw_if_fail(args, cwd=self._tool.scm().checkout_root) >diff --git a/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py b/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py >index 7d94a13b3463d98a44f949f814cc7121c068ab5d..a4842aa89a4bef5cad39cabb3f2ff58257fb7c5d 100644 >--- a/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py >+++ b/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py >@@ -1,4 +1,5 @@ > # Copyright (C) 2010 Google Inc. All rights reserved. >+# Copyright (C) 2016 Apple Inc. All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions are >@@ -98,6 +99,7 @@ class StepsTest(unittest.TestCase): > self._assert_step_output_with_bug(steps.EnsureBugIsOpenAndAssigned, 50002, expected_logs) > > def test_runtests_args(self): >+ self.maxDiff = None > mock_options = self._step_options() > mock_options.non_interactive = False > mock_options.build_style = "release" >@@ -111,7 +113,7 @@ MOCK run_and_throw_if_fail: ['Tools/Scripts/test-webkitpy'], cwd=/mock-checkout > Running Perl unit tests > MOCK run_and_throw_if_fail: ['Tools/Scripts/test-webkitperl'], cwd=/mock-checkout > Running JavaScriptCore tests >-MOCK run_and_throw_if_fail: ['Tools/Scripts/run-javascriptcore-tests'], cwd=/mock-checkout >+MOCK run_and_throw_if_fail: ['Tools/Scripts/run-javascriptcore-tests', '--no-fail-fast', '--json-output=jsc_test_results.json'], cwd=/mock-checkout > Running bindings generation tests > MOCK run_and_throw_if_fail: ['Tools/Scripts/run-bindings-tests'], cwd=/mock-checkout > Running run-webkit-tests >@@ -120,6 +122,7 @@ MOCK run_and_throw_if_fail: ['Tools/Scripts/run-webkit-tests', '--release', '--q > OutputCapture().assert_outputs(self, step.run, [{}], expected_logs=expected_logs) > > def test_runtests_debug_args(self): >+ self.maxDiff = None > mock_options = self._step_options() > mock_options.non_interactive = False > mock_options.build_style = "debug" >@@ -133,7 +136,7 @@ MOCK run_and_throw_if_fail: ['Tools/Scripts/test-webkitpy'], cwd=/mock-checkout > Running Perl unit tests > MOCK run_and_throw_if_fail: ['Tools/Scripts/test-webkitperl'], cwd=/mock-checkout > Running JavaScriptCore tests >-MOCK run_and_throw_if_fail: ['Tools/Scripts/run-javascriptcore-tests'], cwd=/mock-checkout >+MOCK run_and_throw_if_fail: ['Tools/Scripts/run-javascriptcore-tests', '--no-fail-fast', '--json-output=jsc_test_results.json'], cwd=/mock-checkout > Running bindings generation tests > MOCK run_and_throw_if_fail: ['Tools/Scripts/run-bindings-tests'], cwd=/mock-checkout > Running run-webkit-tests
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 162458
:
297210
|
297239
|
297551
|
298160
|
298714
|
298739
|
298802
|
298807
|
300176
|
300294
|
300461
|
300474
|
300784
|
300838
|
301020
|
301069
|
301117
|
301137
|
301437
|
301572
|
301667
|
301848
|
301849
|
301972
|
302000