Changeset 203709 in webkit
- Timestamp:
- Jul 25, 2016 7:45:13 PM (8 years ago)
- Location:
- trunk/Websites/perf.webkit.org
- Files:
-
- 2 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Websites/perf.webkit.org/ChangeLog
r203633 r203709 1 2016-07-23 Ryosuke Niwa <rniwa@webkit.org> 2 3 Perf dashboard should show the list of a pending A/B testing jobs 4 https://bugs.webkit.org/show_bug.cgi?id=160138 5 6 Rubber-stamped by Chris Dumez. 7 8 Add a page to show the list of A/B testing build requests per triggerable. Ideally, we would like to 9 see a queue per builder but that would require changes to database tables and syncing scripts. 10 11 Because this page is most useful when the analysis task with which each build request is associated, 12 JSON API at /api/build-requests/ has been modified to return the analysis task ID for each request. 13 14 Also streamlined the page that shows the list of analysis tasks per Chris' feedback by consolidating 15 "Bisecting" and "Identified" into "Investigated" and moving the toolbar from the upper left corner 16 inside the heading to right beneath the heading above the table. Also made the category page serialize 17 the filter an user had typed in so that reloading the page doesn't clear it. 18 19 * public/api/analysis-tasks.php: 20 (fetch_associated_data_for_tasks): Removed 'category' from the list of columns returned as the notion 21 of 'category' is only relevant in UI, and it's better computed in the front-end. 22 (format_task): Ditto. 23 (determine_category): Deleted. 24 25 * public/api/test-groups.php: 26 (main): 27 28 * public/include/build-requests-fetcher.php: 29 (BuildRequestsFetcher::fetch_for_task): Include the analysis task ID in the rows. 30 (BuildRequestsFetcher::fetch_for_group): Ditto. Ditto. 31 (BuildRequestsFetcher::fetch_incomplete_requests_for_triggerable): Ditto. 32 (BuildRequestsFetcher::results_internal): Ditto. 33 34 * public/v3/index.html: 35 36 * public/v3/main.js: 37 (main): Create a newly introduced BuildRequestQueuePage as a subpage of AnalysisCategoryPage. 38 39 * public/v3/components/ratio-bar-graph.js: 40 (RatioBarGraph.prototype.update): Fixed a bogus assertion here. ratio can be any number. The coercion 41 into [-1, 1] is done inside RatioBarGraph's render() function. 42 43 * public/v3/models/analysis-task.js: 44 (AnalysisTask.prototype.category): Moved the code to compute the analysis task's category from 45 determine_category in analysis-tasks.php. Also merged "bisecting" and "identified" into "investigated". 46 (AnalysisTask.categories): Merged "bisecting" and "identified" into "investigated". 47 48 * public/v3/models/build-request.js: 49 (BuildRequest): Remember the triggerable and the analysis task associated with this request as well as 50 the time at when this request was created. 51 (BuildRequest.prototype.analysisTaskId): Added. 52 (BuildRequest.prototype.statusLabel): Use a shorter label: "Waiting" for "pending" status. 53 (BuildRequest.prototype.createdAt): Added. 54 (BuildRequest.prototype.waitingTime): Added. Returns a human readable time duration since the creation 55 of this build request such as "2 hours 21 minutes" against a reference time. 56 (BuildRequest.fetchTriggerables): Added. 57 (BuildRequest.cachedRequestsForTriggerableID): Added. Used when navigating back to 58 59 * public/v3/pages/analysis-category-page.js: 60 (AnalysisCategoryPage): Construct AnalysisCategoryToolbar and store it in this._categoryToolbar since it 61 no longer inherits from Toolbar class, which PageWithHeading recognizes and stores. 62 (AnalysisCategoryPage.prototype.title): 63 (AnalysisCategoryPage.prototype.serializeState): Added. 64 (AnalysisCategoryPage.prototype.stateForCategory): Added. Include the filter in the serialization. 65 (AnalysisCategoryPage.prototype.updateFromSerializedState): Restore the filter from the URL state. 66 (AnalysisCategoryPage.prototype.filterDidChange): Added. Called by AnalysisCategoryToolbar to update 67 the URL state in addition to calling render() as done previously via setFilterCallback. 68 (AnalysisCategoryPage.prototype.render): Always call _categoryToolbar.render() since the hyperlinks for 69 the category pages now include the filter, which can be updated in each call. 70 (AnalysisCategoryPage.cssTemplate): 71 72 * public/v3/pages/analysis-category-toolbar.js: 73 (AnalysisCategoryToolbar): Inherits from ComponentBase instead of Toolbar since AnalysisCategoryToolbar 74 no longer works with Heading class unlike other subclasses of Toolbar class. 75 (AnalysisCategoryToolbar.prototype.setCategoryPage): Added. 76 (AnalysisCategoryToolbar.prototype.setFilterCallback): Deleted. 77 (AnalysisCategoryToolbar.prototype.setFilter): Added. Used to restore from a serialized URL state. 78 (AnalysisCategoryToolbar.prototype.render): Don't recreate the input element as it clears the value as 79 well as the selection of the element. Also use AnalysisCategoryPage's stateForCategory to serialize the 80 category name and the current filter for each hyperlink. 81 (AnalysisCategoryToolbar.prototype._filterMayHaveChanged): Now takes an boolean argument specifying 82 whether the URL state should be updated or not. We update the URL only when a change event is fired to 83 avoid constantly updating it while an user is still typing. 84 (AnalysisCategoryToolbar.cssTemplate): Added. 85 (AnalysisCategoryToolbar.htmlTemplate): Added a button to open the newly added queue page. 86 87 * public/v3/pages/build-request-queue-page.js: 88 (BuildRequestQueuePage): Added. 89 (BuildRequestQueuePage.prototype.routeName): Added. 90 (BuildRequestQueuePage.prototype.pageTitle): Added. 91 (BuildRequestQueuePage.prototype.open): Added. Fetch open build requests for every triggerables using 92 the same API as the syncing scripts. 93 (BuildRequestQueuePage.prototype.render): Added. 94 (BuildRequestQueuePage.prototype._constructBuildRequestTable): Added. Construct a table for the list of 95 pending, scheduled or running build requests in the order syncing scripts would see. Note that the list 96 of build requests returned by /api/build-requests/* can contain completed, canceled, or failed requests 97 since the JSON returns all build requests associated with each test group if one of the requests of the 98 group have not finished. This helps syncing scripts picking the right builder for A/B testing when it 99 had previously been unloaded or crashed in the middle of processing a test group. This characteristics 100 of the API actually helps us here because we can reliably compute the total number of build requests in 101 the group. The first half of this function does this counting as well as collapses all but the first 102 unfinished build requests into a "contraction" row, which just shows the number of build requests that 103 are remaining in the group. 104 (BuildRequestQueuePage.cssTemplate): Added. 105 (BuildRequestQueuePage.htmlTemplate): Added. 106 107 * public/v3/pages/summary-page.js: 108 (SummaryPage.prototype.open): Use one-day median instead of seven-day median to compute the status. 109 (SummaryPageConfigurationGroup): Initialize _ratio to NaN. This was causing assertion failures in 110 RatioBarGraph's update() while measurement sets are being fetched. 111 112 * server-tests/api-build-requests-tests.js: Updated the tests per change in BuildRequest's statusLabel. 113 * unit-tests/analysis-task-tests.js: Ditto. 114 * unit-tests/test-groups-tests.js: Ditto. 115 * unit-tests/build-request-tests.js: Added tests for BuildRequest's waitingTime. 116 1 117 2016-07-22 Ryosuke Niwa <rniwa@webkit.org> 2 118 -
trunk/Websites/perf.webkit.org/public/api/analysis-tasks.php
r198351 r203709 84 84 $task['buildRequestCount'] = $build_count['total']; 85 85 $task['finishedBuildRequestCount'] = $build_count['finished']; 86 $task['category'] = determine_category($task);87 86 } 88 87 … … 104 103 'endRun' => $task_row['task_end_run'], 105 104 'endRunTime' => Database::to_js_time($task_row['task_end_run_time']), 106 'category' => null,107 105 'result' => $task_row['task_result'], 108 106 'needed' => $task_row['task_needed'] ? Database::is_true($task_row['task_needed']) : null, … … 113 111 } 114 112 115 function determine_category($task) {116 $category = 'unconfirmed';117 118 $result = $task['result'];119 if ($result == 'unchanged' || $result == 'inconclusive' || $task['fixes'] || ($result == 'progression' && $task['causes']))120 $category = 'closed';121 else if ($task['causes'])122 $category = 'identified';123 else if ($result)124 $category = 'bisecting';125 126 return $category;127 }128 129 113 main(array_key_exists('PATH_INFO', $_SERVER) ? explode('/', trim($_SERVER['PATH_INFO'], '/')) : array()); 130 114 -
trunk/Websites/perf.webkit.org/public/api/test-groups.php
r196794 r203709 20 20 exit_with_error('GroupNotFound', array('id' => $group_id)); 21 21 $test_groups = array($group); 22 $build_requests_fetcher->fetch_for_group($group _id);22 $build_requests_fetcher->fetch_for_group($group['testgroup_task'], $group_id); 23 23 } else { 24 24 $task_id = array_get($_GET, 'task'); -
trunk/Websites/perf.webkit.org/public/include/build-requests-fetcher.php
r199210 r203709 14 14 15 15 function fetch_for_task($task_id) { 16 $this->rows = $this->db->query_and_fetch_all('SELECT * 16 $this->rows = $this->db->query_and_fetch_all('SELECT *, testgroup_task as task_id 17 17 FROM build_requests LEFT OUTER JOIN builds ON request_build = build_id, analysis_test_groups 18 18 WHERE request_group = testgroup_id AND testgroup_task = $1 … … 20 20 } 21 21 22 function fetch_for_group($t est_group_id) {22 function fetch_for_group($task_id, $test_group_id) { 23 23 $this->rows = $this->db->query_and_fetch_all('SELECT * 24 24 FROM build_requests LEFT OUTER JOIN builds ON request_build = build_id 25 25 WHERE request_group = $1 ORDER BY request_order', array($test_group_id)); 26 foreach ($this->rows as &$row) 27 $row['task_id'] = $task_id; 26 28 } 27 29 28 30 function fetch_incomplete_requests_for_triggerable($triggerable_id) { 29 $this->rows = $this->db->query_and_fetch_all('SELECT * FROM build_requests,30 (SELECT testgroup_id, (case when testgroup_author is not null then 0 else 1 end) as author_order, testgroup_created_at31 $this->rows = $this->db->query_and_fetch_all('SELECT *, test_groups.testgroup_task as task_id FROM build_requests, 32 (SELECT testgroup_id, testgroup_task, (case when testgroup_author is not null then 0 else 1 end) as author_order, testgroup_created_at 31 33 FROM analysis_test_groups WHERE EXISTS 32 34 (SELECT 1 FROM build_requests WHERE testgroup_id = request_group AND request_status … … 65 67 array_push($requests, array( 66 68 'id' => $row['request_id'], 69 'task' => $row['task_id'], 67 70 'triggerable' => $row['request_triggerable'], 68 71 'test' => $resolve_ids ? $test_path_resolver->path_for_test($test_id) : $test_id, -
trunk/Websites/perf.webkit.org/public/v3/components/ratio-bar-graph.js
r200449 r203709 12 12 update(ratio, label, showWarningIcon) 13 13 { 14 console.assert( isNaN(ratio) || (ratio >= -1 && ratio <= 1));14 console.assert(typeof(ratio) == 'number'); 15 15 this._ratio = ratio; 16 16 this._label = label; -
trunk/Websites/perf.webkit.org/public/v3/index.html
r202001 r203709 102 102 <script src="pages/analysis-task-page.js"></script> 103 103 <script src="pages/create-analysis-task-page.js"></script> 104 <script src="pages/build-request-queue-page.js"></script> 104 105 <script src="pages/summary-page.js"></script> 105 106 -
trunk/Websites/perf.webkit.org/public/v3/main.js
r200449 r203709 31 31 analysisTaskPage.setParentPage(analysisCategoryPage); 32 32 33 var buildRequestQueuePage = new BuildRequestQueuePage(); 34 buildRequestQueuePage.setParentPage(analysisCategoryPage); 35 33 36 var heading = new Heading(manifest.siteTitle); 34 37 heading.addPageGroup([summaryPage, chartsPage, analysisCategoryPage].filter(function (page) { return page; })); … … 43 46 router.addPage(createAnalysisTaskPage); 44 47 router.addPage(analysisTaskPage); 48 router.addPage(buildRequestQueuePage); 45 49 router.addPage(analysisCategoryPage); 46 50 for (var page of dashboardPages) -
trunk/Websites/perf.webkit.org/public/v3/models/analysis-task.js
r201564 r203709 72 72 platform() { return this._platform; } 73 73 metric() { return this._metric; } 74 category() { return this._category; } 74 75 75 changeType() { return this._changeType; } 76 76 … … 147 147 } 148 148 149 category() 150 { 151 var category = 'unconfirmed'; 152 153 if (this._changeType == 'unchanged' || this._changeType == 'inconclusive' 154 || (this._changeType == 'regression' && this._fixes.length) 155 || (this._changeType == 'progression' && (this._causes.length || this._fixes.length))) 156 category = 'closed'; 157 else if (this._causes.length || this._fixes.length || this._changeType == 'regression' || this._changeType == 'progression') 158 category = 'investigated'; 159 160 return category; 161 } 162 149 163 static categories() 150 164 { 151 165 return [ 152 166 'unconfirmed', 153 'bisecting', 154 'identified', 167 'investigated', 155 168 'closed' 156 169 ]; -
trunk/Websites/perf.webkit.org/public/v3/models/build-request.js
r199332 r203709 6 6 { 7 7 super(id, object); 8 this._triggerable = object.triggerable; 9 this._analysisTaskId = object.task; 8 10 this._testGroupId = object.testGroupId; 9 11 console.assert(!object.testGroup || object.testGroup instanceof TestGroup); … … 21 23 this._statusUrl = object.url; 22 24 this._buildId = object.build; 25 this._createdAt = new Date(object.createdAt); 23 26 this._result = null; 24 27 } … … 34 37 } 35 38 39 analysisTaskId() { return this._analysisTaskId; } 36 40 testGroupId() { return this._testGroupId; } 37 41 testGroup() { return this._testGroup; } … … 50 54 switch (this._status) { 51 55 case 'pending': 52 return 'Waiting to be scheduled';56 return 'Waiting'; 53 57 case 'scheduled': 54 58 return 'Scheduled'; … … 66 70 67 71 buildId() { return this._buildId; } 72 createdAt() { return this._createdAt; } 73 74 waitingTime(referenceTime) 75 { 76 const units = [ 77 {unit: 'week', length: 7 * 24 * 3600}, 78 {unit: 'day', length: 24 * 3600}, 79 {unit: 'hour', length: 3600}, 80 {unit: 'minute', length: 60}, 81 ]; 82 83 var diff = (referenceTime - this.createdAt()) / 1000; 84 85 var indexOfFirstSmallEnoughUnit = units.length - 1; 86 for (var i = 0; i < units.length; i++) { 87 if (diff > 1.5 * units[i].length) { 88 indexOfFirstSmallEnoughUnit = i; 89 break; 90 } 91 } 92 93 var label = ''; 94 var lastUnit = false; 95 for (var i = indexOfFirstSmallEnoughUnit; !lastUnit; i++) { 96 lastUnit = i == indexOfFirstSmallEnoughUnit + 1 || i == units.length - 1; 97 var length = units[i].length; 98 var valueForUnit = lastUnit ? Math.round(diff / length) : Math.floor(diff / length); 99 100 var unit = units[i].unit + (valueForUnit == 1 ? '' : 's'); 101 if (label) 102 label += ' '; 103 label += `${valueForUnit} ${unit}`; 104 105 diff = diff - valueForUnit * length; 106 } 107 108 return label; 109 } 68 110 69 111 result() { return this._result; } … … 72 114 this._result = result; 73 115 this._testGroup.didSetResult(this); 116 } 117 118 static fetchTriggerables() 119 { 120 return this.cachedFetch('/api/triggerables/').then(function (response) { 121 return response.triggerables.map(function (entry) { return {id: entry.id, name: entry.name}; }); 122 }); 123 } 124 125 // FIXME: Create a real model object for triggerables. 126 static cachedRequestsForTriggerableID(id) 127 { 128 return this.all().filter(function (request) { 129 return request._triggerable == id; 130 }); 74 131 } 75 132 -
trunk/Websites/perf.webkit.org/public/v3/pages/analysis-category-page.js
r201607 r203709 3 3 constructor() 4 4 { 5 super('Analysis', new AnalysisCategoryToolbar); 6 this.toolbar().setFilterCallback(this.render.bind(this)); 5 super('Analysis'); 6 this._categoryToolbar = this.content().querySelector('analysis-category-toolbar').component(); 7 this._categoryToolbar.setCategoryPage(this); 7 8 this._renderedList = false; 8 9 this._renderedFilter = false; … … 13 14 title() 14 15 { 15 var category = this. toolbar().currentCategory();16 var category = this._categoryToolbar.currentCategory(); 16 17 return (category ? category.charAt(0).toUpperCase() + category.slice(1) + ' ' : '') + 'Analysis Tasks'; 17 18 } … … 31 32 } 32 33 34 serializeState() 35 { 36 return this.stateForCategory(this._categoryToolbar.currentCategory()); 37 } 38 39 stateForCategory(category) 40 { 41 var state = {category: category}; 42 var filter = this._categoryToolbar.filter(); 43 if (filter) 44 state.filter = filter; 45 return state; 46 } 47 33 48 updateFromSerializedState(state, isOpen) 34 49 { 35 50 if (state.category instanceof Set) 36 51 state.category = Array.from(state.category.values())[0]; 37 38 if (this.toolbar().setCategoryIfValid(state.category)) 52 if (state.filter instanceof Set) 53 state.filter = Array.from(state.filter.values())[0]; 54 55 if (this._categoryToolbar.setCategoryIfValid(state.category)) 39 56 this._renderedList = false; 57 58 if (state.filter) 59 this._categoryToolbar.setFilter(state.filter); 40 60 41 61 if (!isOpen) … … 43 63 } 44 64 65 filterDidChange(shouldUpdateState) 66 { 67 this.render(); 68 if (shouldUpdateState) 69 this.scheduleUrlStateUpdate(); 70 } 71 45 72 render() 46 73 { 47 74 Instrumentation.startMeasuringTime('AnalysisCategoryPage', 'render'); 48 75 49 if (!this._renderedList) { 50 super.render(); 51 this.toolbar().render(); 52 } 76 super.render(); 77 this._categoryToolbar.render(); 53 78 54 79 if (this._errorMessage) { … … 70 95 } 71 96 72 var filter = this. toolbar().filter();97 var filter = this._categoryToolbar.filter(); 73 98 if (filter || this._renderedFilter) { 74 99 Instrumentation.startMeasuringTime('AnalysisCategoryPage', 'filterByKeywords'); … … 99 124 100 125 console.assert(this.router()); 101 var currentCategory = this. toolbar().currentCategory();126 var currentCategory = this._categoryToolbar.currentCategory(); 102 127 103 128 var tasks = AnalysisTask.all().filter(function (task) { … … 165 190 { 166 191 return ` 192 <div class="toolbar-container"><analysis-category-toolbar></analysis-category-toolbar></div> 167 193 <div class="analysis-task-category"> 168 194 <table> … … 185 211 { 186 212 return ` 213 .toolbar-container { 214 text-align: center; 215 } 216 187 217 .analysis-task-category { 188 218 width: calc(100% - 2rem); -
trunk/Websites/perf.webkit.org/public/v3/pages/analysis-category-toolbar.js
r201775 r203709 1 1 2 class AnalysisCategoryToolbar extends Toolbar{3 constructor( )2 class AnalysisCategoryToolbar extends ComponentBase { 3 constructor(categoryPage) 4 4 { 5 5 super('analysis-category-toolbar'); 6 this._categoryPage = null; 6 7 this._categories = AnalysisTask.categories(); 7 8 this._currentCategory = null; 8 9 this._filter = null; 9 this._filterCallback = null;10 10 this.setCategoryIfValid(null); 11 12 this._filterInput = this.content().querySelector('input'); 13 this._filterInput.oninput = this._filterMayHaveChanged.bind(this, false); 14 this._filterInput.onchange = this._filterMayHaveChanged.bind(this, true); 11 15 } 12 16 17 setCategoryPage(categoryPage) { this._categoryPage = categoryPage; } 13 18 currentCategory() { return this._currentCategory; } 14 15 19 filter() { return this._filter; } 16 setFilterCallback(callback) 17 { 18 console.assert(!callback || callback instanceof Function); 19 this._filterCallback = callback; 20 } 20 setFilter(filter) { this._filter = filter; } 21 21 22 22 render() 23 23 { 24 var router = this.router(); 24 if (!this._categoryPage) 25 return; 26 27 var router = this._categoryPage.router(); 25 28 console.assert(router); 26 27 var currentPage = router.currentPage();28 console.assert(currentPage instanceof AnalysisCategoryPage);29 29 30 30 super.render(); … … 33 33 var link = ComponentBase.createLink; 34 34 35 var input = element('input', 36 { 37 oninput: this._filterMayHaveChanged.bind(this), 38 onchange: this._filterMayHaveChanged.bind(this), 39 }); 40 if (this._filter != null) 41 input.value = this._filter; 35 if (this._filterInput.value != this._filter) 36 this._filterInput.value = this._filter; 42 37 43 38 var currentCategory = this._currentCategory; 44 this.renderReplace(this.content().querySelector('.analysis-task-category-toolbar'), [ 45 element('ul', {class: 'buttoned-toolbar'}, 46 this._categories.map(function (category) { 47 return element('li', 48 {class: category == currentCategory ? 'selected' : null}, 49 link(category, router.url(currentPage.routeName(), {category: category}))); 50 })), 51 input]); 39 var categoryPage = this._categoryPage; 40 this.renderReplace(this.content().querySelector('.analysis-task-category-toolbar'), 41 this._categories.map(function (category) { 42 return element('li', 43 {class: category == currentCategory ? 'selected' : null}, 44 link(category, router.url(categoryPage.routeName(), categoryPage.stateForCategory(category)))); 45 })); 52 46 } 53 47 54 _filterMayHaveChanged( event)48 _filterMayHaveChanged(shouldUpdateState, event) 55 49 { 56 50 var input = event.target; 57 51 var oldFilter = this._filter; 58 52 this._filter = input.value; 59 if (this._filter != oldFilter && this._ filterCallback)60 this._ filterCallback(this._filter);53 if (this._filter != oldFilter && this._categoryPage || shouldUpdateState) 54 this._categoryPage.filterDidChange(shouldUpdateState); 61 55 } 62 56 … … 68 62 return false; 69 63 this._currentCategory = category; 64 return true; 65 } 70 66 71 var filterDidChange = !!this._filter; 72 this._filter = null; 73 if (filterDidChange && this._filterCallback) 74 this._filterCallback(this._filter); 75 76 return true; 67 static cssTemplate() 68 { 69 return Toolbar.cssTemplate() + ` 70 .queue-toolbar { 71 position: absolute; 72 right: 1rem; 73 } 74 ` 77 75 } 78 76 79 77 static htmlTemplate() 80 78 { 81 return `<div class="buttoned-toolbar analysis-task-category-toolbar"></div>`; 79 return ` 80 <ul class="analysis-task-category-toolbar buttoned-toolbar"></ul> 81 <input type="text"> 82 <ul class="buttoned-toolbar queue-toolbar"> 83 <li><a href="#/analysis/queue">Queue</a></li> 84 </ul>`; 82 85 } 83 86 } 87 88 ComponentBase.defineElement('analysis-category-toolbar', AnalysisCategoryToolbar); -
trunk/Websites/perf.webkit.org/public/v3/pages/summary-page.js
r201041 r203709 34 34 35 35 var current = Date.now(); 36 var timeRange = [current - 7 *24 * 3600 * 1000, current];36 var timeRange = [current - 24 * 3600 * 1000, current]; 37 37 for (var group of this._configGroups) 38 38 group.fetchAndComputeSummary(timeRange).then(this.render.bind(this)); … … 251 251 this._configurationList = []; 252 252 this._setToRatio = new Map; 253 this._ratio = null;253 this._ratio = NaN; 254 254 this._label = null; 255 255 this._missingPlatforms = new Set; -
trunk/Websites/perf.webkit.org/server-tests/api-build-requests-tests.js
r199332 r203709 178 178 assert.ok(!buildRequests[0].hasStarted()); 179 179 assert.ok(buildRequests[0].isPending()); 180 assert.equal(buildRequests[0].statusLabel(), 'Waiting to be scheduled');180 assert.equal(buildRequests[0].statusLabel(), 'Waiting'); 181 181 182 182 assert.equal(buildRequests[1].id(), 701); … … 189 189 assert.ok(!buildRequests[1].hasStarted()); 190 190 assert.ok(buildRequests[1].isPending()); 191 assert.equal(buildRequests[1].statusLabel(), 'Waiting to be scheduled');191 assert.equal(buildRequests[1].statusLabel(), 'Waiting'); 192 192 193 193 assert.equal(buildRequests[2].id(), 702); … … 200 200 assert.ok(!buildRequests[2].hasStarted()); 201 201 assert.ok(buildRequests[2].isPending()); 202 assert.equal(buildRequests[2].statusLabel(), 'Waiting to be scheduled');202 assert.equal(buildRequests[2].statusLabel(), 'Waiting'); 203 203 204 204 assert.equal(buildRequests[3].id(), 703); … … 211 211 assert.ok(!buildRequests[3].hasStarted()); 212 212 assert.ok(buildRequests[3].isPending()); 213 assert.equal(buildRequests[3].statusLabel(), 'Waiting to be scheduled');213 assert.equal(buildRequests[3].statusLabel(), 'Waiting'); 214 214 215 215 let osx = Repository.findById(9); -
trunk/Websites/perf.webkit.org/unit-tests/analysis-task-tests.js
r198826 r203709 176 176 assert.ok(task.hasPendingRequests()); 177 177 assert.equal(task.requestLabel(), '6 of 14'); 178 assert.equal(task.category(), 'i dentified');178 assert.equal(task.category(), 'investigated'); 179 179 assert.equal(task.changeType(), 'regression'); 180 180 assert.equal(task.startMeasurementId(), 37117949); -
trunk/Websites/perf.webkit.org/unit-tests/test-groups-tests.js
r198853 r203709 141 141 assert.ok(!buildRequests[0].hasStarted()); 142 142 assert.ok(buildRequests[0].isPending()); 143 assert.equal(buildRequests[0].statusLabel(), 'Waiting to be scheduled');143 assert.equal(buildRequests[0].statusLabel(), 'Waiting'); 144 144 assert.equal(buildRequests[0].buildId(), null); 145 145 assert.equal(buildRequests[0].result(), null); … … 150 150 assert.ok(!buildRequests[1].hasStarted()); 151 151 assert.ok(buildRequests[1].isPending()); 152 assert.equal(buildRequests[1].statusLabel(), 'Waiting to be scheduled');152 assert.equal(buildRequests[1].statusLabel(), 'Waiting'); 153 153 assert.equal(buildRequests[1].buildId(), null); 154 154 assert.equal(buildRequests[1].result(), null);
Note: See TracChangeset
for help on using the changeset viewer.