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