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