Show t-test results based on individual measurements to analysis task page.
[WebKit-https.git] / Websites / perf.webkit.org / ChangeLog
1 2018-08-22  Dewei Zhu  <dewei_zhu@apple.com>
2
3         Show t-test results based on individual measurements to analysis task page.
4         https://bugs.webkit.org/show_bug.cgi?id=188425
5
6         Reviewed by Ryosuke Niwa.
7
8         Added comparison for individual iterations in analysis task page.
9         Added comparison for individual iterations for notification on A/B tests completion.
10         Refactored t-distribution inverse lookup to any degree of freedom with 5 significant figures.
11
12         * public/shared/statistics.js: Refactored t-distribution inverse lookup function and adapted this
13         change to all invocations.
14         (Statistics.new.this.supportedConfidenceIntervalProbabilities):
15         (Statistics.new.this.supportedOneSideTTestProbabilities):
16         (Statistics.new.this.confidenceIntervalDelta):
17         (Statistics.new.sampleMeanAndVarianceForMultipleSamples):
18         (Statistics.new.this.probabilityRangeForWelchsT):
19         (Statistics.new.this.probabilityRangeForWelchsTFromTwoSampleSets):
20         (Statistics.new.this._determinetwoSidedProbabilityBoundaryForWelchsT):
21         (Statistics.new.this.computeWelchsT):
22         (Statistics.new.this._computeWelchsTFromStatistics):
23         (Statistics.new.this.minimumTForOneSidedProbability): Function that does t-distribution inverse lookup.
24         * public/v3/components/analysis-results-viewer.js: Adapted TestGroup.compareTestResults change.
25         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._measurementsForCommitSet):
26         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
27         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet): Deleted.
28         * public/v3/components/test-group-results-viewer.js: Show both comparisions for both individual and mean.
29         (TestGroupResultsViewer.prototype._renderResultsTable):
30         (TestGroupResultsViewer.prototype._buildRowForMetric.):
31         (TestGroupResultsViewer.prototype._buildValueMap):
32         * public/v3/models/test-group.js:
33         (TestGroup.compareTestResults): Added comparison for individual iterations.
34         * tools/js/test-group-result-page.js:
35         (TestGroupResultPage.prototype._constructTableForMetric):
36         (TestGroupResultPage.prototype.get styleTemplate):
37         (TestGroupResultPage):
38         (TestGroupResultPage.prototype._URLForAnalysisTask): Renamed to '_resultsForTestGroup'
39         * unit-tests/statistics-tests.js: Updated and added unit tests.
40
41 2018-07-13  Dewei Zhu  <dewei_zhu@apple.com>
42
43         CustomConfigurationTestGroupForm should dispatch different arguments based on whether analysis task is created.
44         https://bugs.webkit.org/show_bug.cgi?id=187675
45
46         Reviewed by Ryosuke Niwa.
47
48         This change will fix the bug that no notification will be sent for any test groups except the
49         first one in any custom perf-try A/B task.
50
51         * public/v3/components/custom-configuration-test-group-form.js:
52         (CustomConfigurationTestGroupForm.prototype.startTesting): Conditionally includes taskName based on
53         whether or not analysis task is created.
54
55 2018-07-03  Dewei Zhu  <dewei_zhu@apple.com>
56
57         MeasurementSet should merge last four segments into two if values are identical.
58         https://bugs.webkit.org/show_bug.cgi?id=187311
59
60         Reviewed by Ryosuke Niwa.
61
62         If last four segments has the same value, MeasurmentSet should merge them.
63
64         * public/v3/models/measurement-set.js: Added the logic to conditionally merge last segments.
65         (MeasurementSet.prototype.fetchSegmentation):
66         * unit-tests/measurement-set-tests.js: Added a unit test for this change.
67
68 2018-06-29  Dewei Zhu  <dewei_zhu@apple.com>
69
70         Manifest.reset should clear static map for BugTracker and Bug objects.
71         https://bugs.webkit.org/show_bug.cgi?id=187186
72
73         Reviewed by Ryosuke Niwa.
74
75         If static maps of BugTracker and Bug objects are not cleared up, updating singleton
76         of Bug object will fail assertion.
77
78         * public/v3/models/manifest.js: Clear static map for BugTracker and Bug.
79         (Manifest.reset):
80         * server-tests/api-manifest-tests.js: Added a unit test for this change.
81
82 2018-06-29  Dewei Zhu  <dewei_zhu@apple.com>
83
84         Fix a bug in range bisector that start commit may be counted twice.
85         https://bugs.webkit.org/show_bug.cgi?id=187205
86
87         Reviewed by Darin Adler.
88
89         Range bisector counted start commit twice if start commit is the same as end commit.
90
91         * public/v3/commit-set-range-bisector.js:
92         (CommitSetRangeBisector.async.commitSetClosestToMiddleOfAllCommits):
93         * unit-tests/commit-set-range-bisector-tests.js: Added a unit test for this change.
94
95 2018-06-28  Dewei Zhu  <dewei_zhu@apple.com>
96
97         Fix a bug ComponentBase that wrong content template may be used.
98         https://bugs.webkit.org/show_bug.cgi?id=187159
99
100         Reviewed by Ryosuke Niwa.
101
102         ComponentBase uses '_parsed' to mark whether content and style templates of a class
103         is parsed. However, derived class parsing will be skipped as 'Derive._parsed' is available
104         via prototype chain whenever the base class is parsed.
105
106         * browser-tests/component-base-tests.js: Added unit tests.
107         * public/v3/components/base.js: Added 'hasOwnProperty' to make sure current class is parsed.
108         (ComponentBase.prototype._ensureShadowTree):
109
110 2018-06-25  Dewei Zhu  <dewei_zhu@apple.com>
111
112         MeasurementSetAnalyzer should check triggerable availability before creating confirming A/B tests.
113         https://bugs.webkit.org/show_bug.cgi?id=187028
114
115         Reviewed by Ryosuke Niwa.
116
117         If the triggerable is not available, MeasurmentSetAnalyzer should only create analysis task without
118         confirming A/B tests.
119
120         * tools/js/measurement-set-analyzer.js: Added logic to check triggerable availability.
121         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet):
122         (MeasurementSetAnalyzer):
123         * unit-tests/measurement-set-analyzer-tests.js: Updated unit tests and added a new unit test for this change.
124
125 2018-06-11  Dewei Zhu  <dewei_zhu@apple.com>
126
127         Extend test group rule to support 'userInitiated' field.
128         https://bugs.webkit.org/show_bug.cgi?id=186544
129
130         Reviewed by Ryosuke Niwa.
131
132         Added support for rule specifying whether or not test group is user initiated.
133
134         * tools/js/analysis-results-notifier.js: Rule now support 'userInitiated' field.
135         (AnalysisResultsNotifier.prototype.async.sendNotificationsForTestGroups):
136         (AnalysisResultsNotifier.prototype._applyRules):
137         (AnalysisResultsNotifier._matchesRule):
138         * unit-tests/analysis-results-notifier-tests.js: Added unit tests for this change.
139
140 2018-05-29  Dewei Zhu  <dewei_zhu@apple.com>
141
142         CommitSet range bisector should use commits occur in commit sets which specify the range as valid commits for commits without ordering.
143         https://bugs.webkit.org/show_bug.cgi?id=186062
144
145         Reviewed by Ryosuke Niwa.
146
147         For commits without ordering, we should use the commits occurs in the commit sets which specify the range as valid commits.
148         Commit sets in range should only contain those valid commits for corresponding repositories.
149
150         * public/v3/commit-set-range-bisector.js: Updated logic to add check on commits without ordering.
151         (CommitSetRangeBisector.async.commitSetClosestToMiddleOfAllCommits):
152         * unit-tests/commit-set-range-bisector-tests.js: Added a unit test for this case.
153
154 2018-06-07  Dewei Zhu  <dewei_zhu@apple.com>
155
156         Related task may not have a metric or platform.
157         https://bugs.webkit.org/show_bug.cgi?id=186426
158
159         Reviewed by Ryosuke Niwa.
160
161         Related task in the related task list can be a custom analysis task which
162         may not have platform or metric.
163
164         * public/v3/pages/analysis-task-page.js: Added null checks for platform and metric.
165         (AnalysisTaskPage.prototype._renderRelatedTasks):
166
167 2018-06-07  Dewei Zhu  <dewei_zhu@apple.com>
168
169         Fix browser test failed assertions and a bug in 'common-component-base'
170         https://bugs.webkit.org/show_bug.cgi?id=186423
171
172         Reviewed by Ryosuke Niwa.
173
174         Fixed serveral assertion failures in browser tests.
175         Fixed a bug in common-component-base that null/undefined as attribute value is not allowed.
176
177         * browser-tests/chart-revision-range-tests.js: Should not import 'lazily-evaluated-function.js' twice.
178         * browser-tests/chart-status-evaluator-tests.js: Should not import 'lazily-evaluated-function.js' twice.
179         * browser-tests/component-base-tests.js: Added a unit test for element attributes being null or undefined.
180         * browser-tests/index.html: Make mocked data from makeSampleCluster also contains commit_order.
181         * public/shared/common-component-base.js: Make it allow to take null as attribute value.
182         (CommonComponentBase.createElement):
183
184 2018-05-24  Dewei Zhu  <dewei_zhu@apple.com>
185
186         Added sending notification feature when test group finishes.
187         https://bugs.webkit.org/show_bug.cgi?id=184340
188
189         Reviewed by Ryosuke Niwa.
190
191         Added 'testgroup_needs_notification' filed to 'analysis_test_group' table to indicate whether a test group
192         has a pending notification.
193         Added 'testgroup_notification_sent_at' to record the last notification sent time.
194         SQL queries to update existing database are:
195             'ALTER TABLE analysis_test_groups ADD COLUMN testgroup_needs_notification boolean NOT NULL DEFAULT FALSE;'
196             'ALTER TABLE analysis_test_groups ADD COLUMN testgroup_notification_sent_at timestamp DEFAULT NULL;'
197         Updated 'run-analysis' script to be able to send notification when test group finishes.
198         Added 'Notify on completion' checkbox while creating/retrying/bisecting a test group.
199
200         * browser-tests/test-group-form-tests.js: Updated existing tests and added a new test.
201         * browser-tests/test-group-result-page-tests.js: Added unit tests for TestGroupResultPage.
202         * init-database.sql: Added 'testgroup_needs_notification' filed to 'analysis_test_group' table.
203         * public/api/test-groups.php: Added '/api/test-groups/ready-for-notification' API to 'test-group' to show all
204         test groups that need to send notification. Only the ones with 'completed', 'failed' or 'cancelled' status and its
205         'testgroup_needs_notification' is true will be returned by this API.
206         * public/include/build-requests-fetcher.php: Added 'fetch_requests_for_groups' to return test groups with given ids.
207         * public/include/commit-sets-helpers.php: Updated the logic to support setting 'testgroup_needs_notification'
208         while create an analysis_test_groups.
209         * public/privileged-api/create-analysis-task.php: Updated the logic to support setting 'testgroup_needs_notification'.
210         * public/privileged-api/create-test-group.php: Updated the logic to support setting 'testgroup_needs_notification'.
211         * public/privileged-api/update-test-group.php: Updated the logic to support updating 'testgroup_needs_notification'.
212         Extended this API to allow authentication both from CSRF token and slave.
213         * public/v3/components/custom-configuration-test-group-form.js:
214         (CustomConfigurationTestGroupForm.prototype.startTesting): Pass 'notifyOnCompletion' information which represents
215         'testgroup_needs_notification' from API perspective.
216         * public/v3/components/customizable-test-group-form.js:
217         (CustomizableTestGroupForm.prototype.startTesting): Pass 'notifyOnCompletion' information which represents
218         'testgroup_needs_notification' from API perspective.
219         (CustomizableTestGroupForm.cssTemplate): Added space between 'Notify on completion' checkbox and test group iteration selection list.
220         * public/v3/components/test-group-form.js:
221         (TestGroupForm): Added '_notifyOnCompletion' instance variable.
222         (TestGroupForm.prototype.didConstructShadowTree): Added 'onchange' event for notify on completion checkbox.
223         (TestGroupForm.prototype.startTesting): Pass 'notifyOnCompletion' information which represents
224         'testgroup_needs_notification' from API perspective.
225         (TestGroupForm.cssTemplate): Added space between 'Notify on completion' checkbox and test group iteration selection list.
226         * public/v3/models/analysis-results.js: Export 'AnalysisResults'.
227         (AnalysisResults.fetch): Update API path to use absolute url.
228         (AnalysisResults):
229         * public/v3/models/analysis-task.js:
230         (AnalysisTask.async.create): Extend this function to take notifyOnCompletion as argument which will be used as
231         'needsNotification' to send to server.
232         (AnalysisTask):
233         * public/v3/models/test-group.js:
234         (TestGroup): Added '_needsNotification' field.
235         (TestGroup.prototype.updateSingleton): Added logic to update '_needsNotification' field.
236         (TestGroup.prototype.needsNotification): Returns '_needsNotification' field.
237         (TestGroup.prototype.author): Returns author information.
238         (TestGroup.prototype.async.didSendNotification): API that updates 'testgroup_needs_notification' to true.
239         (TestGroup.prototype.async.fetchTask): API to fetch the task when it has not been fetched.
240         (TestGroup.createWithTask): Updated this function to accept 'notifyOnCompletion' which will be used as
241         'needsNotification' to send to server.
242         (TestGroup.createWithCustomConfiguration): Updated this function to accept 'notifyOnCompletion' which will be used as
243         'needsNotification' to send to server.
244         (TestGroup.createAndRefetchTestGroups): Updated this function to accept 'notifyOnCompletion' which will be used as
245         'needsNotification' to send to server.
246         (TestGroup.fetchAllWithNotificationReady): New function that invokes '/api/test-groups/ready-for-notification'.
247         * public/v3/pages/analysis-task-page.js: Update logic to 'notifyOnCompletion' around
248         (AnalysisTaskChartPane.prototype.didConstructShadowTree):
249         (AnalysisTaskResultsPane.prototype.didConstructShadowTree):
250         (AnalysisTaskTestGroupPane.prototype.didConstructShadowTree):
251         (AnalysisTaskPage.prototype.didConstructShadowTree):
252         (AnalysisTaskPage.prototype._retryCurrentTestGroup):
253         (AnalysisTaskPage.prototype.async._bisectCurrentTestGroup):
254         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList.set const):
255         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
256         (AnalysisTaskPage.prototype._createCustomTestGroup):
257         * public/v3/pages/chart-pane.js: Added 'Notify on completion' checkbox.
258         (ChartPane.prototype.didConstructShadowTree):
259         (ChartPane.prototype.async._analyzeRange):
260         * public/v3/pages/create-analysis-task-page.js: Adapted API change.
261         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup):
262         * server-tests/api-test-groups.js: Added tests for '/api/test-groups/ready-for-notification'.
263         * server-tests/privileged-api-create-analysis-task-tests.js: Updated tests to adapt this change.
264         Added new tests.
265         * server-tests/privileged-api-create-test-group-tests.js: Added new tests.
266         * server-tests/privileged-api-update-test-group-tests.js: Added unit test for 'update-test-group' API.
267         * server-tests/resources/mock-data.js: addMockData should set 'testgroup_needs_notification' to be true.
268         * server-tests/tools-sync-buildbot-integration-tests.js: Updated tests to adapt this change.
269         (async.createTestGroupWihPatch):
270         (createTestGroupWihOwnedCommit):
271         * tools/js/analysis-results-notifier.js: Added notifier to send notification for completed test groups.
272         (AnalysisResultsNotifier):
273         (AnalysisResultsNotifier.prototype.async.sendNotificationsForTestGroups):
274         (AnalysisResultsNotifier.prototype._sendNotification): Invoke remote API to send notification.
275         (AnalysisResultsNotifier.prototype._constructMessageByRules):
276         (AnalysisResultsNotifier._matchesRule):
277         (AnalysisResultsNotifier._applyUpdate):
278         (AnalysisResultsNotifier.async._messageForTestGroup): Build html as message body for a test group.
279         (AnalysisResultsNotifier._URLForAnalysisTask): Returns URL for an analysis task.
280         (AnalysisResultsNotifier._instantiateNotificationTemplate):
281         * tools/js/test-group-result-page.js: Added 'TestGroupResultPage' and 'BarGraph' to show test group result.
282         (TestGroupResultPage):
283         (TestGroupResultPage.prototype.async.setTestGroup):
284         (TestGroupResultPage._urlForAnalysisTask):
285         (TestGroupResultPage.prototype._URLForAnalysisTask):
286         (TestGroupResultPage.prototype.constructTables):
287         (TestGroupResultPage.prototype._constructTableForMetric):
288         (TestGroupResultPage.):
289         (TestGroupResultPage.prototype.get pageContent):
290         (TestGroupResultPage.prototype.get styleTemplate):
291         (BarGraph):
292         (BarGraph.prototype.setWidth):
293         (BarGraph.prototype._constructBarGraph):
294         (BarGraph.prototype.get pageContent):
295         (BarGraph.prototype.get styleTemplate):
296         * tools/js/measurement-set-analyzer.js: Adapted 'AnalysisTask.create' change.
297         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet):
298         (MeasurementSetAnalyzer):
299         * tools/js/v3-models.js:
300         * tools/run-analysis.js: Added the logic that sends notification for completed test groups.
301         (main):
302         (async.analysisLoop):
303         * unit-tests/analysis-task-tests.js:
304         * unit-tests/analysis-results-notifier-tests.js: Added a unit test for 'AnalysisResultsNotifier' and 'NotificationService'.
305         * unit-tests/measurement-set-analyzer-tests.js: Updated unit tests per this change.
306         * unit-tests/test-groups-tests.js: Added unit tests for 'TestGroup.needsNotification'.
307         * unit-tests/resources/mock-remote-api.js: Only set 'privilegedAPI' when it exits.
308
309 2018-06-07  Ryosuke Niwa  <rniwa@webkit.org>
310
311         Add the basic support for writing components in node.js
312         https://bugs.webkit.org/show_bug.cgi?id=186299
313
314         Reviewed by Antti Koivisto.
315
316         Add the basic support for writing components in node.js for generating rich email notifications.
317
318         To do this, this patch introduces MarkupComponentBase and MarkupPage which implement similar API
319         to ComponentBase and Page classes of v3 UI code. This enables us to share code between frontend
320         and the backend in the future. Because there is no support for declarative custom elements or
321         shadow root in HTML, MarkupComponentBase uses a similar but distinct concept of "content" tree
322         to represent the "DOM" tree for a component. When generating the HTML, MarkupComponentBase and
323         MarkupPage collectively transforms stylesheets and flattens the tree into a single HTML. In order
324         to keep this flatteneing logic simple, MarkupComponentBase only supports a very small subset of
325         CSS selectors to select elements by their local names and class names.
326
327         Specifically, each class name and element name based selectors are replaced by a globally unique
328         class name based selector, and each element which matches the selector is applied of the same
329         globally unique class name. The transformation is applied when constructing the "content" tree
330         as well as calls to renderReplace.
331
332         Because much of v3 frontend code relies on DOM API, this patch also implements the simplest form
333         of a fake DOM API as MarkupNode, MarkupParentNode, MarkupElement, and MarkupText. In order to avoid
334         reimplementing HTML & CSS parsers, this patch introduces the concept of content and style templates
335         to ComponentBase which are JSON alternatives to HTML & CSS template strings which can be used in
336         both frontend & backend.
337
338         * browser-tests/close-button-tests.js: Include CommonComponentBase.
339         * browser-tests/commit-log-viewer-tests.js: Ditto.
340         * browser-tests/component-base-tests.js: Ditto. Added a test cases for content & style templates.
341         (async.importComponentBase): Added.
342         * browser-tests/editable-text-tests.js: Include CommonComponentBase.
343         * browser-tests/index.html:
344         * browser-tests/markup-page-tests.js: Added.
345         * browser-tests/page-router-tests.js: Include CommonComponentBase.
346         * browser-tests/page-tests.js: Ditto.
347         * browser-tests/test-group-form-tests.js: Ditto.
348         * public/shared/common-component-base.js: Added.
349         (CommonComponentBase): Extracted out of ComponentBase.
350         (CommonComponentBase.prototype.renderReplace): Added.
351         (CommonComponentBase.renderReplace): Moved from ComponentBase.
352         (CommonComponentBase.prototype._recursivelyUpgradeUnknownElements): Moved and renamed from
353         ComponentBase's _recursivelyReplaceUnknownElementsByComponents.
354         (CommonComponentBase.prototype._upgradeUnknownElement): Extracted out of the same function.
355         (CommonComponentBase._constructStylesheetFromTemplate): Added.
356         (CommonComponentBase._constructNodeTreeFromTemplate): Added.
357         (CommonComponentBase.prototype.createElement): Added.
358         (CommonComponentBase.createElement): Moved from ComponentBase.
359         (CommonComponentBase._addContentToElement): Moved from ComponentBase.
360         (CommonComponentBase.prototype.createLink): Added.
361         (CommonComponentBase.createLink): Moved from ComponentBase.
362         (CommonComponentBase._context): Added. Set to document in a browser and MarkupDocument in node.js.
363         (CommonComponentBase._isNode): Added. Set to a function which does instanceof Node/MarkupNode check.
364         (CommonComponentBase._baseClass): Added. Set to ComponentBase or MarkupComponentBase.
365         * public/v3/components/base.js:
366         (ComponentBase):
367         (ComponentBase.prototype._ensureShadowTree): Added the support for the content and style templates.
368         Also avoid parsing the html template each time a component is instantiated by caching the result.
369         * public/v3/index.html:
370         * tools/js/markup-component.js: Added.
371         (MarkupDocument): Added. A fake Document.
372         (MarkupDocument.prototype.createContentRoot): A substitude for attachShadow.
373         (MarkupDocument.prototype.createElement):
374         (MarkupDocument.prototype.createTextNode):
375         (MarkupDocument.prototype._idForClone):
376         (MarkupDocument.prototype.reset):
377         (MarkupDocument.prototype.markup):
378         (MarkupDocument.prototype.escapeAttributeValue):
379         (MarkupDocument.prototype.escapeNodeData):
380         (MarkupNode): Added. A fake Node. Each node gets an unique ID.
381         (MarkupNode.prototype._markup):
382         (MarkupNode.prototype.clone): Implemented by the leave class.
383         (MarkupNode.prototype._cloneNodeData):
384         (MarkupNode.prototype.remove):
385         (MarkupParentNode): Added. An equivalent of ContainerNode in WebCore.
386         (MarkupParentNode.prototype.get childNodes):
387         (MarkupParentNode.prototype._cloneNodeData):
388         (MarkupParentNode.prototype.appendChild):
389         (MarkupParentNode.prototype.removeChild):
390         (MarkupParentNode.prototype.removeAllChildren):
391         (MarkupParentNode.prototype.replaceChild):
392         (MarkupContentRoot): Added. Used like a shadow tree.
393         (MarkupContentRoot.prototype._markup): Added.
394         (MarkupElement): Added. A fake Element. It also implements a subset of IDL attributes implemented by
395         subclasses such as HTMLInputElement for simplicity.
396         (MarkupElement.prototype.get id): Added.
397         (MarkupElement.prototype.get localName): Added.
398         (MarkupElement.prototype.clone): Added.
399         (MarkupElement.prototype.appendChild): Added.
400         (MarkupElement.prototype.addEventListener): Added.
401         (MarkupElement.prototype.setAttribute): Added.
402         (MarkupElement.prototype.getAttribute): Added.
403         (MarkupElement.prototype.get attributes): Added.
404         (MarkupElement.prototype.get textContent): Added.
405         (MarkupElement.prototype.set textContent): Added.
406         (MarkupElement.prototype._serializeStyle): Added.
407         (MarkupElement.prototype._markup): Added. Flattens the tree with content tree like copy & paste so
408         this can't be used to implement innerHTML.
409         (MarkupElement.prototype.get value): Added.
410         (MarkupElement.prototype.set value): Added.
411         (MarkupElement.prototype.get style): Added. Returns a fake writeonly CSSStyleDeclaration.
412         (MarkupElement.prototype.set style): Added.
413         (MarkupElement.get selfClosingNames): Added. A small list of self-closing tags for the HTML generation.
414         (MarkupText): Added.
415         (MarkupText.prototype.clone): Added.
416         (MarkupText.prototype._markup): Added.
417         (MarkupText.prototype.get data): Added.
418         (MarkupText.prototype.set data): Added.
419         (MarkupComponentBase): Added.
420         (MarkupComponentBase.prototype.element): Added. Like ComponentBase's element.
421         (MarkupComponentBase.prototype.content): Added. Like ComponentBase's content.
422         (MarkupComponentBase.prototype._findElementRecursivelyById): Added. A fake getElementById.
423         (MarkupComponentBase.prototype.render): Added. Like ComponentBase's render.
424         (MarkupComponentBase.prototype.runRenderLoop): Added. In ComponentBase, we use requestAnimationFrame.
425         In MarkupComponentBase, we keep rendering until the queue drains empty.
426         (MarkupComponentBase.prototype.renderReplace): Added. Like ComponentBase's renderReplace but applies
427         the transformation of classes to workaround the lack of shadow tree support in scriptless HTML.
428         (MarkupComponentBase.prototype._applyStyleOverrides): Added. Recursively applies the transformation.
429         (MarkupComponentBase.prototype._ensureContentTree): Added. Like ComponentBase's _ensureShadowTree.
430         (MarkupComponentBase.reset): Added.
431         (MarkupComponentBase._parseTemplates): Added. Parses the content & style templates, and generates the
432         transformed fake DOM tree and stylesheet text whereby selectors in each component is modified to be
433         unique across all components. The function to apply the necessary changes to an element is saved in
434         the global map of components, and later used in renderReplace via _applyStyleOverrides.
435         (MarkupComponentBase.defineElement): Added. Like ComponentBase's defineElement.
436         (MarkupComponentBase.prototype.createEventHandler): Added.
437         (MarkupComponentBase.createEventHandler): Added.
438         (MarkupPage): Added. The top-level component responsible for generating a DOCTYPE, head, and body.
439         (MarkupPage.prototype.pageTitle): Added.
440         (MarkupPage.prototype.content): Added. Overrides the one in MarkupComponentBase to return what would
441         be the content of the body element as opposed to the html element for the connivance of subclasses,
442         and to match the behavior of the frontend Page class.
443         (MarkupPage.prototype.render): Added.
444         (MarkupPage.prototype._updateComponentsStylesheet): Added. Concatenates the transformed stylesheet of
445         all components used.
446         (MarkupPage.get contentTemplate): Added.
447         (MarkupPage.prototype.generateMarkup): Added. Enqueues the page to render, spin the render loop, and
448         generates the HTML. We enqueue the page twice in order to invoke _updateComponentsStylesheet after
449         all subcomponent had finished rendering.
450         * unit-tests/markup-component-base-tests.js: Added.
451         * unit-tests/markup-element-tests.js: Added.
452         (.createElement): Added.
453         * unit-tests/markup-page-tests.js: Added.
454
455 2018-05-23  Dewei Zhu  <dewei_zhu@apple.com>
456
457         OSBuildFetcher should respect maxRevision while finding OS builds to report.
458         https://bugs.webkit.org/show_bug.cgi?id=185925
459
460         Reviewed by Ryosuke Niwa.
461
462         * server-tests/tools-os-build-fetcher-tests.js: Fix a typo in the unit tests.
463         Added unit tests for this change. Aslo convert an existing test using async.
464         * tools/js/os-build-fetcher.js:
465         (prototype._fetchAvailableBuilds): It should also use 'maxRevision' to filter builds to be reported.
466         It should use 'minRevisionOrder' when no commit has ever been submitted.
467         (prototype._commitsForAvailableBuilds): Takes 'maxOrder' as fifth argument.
468         'minOrder' and 'maxOrder' should be inclusive.
469
470 2018-05-11  Dewei Zhu  <dewei_zhu@apple.com>
471
472         Update ChartPane per change r231087.
473         https://bugs.webkit.org/show_bug.cgi?id=185570
474
475         Reviewed by Ryosuke Niwa.
476
477         On r231087 we change the return type of AnalysisTask.create, ChartPane needs to adapt
478         this change.
479
480         * public/v3/pages/chart-pane.js: Adapted the change that AnalysisTask.create now returns
481         an AnalysisTask object.
482         (ChartPane.prototype.async._analyzeRange):
483
484 2018-05-10  Dewei Zhu  <dewei_zhu@apple.com>
485
486         CommitLogViewer._preceedingCommit should not always be null
487         https://bugs.webkit.org/show_bug.cgi?id=185540
488
489         Reviewed by Ryosuke Niwa.
490
491         Fix the bug introduced in r227746 that CommitLogViewer._preceedingCommit is always null.
492
493         * browser-tests/index.html: Fix expected measurement-set url.
494         * public/v3/components/commit-log-viewer.js:
495         (CommitLogViewer.prototype._fetchCommitLogs): CommitLogViewer._preceedingCommit should be set
496          when fetching for preceeding revision succeeds.
497
498 2018-05-03  Dewei Zhu  <dewei_zhu@apple.com>
499
500         Range bisector should check the commits for repositories without change in specified range.
501         https://bugs.webkit.org/show_bug.cgi?id=185269
502
503         Reviewed by Ryosuke Niwa.
504
505         For repositories without a change in the specified range, we still need to use them to filter commit
506         sets. Before this change, code does not apply filtering by those repositories against commit set. As
507         a result, commit sets with different commits for those repositories may be chosen as bisecting commit set.
508
509         * public/v3/commit-set-range-bisector.js: Updated the logic to verify range for repositories without
510         change in range.
511         (CommitSetRangeBisector.async.commitSetClosestToMiddleOfAllCommits):
512         * unit-tests/commit-set-range-bisector-tests.js: Added a unit test to guard against this change.
513
514 2018-05-02  Dewei Zhu  <dewei_zhu@apple.com>
515
516         Create analysis task should sync analysis task status after creation.
517         https://bugs.webkit.org/show_bug.cgi?id=185222
518
519         Reviewed by Ryosuke Niwa.
520
521         * public/v3/models/analysis-task.js:
522         (AnalysisTask.async.create): Fetch newly-created analysis task right about its creation.
523         (AnalysisTask):
524         * tools/js/measurement-set-analyzer.js:
525         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet): Adjust as 'AnalysisTask.create' now
526         returns an anlysis task instance.
527         (MeasurementSetAnalyzer):
528         * unit-tests/analysis-task-tests.js: Added a unit test for this change.
529         (async):
530         * unit-tests/measurement-set-analyzer-tests.js: Update unit tests accordingly.
531         Fix a typo in one previous unit test.
532         (async):
533
534 2018-05-01  Dewei Zhu  <dewei_zhu@apple.com>
535
536         Write a script that detects chart changes by using v3 API.
537         https://bugs.webkit.org/show_bug.cgi?id=184419
538
539         Reviewed by Ryosuke Niwa.
540
541         Added a script that detects chart changes and schedule confirming analysis task.
542
543         * browser-tests/async-task-tests.js: Added a unit test for 'AsyncTask'.
544         * browser-tests/index.html: Added import for 'AsyncTask' for testing.
545         * public/shared/statistics.js: Make 'findRangesForChangeDetectionsWithWelchsTTest' defaults to 0.99 one sided possibility.
546         (Statistics.new.this.findRangesForChangeDetectionsWithWelchsTTest):
547         * public/v3/async-task.js:
548         (AsyncTask.isAvailable): Helper function to determine whether AsyncTask is available or not as 'Worker' is
549         not available in nodejs.
550         (AsyncTask):
551         * public/v3/models/bug.js: Export as a module.
552         * public/v3/models/measurement-set.js:
553         (MeasurementSet.prototype._invokeSegmentationAlgorithm): Added a check to avoid using AsyncTask when running in NodeJs.
554         (MeasurementSet):
555         * server-tests/resources/common-operations.js: Added a helper function to assert certain exception is thrown.
556         (async.assertThrows):
557         * tools/js/measurement-set-analyzer.js: Added 'MeasurementSetAnalyzer' module for analyzing measurement set.
558         (MeasurementSetAnalyzer):
559         (MeasurementSetAnalyzer.prototype.async.analyzeOnce):
560         (MeasurementSetAnalyzer.measurementSetListForAnalysis):
561         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet):
562         * tools/js/v3-models.js: Added import for 'Bug' object.
563         * tools/run-analysis.js: Added this script to detect measurement set changes.
564         (main):
565         (async.analysisLoop):
566         * unit-tests/measurement-set-analyzer-tests.js: Added unit tests for 'MeasurementSetAnalyzer'.
567         * unit-tests/resources/mock-v3-models.js: Reset 'MeasurementSet._set' every time.
568         Update mock platform to include lastModifiedByMetric information.
569         (MockModels.inject):
570
571 2018-04-30  Ryosuke Niwa  <rniwa@webkit.org>
572
573         Creating a custom analysis task after fetching all analysis tasks fail
574         https://bugs.webkit.org/show_bug.cgi?id=184641
575
576         Reviewed by Saam Barati.
577
578         The bug was caused by AnalysisTask._fetchSubset not fetching the analysis task when all analysis tasks
579         had previously been fetched (AnlaysisTask._fetchAllPromise is set) even when noCache is set to true.
580         Fixed it by ignornig _fetchAllPromise when noCache is set to true.
581
582         This patch also adds noCache argument to AnalysisTask.fetchById and reverts the inadvertent change in
583         r226836 to always set noCache to true in this function.
584
585         * public/v3/models/analysis-task.js:
586         (AnalysisTask.fetchById): Added noCache argument instead of always specifying true, and modernized the code.
587         (AnalysisTask._fetchSubset): Fixed the bug. See above description.
588         * public/v3/models/test-group.js:
589         (TestGroup.createWithTask): Set noCache to true when calling AnalysisTask.fetchById here.
590         * unit-tests/analysis-task-tests.js: Added test cases for AnalysisTask.fetchById, including a test
591         to make sure it doesn't fetch the specified analysis task when noCache is set to false and all analysis
592         tasks had previously been fetched for the aforementioned revert of the inadvertent change in r226836.
593         (sampleAnalysisTasks): Renamed from sampleAnalysisTasks as the result contains multiple analysis tasks.
594         * unit-tests/test-groups-tests.js: Added a test case for TestGroup.createWithTask
595
596 2018-04-30  Ryosuke Niwa  <rniwa@webkit.org>
597
598         REGRESSION(r230960): Browser tests under TimeSeriesChart fetchMeasurementSets all fail
599         https://bugs.webkit.org/show_bug.cgi?id=185125
600
601         Reviewed by Saam Barati.
602
603         The bug was caused by mock-remote-api.js always loading PrivilegedAPI using require, which doesn't work in a browser.
604         Fixed the bug by explicitly requiring the right kind of PrivilegedAPI in each unit test instead.
605
606         * unit-tests/analysis-task-tests.js:
607         * unit-tests/buildbot-syncer-tests.js:
608         * unit-tests/commit-log-tests.js:
609         * unit-tests/commit-set-range-bisector-tests.js:
610         * unit-tests/commit-set-tests.js:
611         * unit-tests/measurement-set-tests.js:
612         * unit-tests/privileged-api-tests.js:
613         * unit-tests/resources/mock-remote-api.js:
614         (MockRemoteAPI.inject): Take PrivilegedAPI instead of the type string. Also fixed a bug that _token wasn't unset
615         after each unit test, and superfluous initializations of originalRemoteAPI and originalPrivilegedAPI.
616         * unit-tests/test-groups-tests.js:
617
618 2018-04-30  Dewei Zhu  <dewei_zhu@apple.com>
619
620         MeasurementSet._constructUrl should construct absolute url.
621         https://bugs.webkit.org/show_bug.cgi?id=185137
622
623         Reviewed by Ryosuke Niwa.
624
625         MeasurementSet._constructUrl should not construct an url with relative path.
626
627         * public/v3/models/measurement-set.js: Should use '/api/measurement-set...' and '/data/measurement-set-...'
628         for uncached and cached fetching.
629         * unit-tests/measurement-set-tests.js: Updated unit tests.
630         (const.set MeasurementSet):
631
632 2018-04-26  Dewei Zhu  <dewei_zhu@apple.com>
633
634         Extend create-analysis-test API to be able to create with confirming test group.
635         https://bugs.webkit.org/show_bug.cgi?id=184958
636
637         Reviewed by Ryosuke Niwa.
638
639         Extend create-analysis-test API to be able to create an analysis task with confirming test group.
640         Update create analysis task UI in chart pane to adapt this new API.
641         Refactored '/privileged-api/create-test-group' API to share some creating test group logic with '/privileged-api/create-analysis-task' API.
642         Moved the shared logic to commit-sets-helpers.php.
643
644         * public/api/analysis-tasks.php: Use 'require_once' instead of 'require'.
645         * public/include/commit-sets-helpers.php: Added.
646         (create_test_group_and_build_requests): A helper function that creates test group and build requests for a analysis
647         task. In long term, this should be a class to avoid passing long argument list around.
648         (insert_commit_sets_and_construct_configuration_list): Based on commit sets returns build and test configurations.
649         (insert_build_request_for_configuration): Insert build requests based on configuration.
650         (commit_sets_from_revision_sets): Returns commit sets from given revision set list.
651         * public/privileged-api/create-analysis-task.php: Added the ability to create analysis task with confirming test
652         groups when repetition count is specified.
653         * public/privileged-api/create-test-group.php: Moved shared function to commit-sets-helpers.php.
654         * public/v3/models/analysis-task.js:
655         (AnalysisTask.create): Instead of accepting run ids, it now accepts points and test group name and confirming iterations.
656         It will conditionally add test group information into parameter when confirming iterations is a positive number.
657         (AnalysisTask):
658         * public/v3/models/commit-set.js:
659         (CommitSet.revisionSetsFromCommitSets): Move 'TestGroup._revisionSetsFromCommitSets' since CommitSet class is more
660         appropriate place and it will be shared by both TestGroup and AnalysisTask
661         (CommitSet):
662         * public/v3/models/test-group.js:
663         (TestGroup.createWithTask): Adapt 'CommitSet.revisionSetsFromCommitSets'.
664         (TestGroup.createWithCustomConfiguration): Adapt 'CommitSet.revisionSetsFromCommitSets'.
665         (TestGroup.createAndRefetchTestGroups): Adapt 'CommitSet.revisionSetsFromCommitSets'.
666         (TestGroup._revisionSetsFromCommitSets): Deleted and moved to 'CommitSet.revisionSetsFromCommitSets'.
667         * public/v3/pages/chart-pane.js:
668         (ChartPane.prototype.didConstructShadowTree): Added the logic to disable options when checkbox for creating confirming
669         test group is unchecked.
670         (ChartPane.prototype._analyzeRange): Conditionally create confirming test group from UI.
671         (ChartPane.cssTemplate):
672         * server-tests/privileged-api-create-analysis-task-tests.js: Added unit tests. Added a unit test for 'NodePrivilegedAPI'.
673         * unit-tests/analysis-task-tests.js: Added unit tests.
674         * unit-tests/commit-set-tests.js: Added unit test for 'CommitSet.revisionSetsFromCommitSets'.
675         * unit-tests/resources/mock-remote-api.js: Reset csrf token when BrowserPrivilegedAPI is used.
676         (MockRemoteAPI.inject):
677
678 2018-04-23  Dewei Zhu  <dewei_zhu@apple.com>
679
680         Tool scripts should not use PrivilegedAPI from 'public/v3/privileged-api.js'.
681         https://bugs.webkit.org/show_bug.cgi?id=184766
682
683         Reviewed by Ryosuke Niwa.
684
685         For tools, we should not use PrivilegedAPI for tools as current PrivilegedAPI
686         is used by UI and it is unnecessary to generate CSRF token for tools.
687         Will post a followup patch that creates a PrivilegedAPI used by tools.
688         Make a change on TestServer.inject and MockRemoteAPI.inject to allow specifying
689         BrowserPrivilegedAPI or NodePrivilegedAPI in the test. Currently defaults to
690         BrowserPrivilegedAPI as this is the test behavior before this change.
691
692         * server-tests/resources/common-operations.js: Allow passing type of privileged api
693         information to TestServer.inject.
694         * server-tests/resources/test-server.js: Conditionally inject PrivilegedAPI based on
695         type of privileged api.
696         (TestServer.prototype.inject):
697         (TestServer):
698         * server-tests/tools-buildbot-triggerable-tests.js: Updated 'prepareServerTest' invocation.
699         * server-tests/tools-os-build-fetcher-tests.js: Updated 'prepareServerTest' invocation.
700         * server-tests/tools-sync-buildbot-integration-tests.js: Temporarily injecting
701         BrowserPrivilegedAPI for mocking UploadedFile. The actual script does not rely on
702         BrowserPrivilegedAPI at all.
703         (async.createTestGroupWihPatch):
704         (beforeEach):
705         * tools/js/privileged-api.js: Added NodePrivilegedAPI
706         (NodePrivilegedAPI.prototype.sendRequest):
707         (NodePrivilegedAPI.configure): Configure the slave name and password.
708         (NodePrivilegedAPI):
709         * tools/js/v3-models.js: Removed the import of PrivilegedAPI.
710         * unit-tests/privileged-api-tests.js:. Added unit tests for NodePrivilegedAPI.
711         * unit-tests/resources/mock-remote-api.js: Conditionally inject PrivilegedAPI based on
712         the type of privileged api.
713         (MockRemoteAPI.inject):
714
715 2018-04-23  Dewei Zhu  <dewei_zhu@apple.com>
716
717         Revision information returned by querying measurement set api with analysis task id should contain commit order.
718         https://bugs.webkit.org/show_bug.cgi?id=184902
719
720         Reviewed by Ryosuke Niwa.
721
722         This is a bug fix for r230719 which does not cover the case while querying `measurement-set.php?analysisTask=$task_id`
723
724         * public/api/measurement-set.php: AnalysisResultsFetcher.fetch_commits results should contains commit order.
725         * server-tests/api-measurement-set-tests.js: Added unit test for this change.
726
727 2018-04-19  Dewei Zhu  <dewei_zhu@apple.com>
728
729         Add a bisect button to automatically schedule bisecting A/B tasks.
730         https://bugs.webkit.org/show_bug.cgi?id=183888
731
732         Reviewed by Ryosuke Niwa.
733
734         Extended AnalysisTask's ability to figure out bisecting A/B tasks based on existing data points and test groups.
735         Updated analysis page UI to show bisect button which will only appear when the middle commit set of the range in
736         test group can be found.
737
738         Finding middle commit set algorithm is described as follows:
739         1. Find all commits from multiple repositories among the ranges specified by two commit sets in test group. In
740         the meanwhile, merge all commits that have commit time into a single list. For commits only have commit order,
741         put those commits into separate lists.
742         2. Filter all the available commit sets in current analysis task by keeping the ones have exact repositories
743         as the two commit sets in specified test group, and every commit of a commit set is in side the commit range.
744         After filtering the commit sets, sort the remaining ones and only keep one commit set if multiple commit sets
745         are equal to each other.
746         3. Among commits processed by step 2, find the commit sets that have the commit which is closest to the middle of
747         all commits that have commit time created from step 1.
748         4. Among commits processed by step 3, find the commit sets that have the commit which is closest to the middle of
749         commits that only have commit order and categorized by repository. We have to iterate through repository as commit
750         order is not granted to be comparable between different repositories.
751         5. If more than one commit sets are found, choose the middle commit set.
752
753         * public/v3/commit-set-range-bisector.js: Added.
754         (CommitSetRangeBisector.async.commitSetClosestToMiddleOfAllCommits): Instead of naively returning the middle of
755         existing commit set array, this function selects a bisect bisection points that is closest to actually middle of
756         the revision range based on all revisions reported to performance dashboard.
757         (CommitSetRangeBisector._findCommitSetsWithinRange): Helper function to find commit sets those are in specified range.
758         (CommitSetRangeBisector._orderCommitSetsByTimeAndOrderThenDeduplicate): Helper function to sort and deduplicate commit sets.
759         (CommitSetRangeBisector._closestCommitSetsToBisectingCommitByTime): Helper function to find the commit sets those
760         are closest to the middle of among all the commits in the range that have commit time.
761         (CommitSetRangeBisector._findCommitSetsClosestToMiddleOfCommitsWithOrder): Helper function which goes through all
762         repositories the commit of which has commit order, and find the commit sets those are closest to the middle of
763         commits for each repository.
764         (CommitSetRangeBisector._buildCommitToCommitSetMap): Helper function to builder mapping from a commit to commit
765         sets those contain this commit.
766         (CommitSetRangeBisector._findCommitClosestToMiddleIndex): Helper function to find closest commit to the middle of index.
767         (CommitSetRangeBisector):
768         * public/v3/index.html: Imports 'public/v3/commit-set-range-bisector.js'.
769         * public/v3/models/analysis-task.js:
770         (AnalysisTask.prototype.async.commitSetsFromTestGroupsAndMeasurementSet): Aggregates all existing commit sets in
771         test groups of current analysis tasks.
772         * public/v3/models/commit-log.js:
773         (CommitLog.prototype.hasCommitTime): A helper function determine whether a commit has a commit time. For commit
774         that does not have time, server will return commit time as zero. As it is unrealistic for a commit has commit time
775         0, it would be safe to assume a valid commit time is greater than 0.
776         (CommitLog.prototype.hasCommitOrder): Returns whether a commit has a commit oder.
777         (CommitLog.hasOrdering): Determine whether we can order two commits by commit time or commit order.
778         (CommitLog.orderTwoCommits): Order two commits incrementally.
779         * public/v3/models/commit-set.js:
780         (CommitSet.prototype.hasSameRepositories): A helper function to determine whether a commit set has same repositories
781         as current repository.
782         (CommitSet.containsRootOrPatchOrOwnedCommit): A helper function to determine whether current commit set has root,
783         patch or owned commit.
784         (CommitSet.commitForRepository): This function defined twice identically, remove one of them.
785         * public/v3/models/test-group.js: Make '_computeRequestedCommitSets' a static function as it does not use any
786         instance variables.
787         * public/v3/pages/analysis-task-page.js: Added bisect button.
788         (AnalysisTaskTestGroupPane):
789         (AnalysisTaskTestGroupPane.prototype.didConstructShadowTree):
790         (AnalysisTaskTestGroupPane.prototype.setTestGroups): Update 'setTestGroups' to update _bisectingCommitSetByTestGroup
791         when the test groups changes.
792         (AnalysisTaskTestGroupPane.prototype._renderCurrentTestGroup): Added code to conditionally show bisect button.
793         Bisect button will only show when there is a middle commit set for that test group.
794         (AnalysisTaskTestGroupPane.htmlTemplate):
795         (AnalysisTaskTestGroupPane.cssTemplate):
796         (AnalysisTaskPage.prototype.didConstructShadowTree):
797         (AnalysisTaskPage.prototype._retryCurrentTestGroup):
798         (AnalysisTaskPage.prototype.async._bisectCurrentTestGroup): A callback when bisect button is clicked.
799         * tools/js/v3-models.js:
800         * unit-tests/commit-log-tests.js: Added unit tests for 'CommitLog.hasCommitTime', 'CommitLog.hasCommitOrder',
801         'CommitLog.orderTwoCommits', 'CommitLog.hasOrdering'.
802         * unit-tests/commit-set-range-bisector-tests.js: Unit tests for 'CommitSetRangeBisector.commitSetClosestToMiddleOfAllCommits'.
803         * unit-tests/commit-set-tests.js: Added unit tests for 'CommitSet.hasSameRepositories' and 'CommitSet.containsRootOrPatchOrOwnedCommit'.
804
805 2018-04-16  Dewei Zhu  <dewei_zhu@apple.com>
806
807         Commit order should always be returned by api.
808         https://bugs.webkit.org/show_bug.cgi?id=184674
809
810         Reviewed by Ryosuke Niwa.
811
812         Commit order sometimes missing in CommitLog object before this change.
813         This makes ordering commits logic become unnecessarily complicate.
814         This change will ensure commit order is always fetched for a CommitLog object.
815         Change measurement-set API to contain commit order information.
816         Change commits API to contain commit order information.
817
818         * public/api/measurement-set.php: Includes commit order information.
819         * public/include/commit-log-fetcher.php:
820         * public/v3/models/commit-log.js: Added a function to return order information.
821         (CommitLog.prototype.updateSingleton): This function should update commit order.
822         (CommitLog.prototype.order): Returns the order of commit.
823         * public/v3/models/commit-set.js:
824         (MeasurementCommitSet): Update MeasurementCommitSet to contain commit order information when creating CommitLog object.
825         * server-tests/api-measurement-set-tests.js: Updated unit tests.
826         * unit-tests/analysis-task-tests.js: Update unit tests to contain commit order information in mock data.
827         (measurementCluster):
828         * unit-tests/commit-log-tests.js: Added unit tests for CommitLog.order.
829         * unit-tests/commit-set-tests.js: Added commit order in MeasurementCommitSet.
830         * unit-tests/measurement-adaptor-tests.js: Updated unit tests to contain commit order information in mock data.
831         * unit-tests/measurement-set-tests.js: Updated unit tests to contain commit order information in mock data.
832
833 2018-04-15  Ryosuke Niwa  <rniwa@webkit.org>
834
835         Make it possible to hide some repository groups
836         https://bugs.webkit.org/show_bug.cgi?id=184632
837
838         Reviewed by Saam Barati.
839
840         Added the ability to hide repository groups in the custom analysis task configurator from the admin page.
841         Hidden repositroy groups will continue to function for existing test groups. This is purely an UI change.
842
843         * init-database.sql: Added repositorygroup_hidden as a new column to triggerable_repository_groups.
844         * public/admin/triggerables.php: Added a form field to hide a repository group.
845         * public/include/manifest-generator.php: Include hidden state in the manifest file.
846         * public/v3/components/custom-analysis-task-configurator.js:
847         (CustomAnalysisTaskConfigurator.prototype._renderRepositoryPanes): Filter out hidden repository groups.
848         * public/v3/models/triggerable.js:
849         (prototype.isHidden): Added.
850         * server-tests/api-manifest-tests.js: Updated an existing test case to test a hidden repository group.
851
852 2018-04-06  Dewei Zhu  <dewei_zhu@apple.com>
853
854         Added 'CommitSet.diff' which will be shared between multiple independent incoming changes.
855         https://bugs.webkit.org/show_bug.cgi?id=184368
856
857         Reviewed by Ryosuke Niwa.
858
859         'CommitSet.diff' will be used in multiple independent incoming changes.
860         It would be easier to make this a separate change to parallelize the changes depends on this API.
861
862         * public/v3/models/commit-set.js:
863         (CommitSet.prototype.createNameWithoutCollision): Moved from 'AnalysisTaskPage' and make it more generic.
864         (CommitSet.prototype.diff): Describe differences between 2 commit sets including commit, root and patch differences.
865         * public/v3/pages/analysis-task-page.js: Move 'AnalysisTaskPage._createRetryNameForTestGroup' to CommitSet in a more generic form.
866         (AnalysisTaskPage.prototype._retryCurrentTestGroup): Use 'CommitSet.withoutRootPatchOrOwnedCommit' instead.
867         (AnalysisTaskPage.prototype._createRetryNameForTestGroup): Moved to CommitSet in a more generic form.
868         * unit-tests/commit-set-tests.js: Added unit tests for 'CommitSet.diff'.
869
870 2018-04-05  Dewei Zhu  <dewei_zhu@apple.com>
871
872         Fix a bug introduced in r230295 that A/B test result is not shown.
873         https://bugs.webkit.org/show_bug.cgi?id=184350
874
875         Reviewed by Ryosuke Niwa.
876
877         result.label should be assigned in `TestGroup._computeRequestedCommitSets`.
878
879         * public/v3/models/test-group.js:
880         (TestGroup.prototype._computeRequestedCommitSets):
881
882 2018-03-29  Dewei Zhu  <dewei_zhu@apple.com>
883
884         Added UI to show potential regressions in chart with t-testing against segmentations.
885         https://bugs.webkit.org/show_bug.cgi?id=184131
886
887         Reviewed by Ryosuke Niwa.
888
889         Added UI in the chart-pane so that user can use new option in trendline which not only
890         shows the segmentation, but also t-test against potential changes indicated by segmentation.
891
892         Fix a bug in AnalysisTaskPage that chart is not updated when change type of task changes.
893
894         * browser-tests/interactive-time-series-chart-tests.js: Fix a unit tests.
895         * browser-tests/time-series-chart-tests.js: Fix a unit tests.
896         * public/shared/statistics.js: Added a function to t-test certain range based on segmentation results.
897         (Statistics.supportedOneSideTTestProbabilities):
898         (Statistics.findRangesForChangeDetectionsWithWelchsTTest): The argument `segmentations`, every 2 items in the list defines 
899         segmentation, that is why the index incremental is 2 in this funcion.
900         * public/v3/components/chart-pane-base.js: Will select the range if user clicks on a suggested annotation.
901         (ChartPaneBase.prototype.configure):
902         (ChartPaneBase.prototype._didClickAnnotation):
903         * public/v3/components/chart-styles.js:
904         (ChartStyles.annotationFillStyleForTask): Added 'annotationFillStyleForTask' to determine the fillStyle for annotation based on change type of a analysis task.
905         * public/v3/components/interactive-time-series-chart.js:
906         (InteractiveTimeSeriesChart.prototype._findAnnotation): Also need to search among suggested annotaions.
907         * public/v3/components/time-series-chart.js: Introduced 'suggested annotaion' which does not have an existing task and is suggested by t-test based on segmentation.
908         (TimeSeriesChart):
909         (TimeSeriesChart.prototype.setSuggestedAnnotations):
910         (TimeSeriesChart.prototype.allAnnotations): Returns both annotations with and without analysis task.
911         (TimeSeriesChart.prototype._layoutAnnotationBars): Should take all annotations in the calculation.
912         * public/v3/models/measurement-set.js:
913         (MeasurementSet.prototype.metricId): Returns metric id.
914         * public/v3/models/metric.js:
915         (Metric.prototype.summarizeForValues): Added helper function to summarize a given value
916         * public/v3/models/test-group.js:
917         (TestGroup.prototype.compareTestResults): Adapted to use 'Metric.summarizeForValues'.
918         * public/v3/pages/chart-pane.js: Added 'Segmentation with t-test analysis' to 'ChartTrendLineTypes'.
919         (ChartPane.prototype._renderTrendLinePopover):
920         (ChartPane.prototype.async._updateTrendLine): make it an async function.
921         * unit-tests/statistics-tests.js: Added unit tests for 'findRangesForChangeDetectionsWithWelchsTTest'.
922
923 2018-04-02  Aakash Jain  <aakash_jain@apple.com>
924
925         Remove deprecated Buildbot 0.8 code from Perf syncing scripts
926         https://bugs.webkit.org/show_bug.cgi?id=183915
927
928         Reviewed by Ryosuke Niwa.
929
930         * server-tests/resources/mock-data.js:
931         (MockData.buildbotBuildersURLDeprecated): Deleted.
932         (MockData.mockBuildbotBuildersDeprecated): Deleted.
933         (MockData.pendingBuildDeprecated): Deleted.
934         (MockData.runningBuildDeprecated): Deleted.
935         (MockData.finishedBuildDeprecated): Deleted.
936         * tools/js/buildbot-syncer.js:
937         (BuildbotBuildEntryDeprecated): Deleted.
938         (BuildbotBuildEntryDeprecated.prototype.initialize): Deleted.
939         (BuildbotBuildEntryDeprecated.prototype.url): Deleted.
940         (BuildbotSyncer.prototype.scheduleBuildOnBuildbotDeprecated): Deleted.
941         (BuildbotSyncer.prototype._pullRecentBuildsDeprecated): Deleted.
942         (BuildbotSyncer.prototype.pathForPendingBuildsJSONDeprecated): Deleted.
943         (BuildbotSyncer.prototype.pathForBuildJSONDeprecated): Deleted.
944         (BuildbotSyncer.prototype.pathForForceBuildDeprecated): Deleted.
945         (BuildbotSyncer.prototype.url): Deleted.
946         (BuildbotSyncer.prototype.urlForBuildNumberDeprecated): Deleted.
947         * tools/js/buildbot-triggerable.js:
948         (BuildbotTriggerable.prototype.getBuilderNameToIDMapDeprecated): Deleted.
949         * unit-tests/buildbot-syncer-tests.js:
950         (smallPendingBuildDeprecated): Deleted.
951         (smallInProgressBuildDeprecated): Deleted.
952         (smallFinishedBuildDeprecated): Deleted.
953         (samplePendingBuildRequestDeprecated): Deleted.
954         (sampleInProgressBuildDeprecated): Deleted.
955         (sampleFinishedBuildDeprecated): Deleted.
956
957 2018-03-19  Aakash Jain  <aakash_jain@apple.com>
958
959         Update Perf buildbot syncing scripts for Buildbot 0.9
960         https://bugs.webkit.org/show_bug.cgi?id=175969
961
962         Reviewed by Ryosuke Niwa.
963
964         * tools/js/buildbot-triggerable.js:
965         (BuildbotTriggerable.prototype.initSyncers): Switch from Deprecated version to new version of getBuilderNameToIDMap.
966         * tools/js/buildbot-syncer.js:
967         (BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Switch from Deprecated version to new version of scheduleRequest.
968         (BuildbotSyncer.prototype.pullBuildbot): Switch from Deprecated version to new version of pathForPendingBuilds, _pullRecentBuilds 
969         and BuildbotBuildEntry. Parse the pending build-requests data in Buildbot 0.9 format.
970         * unit-tests/buildbot-syncer-tests.js: Updated as per Buildbot 0.9 code.
971         * server-tests/tools-sync-buildbot-integration-tests.js: Ditto.
972         * server-tests/tools-buildbot-triggerable-tests.js: Ditto.
973         * server-tests/resources/mock-data.js: Ditto.
974         (MockData.pendingBuildsUrl): Method to construct pendingBuildsUrl in Buildbot 0.9 format.
975         (MockData.recentBuildsUrl): Ditto for recent builds url.
976         (MockData.statusUrl): Ditto for status url.
977         (MockData.builderIDForName): Method to get builder ID from builder name.
978
979 2018-03-15  Aakash Jain  <aakash_jain@apple.com>
980
981         BuildbotBuildEntry creates an incorrect url for pending builds
982         https://bugs.webkit.org/show_bug.cgi?id=183670
983
984         Reviewed by Ryosuke Niwa.
985
986         * tools/js/buildbot-syncer.js:
987         (BuildbotBuildEntry.prototype.initialize): Fetch buildrequestid from Buildbot.
988         (BuildbotBuildEntry.prototype.url): Construct url for pending build using buildrequestid from Buildbot.
989         * unit-tests/buildbot-syncer-tests.js: Updated unit-test.
990
991 2018-03-14  Aakash Jain  <aakash_jain@apple.com>
992
993         Add support for boolean properties in BuildbotSyncer while submitting build request to Buildbot 0.9 server
994         https://bugs.webkit.org/show_bug.cgi?id=183638
995
996         Reviewed by Ryosuke Niwa.
997
998         * tools/js/buildbot-syncer.js:
999         (BuildbotSyncer._parseRepositoryGroupPropertyTemplate): Allow boolean properties.
1000         * server-tests/tools-sync-buildbot-integration-tests.js: Tests for boolean properties.
1001         * unit-tests/buildbot-syncer-tests.js: Ditto.
1002
1003 2018-03-04  Dewei Zhu  <dewei_zhu@apple.com>
1004
1005         Create analysis task should use build time as fallback when commit time is not available.
1006         https://bugs.webkit.org/show_bug.cgi?id=183309
1007
1008         Reviewed by Ryosuke Niwa.
1009
1010         Added the ability to schedule analysis task for the range without commit time.
1011
1012         * public/privileged-api/create-analysis-task.php: Use build time as fallback.
1013         * server-tests/privileged-api-create-analysis-task-tests.js: Added a unit test for this change.
1014
1015 2018-03-04  Aakash Jain  <aakash_jain@apple.com>
1016
1017         BuildbotBuildEntry for buildbot 0.9 uses incorrect buildrequestid
1018         https://bugs.webkit.org/show_bug.cgi?id=183194
1019
1020         Reviewed by Ryosuke Niwa.
1021
1022         * tools/js/buildbot-syncer.js:
1023         (BuildbotBuildEntry.prototype.initialize): Updated _buildRequestId to use correct build-request-id, as set in syncer._buildRequestPropertyName.
1024         (BuildbotSyncer.prototype.pathForPendingBuilds): Updated url to fetch properties for build-requests.
1025         * unit-tests/buildbot-syncer-tests.js:
1026         (sampleBuildData): Updated sampleBuildData with correct build-request-id in properties. Added
1027         properties to samplePendingBuildRequestData.
1028
1029 2018-02-28  Aakash Jain  <aakash_jain@apple.com>
1030
1031         Rename samplePendingBuild to samplePendingBuildRequest
1032         https://bugs.webkit.org/show_bug.cgi?id=183171
1033
1034         Reviewed by Ryosuke Niwa.
1035
1036         * unit-tests/buildbot-syncer-tests.js:
1037         (samplePendingBuildRequests): Renamed from samplePendingBuild.
1038         (samplePendingBuildRequestDeprecated): Renamed from samplePendingBuildDeprecated.
1039         (samplePendingBuild): Deleted.
1040         (samplePendingBuildDeprecated): Deleted.
1041
1042 2018-02-02  Aakash Jain  <aakash_jain@apple.com>
1043
1044         Add support for submitting build request to Buildbot 0.9 server in BuildbotSyncer
1045         https://bugs.webkit.org/show_bug.cgi?id=182218
1046
1047         Reviewed by Ryosuke Niwa.
1048
1049         * tools/js/buildbot-syncer.js:
1050         (BuildbotSyncer.prototype.scheduleRequest): Added assert to ensure forcescheduler property is always defined. Builds can not
1051         be scheduled on Buildbot without this property. Updated unit-tests and server-tests accordingly.
1052         (BuildbotSyncer.prototype.scheduleBuildOnBuildbotDeprecated): Method to schedule build request on Buildbot 0.8 server.
1053         (BuildbotSyncer.prototype.scheduleBuildOnBuildbot): Method to schedule build request on Buildbot 0.9 server.
1054         (BuildbotSyncer.prototype.pathForForceBuildDeprecated): Path for scheudling build on Buildbot 0.8 server.
1055         (BuildbotSyncer.prototype.pathForForceBuild): Path for scheudling build on Buildbot 0.9 server.
1056         * unit-tests/buildbot-syncer-tests.js:
1057         (smallConfiguration): Added test-case for scheduleBuildOnBuildbot. Also added forcescheduler property in sample data.
1058         * server-tests/resources/mock-data.js: Added forcescheduler property in sample data.
1059         * server-tests/tools-buildbot-triggerable-tests.js: Updated server-tests to take care of added forcescheduler property.
1060
1061 2018-02-02  Aakash Jain  <aakash_jain@apple.com>
1062
1063         Add support for fetching recent builds in Buildbot 0.9 format in BuildbotSyncer
1064         https://bugs.webkit.org/show_bug.cgi?id=179743
1065
1066         Reviewed by Ryosuke Niwa.
1067
1068         * tools/js/buildbot-syncer.js:
1069         (BuildbotSyncer.prototype._pullRecentBuildsDeprecated): Renamed from _pullRecentBuilds. This method fetch
1070         from Buildbot 0.8 server.
1071         (BuildbotSyncer.prototype._pullRecentBuilds): Method to fetch recent builds from Buildbot 0.9 server.
1072         (BuildbotSyncer.prototype.pathForRecentBuilds): URL for fetching recent builds from Buildbot 0.9 server.
1073         (BuildbotSyncer.prototype.pathForBuildJSONDeprecated): Renamed from pathForBuildJSON.
1074         * unit-tests/buildbot-syncer-tests.js:
1075         (_pullRecentBuilds.it): unit-test - should not fetch recent builds when count is zero.
1076         (_pullRecentBuilds.it): unit-test - should pull the right number of recent builds.
1077         (_pullRecentBuilds.it): unit-test - should handle unexpected error while fetching recent builds.
1078         (_pullRecentBuilds.it): unit-test - should create BuildbotBuildEntry after fetching recent builds.
1079
1080 2018-02-01  Aakash Jain  <aakash_jain@apple.com>
1081
1082         Create BuildbotBuildEntry in Buildbot syncer in Buildbot 0.9 format
1083         https://bugs.webkit.org/show_bug.cgi?id=182036
1084
1085         Reviewed by Ryosuke Niwa.
1086
1087         * tools/js/buildbot-syncer.js:
1088         (BuildbotBuildEntry): Class for Buildbot entry in Buildbot 0.9 data format.
1089         (BuildbotBuildEntryDeprecated): Renamed from BuildbotBuildEntry, sub-classed from BuildBotEntry. Handles Buildbot 0.8 data format.
1090         (BuildbotBuildEntryDeprecated.prototype.url): URL in buildbot 0.8 format.
1091         (BuildbotSyncer.prototype.builderID): Added.
1092         (BuildbotSyncer.prototype.pathForPendingBuildsJSONDeprecated): Renamed from BuildbotSyncer.prototype.pathForPendingBuildsJSON.
1093         (BuildbotSyncer.prototype.pathForPendingBuilds): Path for pending builds in Buildbot 0.9 format.
1094         (BuildbotSyncer.prototype.urlForBuildNumberDeprecated): Deprecated. Renamed from urlForBuildNumber.
1095         (BuildbotSyncer.prototype.urlForBuildNumber): Updated in Buildbot 0.9 format.
1096         (BuildbotSyncer.prototype.urlForPendingBuild): Buildbot 0.9 has individual webpage for pending buildrequests as well. URL to that page.
1097         * unit-tests/buildbot-syncer-tests.js: Renamed BuildbotBuildEntry to BuildbotBuildEntryDeprecated.
1098         (sampleBuildData): Sample build data. Common method for in-progress and finished build data.
1099         (samplePendingBuildData): Sample data for a pending build. Separate method so that we can easily create sample data with multiple builds.
1100         (sampleInProgressBuildData): Ditto for in-progress build.
1101         (sampleFinishedBuildData): Ditto for finished build.
1102         (samplePendingBuild): Sample data for single pending build.
1103         (sampleInProgressBuild): Ditto for in-progress build.
1104         (sampleFinishedBuild): Ditto for finished build.
1105         (samplePendingBuildDeprecated): Renamed from samplePendingBuild.
1106         (sampleInProgressBuildDeprecated): Renamed from sampleInProgressBuild.
1107         (sampleFinishedBuildDeprecated): Renamed from sampleFinishedBuild.
1108         (BuildbotBuildEntry.it: Added unit-test for creating BuildbotBuildEntry for pending build.
1109         (BuildbotBuildEntry.it: Added unit-test for creating BuildbotBuildEntry for in-progress build.
1110         (BuildbotBuildEntry.it: Added unit-test for creating BuildbotBuildEntry for finished build.
1111         (BuildbotBuildEntry.it: Added unit-test for creating BuildbotBuildEntry for mix of in-progress and finished build.
1112
1113 2018-01-31  Dewei Zhu  <dewei_zhu@apple.com>
1114
1115         Should chose the best match during 'route' if there are multiple matches.
1116         https://bugs.webkit.org/show_bug.cgi?id=182326
1117
1118         Reviewed by Ryosuke Niwa.
1119
1120         r227749 made a change that 'analysisCategoryPage' will be added before 'analysisTaskPage'.
1121         As route names for both pages starts with 'analysis', whichever added first will be chosen.
1122         For a route like 'analysis/task/1'. As a result, 'analysisCategoryPage' will be chosen and
1123         this is not expected behavior. Adding the logic on the cases when route name does not extact
1124         match the route name, always choose the longest mathcing route name.
1125
1126         Also modernized the code of 'page-router.js' to use const & let instead of var.
1127
1128         Added a browser test to guard against this bug.
1129
1130         * browser-tests/index.html: Import 'page-router-tests.js'.
1131         * browser-tests/page-router-tests.js: Added unit test to guard against this bug.
1132         * public/v3/pages/page-router.js:
1133         (PageRouter.prototype.route): Added logic to find best matching in the case of inexact match.
1134         (PageRouter.prototype.pageDidOpen):
1135         (PageRouter.prototype._updateURLState):
1136         (PageRouter.prototype._serializeToHash):
1137         (PageRouter.prototype._deserializeFromHash):
1138         (PageRouter.prototype._serializeHashQueryValue):
1139         (PageRouter.prototype._deserializeHashQueryValue):
1140         (PageRouter.prototype._countOccurrences):
1141         (PageRouter):
1142
1143 2018-01-29  Dewei Zhu  <dewei_zhu@apple.com>
1144
1145         Should fetch owner commits in build-requests-fetcher.
1146         https://bugs.webkit.org/show_bug.cgi?id=182266
1147
1148         Reviewed by Ryosuke Niwa.
1149
1150         In a build request, owner commit of a commit is not always one of a commit in the commit set.
1151         Build request api should contain owner commits in the 'commits' field of the return value.
1152
1153         * public/include/build-requests-fetcher.php: Added logic to fetch owner commits and added them into 'commits'.
1154         * server-tests/api-build-requests-tests.js: Added a unit test.
1155         * server-tests/resources/mock-data.js:
1156         (MockData.set addTestGroupWithOwnerCommitNotInCommitSet): Added a test group with a build request, the commit set of which does
1157         not contain owner commit of one commit.
1158
1159 2018-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1160
1161         Add the support for reporting Speedometer 2.0 results to perf dashboard
1162         https://bugs.webkit.org/show_bug.cgi?id=182089
1163         <rdar://problem/36172346>
1164
1165         Rubber-stamped by Chris Dumez.
1166
1167         Apparently, this has always worked since the very first version of the perf dashboard added in r163688.
1168         The relevant code is at the line 313 of report-processor.php now.
1169
1170         Added regression tests for this feature since we didn't have any tests four years ago.
1171
1172         * server-tests/api-report-tests.js:
1173
1174 2018-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1175
1176         REGRESSION(r225898): The perf dashboard fails to open when there are no summary pages
1177         https://bugs.webkit.org/show_bug.cgi?id=182210
1178
1179         Rubber-stamped by Chris Dumez.
1180
1181         The bug was caused by TestFreshnessPage unconditionally assuming that summaryPageConfiguration is set.
1182         Fixed it by not creating TestFreshnessPage when there are no summary pages specified.
1183
1184         Also modernized the code to use const & let instead of var.
1185
1186         * public/v3/main.js:
1187         (main):
1188
1189 2018-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1190
1191         Perf dashboard's page title can be set to a previously visited page
1192         https://bugs.webkit.org/show_bug.cgi?id=182209
1193
1194         Rubber-stamped by Chris Dumez.
1195
1196         Before this patch, opening a page and navigating away from it could result in the page title
1197         getting set to that of the previously visited page after the new page had been opened.
1198
1199         This bug was caused by Page.render keep setting document.title even though the page is no longer
1200         the currently open page of the router. Fixed it by exiting early in Page.enqueueToRender when
1201         this page is not the currently open page of the router.
1202
1203         Also added basic tests for Page.
1204
1205         * browser-tests/index.html:
1206         * browser-tests/page-tests.js: Added.
1207         * public/v3/pages/page.js:
1208         (Page): Removed the unused second constructor argument.
1209         (Page.prototype.enqueueToRender): Fixed the bug.
1210         (Page.prototype.render): Use const instead of var.
1211
1212 2018-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1213
1214         CommitLogViewer should not fetch commits in serial
1215         https://bugs.webkit.org/show_bug.cgi?id=182207
1216
1217         Rubber-stamped by Chris Dumez.
1218
1219         Fetch both the commits in the range as well as the preceding commit at once instead of
1220         fetching the preceding commit only after the commits in the range had been fetched.
1221
1222         * browser-tests/commit-log-viewer-tests.js: Fixed the tcoest case after r224227.
1223         * public/v3/components/commit-log-viewer.js:
1224         (CommitLogViewer.prototype._fetchCommitLogs): Fetch commits in parallel.
1225
1226 2018-01-24  Dewei Zhu  <dewei_zhu@apple.com>
1227
1228         Check existence of 'node_modules_dir' before creating it.
1229         https://bugs.webkit.org/show_bug.cgi?id=182040
1230
1231         Reviewed by Aakash Jain.
1232
1233         Fix the bug introduced in r227395.
1234
1235         * tools/run-tests.py: Added directory existence check.
1236
1237 2018-01-22  Dewei Zhu  <dewei_zhu@apple.com>
1238
1239         Fix the bug that 'TestGroupResultsViewer' creates unnecessary rows.
1240         https://bugs.webkit.org/show_bug.cgi?id=181967
1241
1242         Reviewed by Ryosuke Niwa.
1243
1244         Fixed a bug caused by a typo in CommitSet.equals, which makes it returns incorrect results for most
1245         comparison between a CommitSet and a MeasurementCommitSet.
1246
1247         MeasurementCommitSet does not have full information for the commits, thus, it cannot build mappings
1248         between root/patch/owner commit/requires build to repository. When querying whether a given repository
1249         needs to be built, MeasurementCommitSet will return undefined. Due to 'undefined != false', this
1250         equality check will fail. Making 'CommitSet.requiresBuildForRepository' defaults to 'false' would fix
1251         this bug.
1252
1253         * public/v3/models/commit-set.js:
1254         (CommitSet.prototype.requiresBuildForRepository): Make it return false when key does not exist
1255         instead of 'undefined'.
1256         (CommitSet.prototype.equals): Fixed the typo that causes the bug.
1257         Use wrapped functions instead of querying the mapping directly.
1258         * unit-tests/commit-set-tests.js: Added unit tests.
1259
1260 2018-01-18  Dewei Zhu  <dewei_zhu@apple.com>
1261
1262         'run-test.py' script should make sure 'node_modules' directory exists before installing node packages.
1263         https://bugs.webkit.org/show_bug.cgi?id=181808
1264
1265         Reviewed by Ryosuke Niwa.
1266
1267         'run-test.py' will fail if 'node_modules' does not exist before running this script.
1268         Instead of calling 'os.chdir' to change directory, use 'cwd' in subprocess instead.
1269
1270         * tools/run-tests.py: Added the logic to ensure 'node_modules' exists.
1271         Also use 'cwd' in subprocess.call instead of calling 'os.chdir' ahead.
1272
1273 2018-01-20  Dewei Zhu  <dewei_zhu@apple.com>
1274
1275         Extend 'ifBuilt' config key to set property based on whether certain repositories are built or not.
1276         https://bugs.webkit.org/show_bug.cgi?id=181906
1277
1278         Reviewed by Ryosuke Niwa.
1279
1280         Before this change, 'ifBuilt' will always set specified property for test properties as long as there
1281         is a build type build in the same build request group. However, this is no longer valid as we don't
1282         want to set specified property for testing when only owned commit is built in previous build.
1283         'ifBuilt' needs to conditionally set property based on whether certain required repositories are built.
1284         Empty required repository list means no requirement on repository to set property.
1285
1286         * tools/js/buildbot-syncer.js:
1287         (BuildbotSyncer.prototype._propertiesForBuildRequest):In the case of 'built', only set property when
1288         repository requirment is meet and there is a 'build' root request in the same build request group.
1289         (BuildbotSyncer._parseRepositoryGroup): Extend 'ifBuild' to pass information based on contition.
1290         * unit-tests/buildbot-syncer-tests.js: Added unit tests.
1291
1292 2018-01-19  Dewei Zhu  <dewei_zhu@apple.com>
1293
1294         Should reject updating a build request which has an associated build.
1295         https://bugs.webkit.org/show_bug.cgi?id=181893
1296
1297         Reviewed by Ryosuke Niwa.
1298
1299         Current code does not prevent submitting to same build request multiple times.
1300         This could lead to a build losing its associated build request.
1301         As a result, this build will be visible in charts which is not right.
1302         Added a check when a build request is reported.
1303         Addressed a 'FIXME' for the race condition inside ReportProcessor->resolve_build_id by surrounding
1304         it with a database transaction.
1305
1306         * public/include/report-processor.php:
1307         Wrap adding platform and resolve_build_id with a database transaction.
1308         Add a check to make sure only a build request has no associated build can be updated.
1309         * server-tests/api-report-tests.js: Added unit tests accordingly.
1310
1311 2018-01-18  Dewei Zhu  <dewei_zhu@apple.com>
1312
1313         Should allow updating a build-request to 'canceled'.
1314         https://bugs.webkit.org/show_bug.cgi?id=181819
1315
1316         Reviewed by Ryosuke Niwa.
1317
1318         It's possible syncing script update a build-request to 'canceled' state.
1319
1320         * public/api/build-requests.php: Added 'canceled' as an acceptable update state.
1321         * server-tests/api-build-requests-tests.js: Added a unit test to update a build-request to 'canceled'.
1322
1323 2018-01-18  Aakash Jain  <aakash_jain@apple.com>
1324
1325         Add support for builderNameToIDMap in BuildbotSyncer
1326         https://bugs.webkit.org/show_bug.cgi?id=176526
1327
1328         Reviewed by Ryosuke Niwa.
1329
1330         * tools/js/buildbot-syncer.js:
1331         (BuildbotSyncer._loadConfig): Added builderNameToIDMap parameter. It would be used later on.
1332         (BuildbotSyncer._resolveBuildersWithPlatforms): Ditto.
1333         (BuildbotSyncer._validateAndMergeConfig): Added builderID as a valid config parameter.
1334         * tools/js/buildbot-triggerable.js:
1335         (BuildbotTriggerable.prototype.getBuilderNameToIDMap): Method to fetch BuilderNameToIDMap from Buildbot 0.9.
1336         (BuildbotTriggerable.prototype.getBuilderNameToIDMapDeprecated): Method to fetch BuilderNameToIDMap from Buildbot 0.8.
1337         (BuildbotTriggerable.prototype.initSyncers): Updated to use getBuilderNameToIDMap.
1338         * unit-tests/buildbot-syncer-tests.js: Updated unit-tests.
1339         * server-tests/resources/mock-data.js:
1340         (MockData.buildbotBuildersURLDeprecated): URL for fetching Builders list.
1341         (MockData.buildbotBuildersURL): Ditto for Buildbot 0.9
1342         (MockData.mockBuildbotBuildersDeprecated): Sample builders data for Buildbot 0.8
1343         (MockData.mockBuildbotBuilders): Ditto for Buildbot 0.9
1344         * server-tests/tools-buildbot-triggerable-tests.js: Added test for getBuilderNameToIDMap. Updated tests to handle
1345         newly added promise for fetching builders list from Buildbot.
1346         * server-tests/tools-sync-buildbot-integration-tests.js: Ditto.
1347
1348 2018-01-18  Ryosuke Niwa  <rniwa@webkit.org>
1349
1350         Charts can be empty when values are all identical
1351         https://bugs.webkit.org/show_bug.cgi?id=181828
1352
1353         Reviewed by Alexey Proskuryakov.
1354
1355         Fixed the bug that when SampleVarianceUpperTriangularMatrix can store -Infinity as the initial cost
1356         of some entries when the sample standard deviation between two points turns out to be 0,
1357         and cause splitIntoSegmentsUntilGoodEnough to return undefiend because no segmentation has a finite cost.
1358
1359         Also fixed the bug that the time series chart fails to show any data points when all data points have
1360         identical values as the entire y-coordinate gets collapsed to an empty value range by adjusting the max value
1361         when min & max values are identical.
1362
1363         * public/v3/components/time-series-chart.js:
1364         (TimeSeriesChart.prototype._ensureValueRangeCache): Raise the max slightly when min & max are identical
1365         to avoid the chart becoming empty. Otherwise valueDiff in _computeVerticalRenderingMetrics becomes 0
1366         and value-to-y-coordinate conversion always results in NaN.
1367         * public/shared/statistics.js:
1368         (Statistics..SampleVarianceUpperTriangularMatrix):
1369         * unit-tests/statistics-tests.js: Added a test case.
1370
1371 2018-01-18  Ryosuke Niwa  <rniwa@webkit.org>
1372
1373         Don't fetch more than two builds to check duplicity of builds in ReportProcessor
1374         https://bugs.webkit.org/show_bug.cgi?id=181786
1375
1376         Reviewed by Wenson Hsieh.
1377
1378         Limit the number of builds to check to avoid using a lot of memory with a long delay.
1379
1380         * public/include/report-processor.php:
1381         (ReportProcessor::resolve_build_id): 
1382
1383 2018-01-17  Ryosuke Niwa  <rniwa@webkit.org>
1384
1385         Rename config.json to config.json.sample
1386         https://bugs.webkit.org/show_bug.cgi?id=181785
1387
1388         Reviewed by Wenson Hsieh.
1389
1390         * .gitignore: Added config.json.
1391         * ReadMe.md: Updated the instruction.
1392         * config.json.sample: Renamed from config.json.
1393
1394 2018-01-17  Ryosuke Niwa  <rniwa@webkit.org>
1395
1396         Unreviewed build fixes in TestGroupResultsViewer.
1397
1398         * public/v3/components/test-group-results-viewer.js:
1399         (TestGroupResultsViewer.prototype.render): _renderCurrentMetricsLazily was never called.
1400         (TestGroupResultsViewer.prototype._buildRowForMetric): Don't try to render null or NaN.
1401
1402 2018-01-17  Ryosuke Niwa  <rniwa@webkit.org>
1403
1404         Fix perf dashboard tests for node v8
1405         https://bugs.webkit.org/show_bug.cgi?id=181782
1406
1407         Reviewed by Wenson Hsieh.
1408
1409         Fixed the various tests for node.js v8, which is the latest LTS version.
1410
1411         * server-tests/api-manifest-tests.js: Replaced the missing Triggerable.acceptsTest by Triggerable.acceptedTests
1412         after r226836.
1413         * server-tests/api-measurement-set-tests.js: Added "Z" to the end timestamps to force UTF timezone now that Date
1414         in node.js parses using the local timezone by default.
1415         * server-tests/resources/test-server.js:
1416         (TestServer.prototype._restoreDataDirectory): Fixed the bug that this function was erroneously using the async
1417         function to rename a directory per new warnings. This code was racy, and it used to cause a test error occasionally.
1418         * server-tests/tools-os-build-fetcher-tests.js: Fixed the assertions to make it work in the latest node.js.
1419         * unit-tests/measurement-set-tests.js:
1420         (waitForMeasurementSet): Wait for setTimeout to cycle through all microtasks instead of just two microtask cycles.
1421
1422 2018-01-11  Ryosuke Niwa  <rniwa@webkit.org>
1423
1424         Cannot trigger Dromaeo tests on internal perf try bots
1425         https://bugs.webkit.org/show_bug.cgi?id=179712
1426
1427         Reviewed by Chris Dumez.
1428
1429         The bug was caused by CustomAnalysisTaskConfigurator only showing the top-level tests that are triggerable
1430         instead of the list of highest level tests that are triggerable.
1431
1432         * public/v3/components/custom-analysis-task-configurator.js:
1433         (CustomAnalysisTaskConfigurator.prototype.selectTests): Update the test group name when a new test is picked.
1434         (CustomAnalysisTaskConfigurator.prototype.selectPlatform):
1435         (CustomAnalysisTaskConfigurator.prototype._didUpdateSelectedPlatforms): Extracted from selectPlatform.
1436         (CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Include the list of all highest-level tests
1437         which are triggerable.
1438         (CustomAnalysisTaskConfigurator.prototype._renderRadioButtonList): Added labelForObject which returns the label
1439         to be used in the list items. For tests, we want to use the full name, not just its label.
1440         * public/v3/models/analysis-task.js:
1441         (AnalysisTask.fetchById):
1442         * public/v3/models/triggerable.js:
1443         (Triggerable.prototype.acceptedTests): Added.
1444         (Triggerable.prototype.acceptsTest): Deleted.
1445
1446 == Rolled over to ChangeLog-2018-01-01 ==