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

Unified Diff: third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py

Issue 2136723002: Create test expectations line automatically from failing test results (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove Layouttestresults.py from patch Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef5e7c24973d72305e8e7855d10f2faf1b4f80c5
--- /dev/null
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py
@@ -0,0 +1,90 @@
+"""TODO(dcampb): DO NOT SUBMIT without one-line documentation for print-layout-test-paths."""
qyearsley 2016/07/11 23:17:33 This line can be removed, and at the top of the fi
dcampb 2016/07/12 03:55:55 Corrections made.
+from webkitpy.common.net.layouttestresults import LayoutTestResults
+from webkitpy.layout_tests.models.test_expectations import *
qyearsley 2016/07/11 23:17:33 It's best to avoid "wildcard imports" like these,
dcampb 2016/07/12 03:55:56 Ahh, never knew that. Changes made.
+from webkitpy.common.net.web import Web
+from webkitpy.common.net import buildbot
+from webkitpy.common.net import rietveld
+from webkitpy.common.checkout.scm.git import Git
qyearsley 2016/07/11 23:17:32 Imports should be sorted, for consistency.
dcampb 2016/07/12 03:55:55 sorted by directory, file name or module name?
qyearsley 2016/07/12 16:43:35 Sorted lexicographically (which ends up to be by d
+import logging
qyearsley 2016/07/12 16:43:35 One more thing about import section format: Standa
+
+_log = logging.getLogger(__name__)
+
+
+TRY_BOTS = ['linux_chromium_rel_ng', 'mac_chromium_rel_ng', 'win_chromium_rel_ng']
+
+
+def Main():
qyearsley 2016/07/11 23:17:32 For consistency with most of the other scripts her
dcampb 2016/07/12 03:55:55 done
+ json_obj = {}
qyearsley 2016/07/11 23:17:33 This name can be made more descriptive; how would
dcampb 2016/07/12 03:55:55 Is that the same for local variable names in sub f
dcampb 2016/07/12 03:55:55 Is that the same for local variable names in sub f
qyearsley 2016/07/12 16:43:35 Yep -- there may be some cases where `obj, `data`
+ counter = 0
+ webo = Web()
raikiri 2016/07/11 18:46:55 maybe rename webo to something a little more clear
qyearsley 2016/07/11 23:17:33 I'd suggest just calling it web.
dcampb 2016/07/12 03:55:55 done, web_object?
dcampb 2016/07/12 19:57:03 just made it web, per qyearsley@ comment on line 2
+ try_jobs_info = get_tryjobs_information(webo)
+ while counter < len(TRY_BOTS):
+ failing_paths = get_tryjob_results(try_jobs_info, webo, counter)
+ json_obj = merge_dicts(json_obj, failing_paths)
+ counter += 1
+ return 0
+
+
+def get_tryjobs_information(web):
qyearsley 2016/07/11 23:17:33 tryjobs -> try_jobs I prefer to treat this as two
dcampb 2016/07/12 03:55:55 done
+ git_obj = Git('.')
qyearsley 2016/07/11 23:17:33 You could rename git_obj -> git; the _obj suffix d
dcampb 2016/07/12 03:55:55 makes sense, did the same for the web object.
+ issue_number = git_obj.get_issue_number()
+ info = rietveld.latest_try_jobs(issue_number, TRY_BOTS, web)
+ return info
+
+
+def _generate_results_dict(layout_test_list, test_results_object):
+ test_dict = {}
+ builder_name = test_results_object.builder_name()
+ if test_results_object.builder_name() in TRY_BOTS:
+ platform = builder_name[:builder_name.find("_")]
qyearsley 2016/07/11 23:17:33 We can't assume that builder names are always for
dcampb 2016/07/15 00:24:13 taken care of.
+ for obj in layout_test_list:
qyearsley 2016/07/11 23:17:33 The name `obj` can be improved. In this case, it's
dcampb 2016/07/12 03:55:55 done
+ test_dict[obj.test_name()] = {platform: {'expected': obj.expected_results(), 'actual': obj.actual_results(), 'bug': 'crbug.com/626703'}}
+ return test_dict
+
+
+def _strip_failing_results(data):
+ test_object = LayoutTestResults.results_from_string(data)
+ failing_paths = test_object.didnt_run_as_expected_results()
+ return _generate_results_dict(failing_paths, test_object)
+
+
+def get_tryjob_results(try_jobs_data, web, index):
qyearsley 2016/07/11 23:17:32 tryjob -> try_job
dcampb 2016/07/12 03:55:55 done
+ builder_name = try_jobs_data[index][0]
+ build_number = try_jobs_data[index][1]
+ builder = buildbot.Builder(builder_name, buildbot.BuildBot())
+ url_components = (builder.results_url(), str(build_number), 'layout-test-results', 'failing_results.json')
+ results_url = '/'.join(url_components)
qyearsley 2016/07/11 23:17:32 The results URL can be constructed by methods on t
dcampb 2016/07/12 03:55:56 I believe I tried using it and it was giving me an
+ json_data = web.get_binary(results_url)
+ failing_results_paths = _strip_failing_results(json_data)
+ return failing_results_paths
+
+
+def _remove_duplicates(failing_paths):
+ seen = set()
+ new_list = []
+ for dictionary in failing_paths:
+ path = tuple(dictionary.items())
+ if path not in seen:
+ seen.add(path)
+ new_list.append(dict(path))
+ return new_list
+
+
+def merge_dicts(final, temp, path=None):
+ if path is None:
+ path = []
raikiri 2016/07/11 18:46:55 can also be written: path = path or []
+ for key in temp:
+ if key in final:
+ if (isinstance(final[key], dict)) and isinstance(temp[key], dict):
+ merge_dicts(final[key], temp[key], path + [str(key)])
raikiri 2016/07/11 18:46:55 iiuc this line seems to do nothing as you don't ke
dcampb 2016/07/12 03:55:55 this line recursively calls the function with a su
+ elif final[key] == temp[key]:
+ pass
+ else:
+ raise Exception('Conflict at %s' % '.'.join(path))
+ else:
+ final[key] = temp[key]
+ return final
+
+
+if __name__ == '__main__':
+ Main()

Powered by Google App Engine
This is Rietveld 408576698