From 7f5cfe03c4a0b7baf35efbeb1ad96850f5c0a5a7 Mon Sep 17 00:00:00 2001 From: "rniwa@webkit.org" Date: Tue, 22 Oct 2013 01:51:37 +0000 Subject: [PATCH] New flakiness dashboard should align results by revision numbers https://bugs.webkit.org/show_bug.cgi?id=123129 Reviewed by Tim Horton. * include/config.json: Specify the default cache time to be 10 minutes. * include/json-shared.php: Added Expires and Cache-Control headers. It's configurable via config.json. * index.html: (TestResultsView._createResultCell): Don't put '-' in a result cell without time. (TestResultsView._populateTestPane): Create an array of build times ordered from the newest to the oldest. Not that build.time() is the newest commit time among all repository for each result. e.g. if we had both WebKit and Safari repository information in a given result, the newer of the two will be used. (TestResultsView._createTestResultHeader): Added. (TestResultsView._createBuildsAndComputeSlownessOfResults): Extracted from _createTestResultRow so that _populateTestPane could use Build object before calling _createTestResultRow. (TestResultsView._createTestResultRow): Takes buildTimes. Insert an empty cell for a build time if the current row doesn't contain that a result for that build time. (TestResultsView._populateBuilderPane): * main.css: Tweaked the style so that bubbles are aligned vertically without '-'. (.resultsTable): (.resultsTable thead th): (.resultsTable .resultCell): (.resultsTable a): (.resultsTable span a): git-svn-id: https://svn.webkit.org/repository/webkit/trunk@157772 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Websites/test-results/ChangeLog | 27 +++++++ Websites/test-results/include/config.json | 1 + Websites/test-results/include/json-shared.php | 3 + Websites/test-results/index.html | 77 ++++++++++++++----- Websites/test-results/main.css | 20 +++-- 5 files changed, 102 insertions(+), 26 deletions(-) diff --git a/Websites/test-results/ChangeLog b/Websites/test-results/ChangeLog index 15aabd327f06..bbc0f2024e4e 100644 --- a/Websites/test-results/ChangeLog +++ b/Websites/test-results/ChangeLog @@ -1,3 +1,30 @@ +2013-10-21 Ryosuke Niwa + + New flakiness dashboard should align results by revision numbers + https://bugs.webkit.org/show_bug.cgi?id=123129 + + Reviewed by Tim Horton. + + * include/config.json: Specify the default cache time to be 10 minutes. + * include/json-shared.php: Added Expires and Cache-Control headers. It's configurable via config.json. + * index.html: + (TestResultsView._createResultCell): Don't put '-' in a result cell without time. + (TestResultsView._populateTestPane): Create an array of build times ordered from the newest to the oldest. + Not that build.time() is the newest commit time among all repository for each result. e.g. if we had + both WebKit and Safari repository information in a given result, the newer of the two will be used. + (TestResultsView._createTestResultHeader): Added. + (TestResultsView._createBuildsAndComputeSlownessOfResults): Extracted from _createTestResultRow so + that _populateTestPane could use Build object before calling _createTestResultRow. + (TestResultsView._createTestResultRow): Takes buildTimes. Insert an empty cell for a build time if + the current row doesn't contain that a result for that build time. + (TestResultsView._populateBuilderPane): + * main.css: Tweaked the style so that bubbles are aligned vertically without '-'. + (.resultsTable): + (.resultsTable thead th): + (.resultsTable .resultCell): + (.resultsTable a): + (.resultsTable span a): + 2013-10-21 Ryosuke Niwa New flakiness dashboard show test time, modifiers, and flaky tests diff --git a/Websites/test-results/include/config.json b/Websites/test-results/include/config.json index 147919406455..a407f4656139 100644 --- a/Websites/test-results/include/config.json +++ b/Websites/test-results/include/config.json @@ -1,5 +1,6 @@ { "debug": true, + "jsonCacheMaxAge": 600, "database": { "host": "localhost", "port": "5432", diff --git a/Websites/test-results/include/json-shared.php b/Websites/test-results/include/json-shared.php index 3ed00fc56ee7..a99921736f91 100644 --- a/Websites/test-results/include/json-shared.php +++ b/Websites/test-results/include/json-shared.php @@ -3,6 +3,9 @@ require_once('../include/db.php'); header('Content-type: application/json'); +$maxage = config('jsonCacheMaxAge'); +header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $maxage) . ' GMT'); +header("Cache-Control: maxage=$maxage"); function exit_with_error($status, $details = array()) { $details['status'] = $status; diff --git a/Websites/test-results/index.html b/Websites/test-results/index.html index 48e20a54f57d..2dd04290143e 100644 --- a/Websites/test-results/index.html +++ b/Websites/test-results/index.html @@ -111,7 +111,7 @@ TestResultsView._createResultCell = function (master, builder, result, previousR var build = result['buildNumber']; var actual = result['actual']; var expected = result['expected']; - var timeIfSlow = result.isSlow ? result.roundedTime : '-'; + var timeIfSlow = result.isSlow ? result.roundedTime : ''; var anchor = element('a', {'href': this._urlFromBuilder('result', master, builder, revision, build)}, [timeIfSlow]); anchor.onmouseenter = function () { var repositoryById = TestResultsView._repositories; @@ -145,41 +145,71 @@ TestResultsView._createResultCell = function (master, builder, result, previousR TestResultsView._populateTestPane = function(testName, results, section) { var table = element('table', {'class': 'resultsTable'}, [element('caption', [testName])]); + table.appendChild(this._createTestResultHeader('Builder')); + var resultsByBuilder = results['builders']; + var buildTimes = new Array(); for (var builderId in resultsByBuilder) { - var resultsByTest = resultsByBuilder[builderId]; - var results; - for (var testId in resultsByTest) - results = resultsByTest[testId]; - if (!results) - continue; + var results = resultsByBuilder[builderId]; + this._createBuildsAndComputeSlownessOfResults(results); + for (var i = 0; i < results.length; i++) { + var time = results[i].build.time(); + if (buildTimes.indexOf(time) < 0) + buildTimes.push(time); + } + } + buildTimes.sort(function (a, b) { return b - a; }); + for (var builderId in resultsByBuilder) { var builder = this._builders[builderId]; // FIXME: Add a master name if there is more than one. - table.appendChild(this._createTestResultRow(builder.name, results, builder)); + table.appendChild(this._createTestResultRow(builder.name, resultsByBuilder[builderId], builder, buildTimes)); } section.appendChild(table); } -TestResultsView._createTestResultRow = function (title, results, builder) { - var slowestTime = 0; +TestResultsView._createTestResultHeader = function (labelForFirstColumn) { + return element('thead', [element('tr', [ + element('th', [labelForFirstColumn]), + element('th', ['Bug']), + element('th', ['Expectations']), + element('th', ['Slowest'])])]); +} + +TestResultsView._createBuildsAndComputeSlownessOfResults = function (results) { for (var i = 0; i < results.length; i++) { var result = results[i]; result.build = new TestBuild(this._repositories, this._builders, result); result.roundedTime = result.time > 10000 ? Math.round(result.time / 1000) : Math.round(result.time / 100) / 10; result.isSlow = result.time > 1000; - if (result.isSlow) - slowestTime = Math.max(slowestTime, result.roundedTime); } - if (slowestTime) - slowestTime += 's'; - else - slowestTime = ''; +} +TestResultsView._createTestResultRow = function (title, results, builder, buildTimes) { var sortedResults = results.sort(function (result1, result2) { return result2.build.time() - result1.build.time(); }); - var cells = new Array(sortedResults.length); - for (var i = 0; i < sortedResults.length; i++) - cells[i] = this._createResultCell(builder.master, builder.name, sortedResults[i], sortedResults[i - 1]); + var cells = new Array(); + + function addEmptyCell() { cells.push(element('span', {'class': 'resultCell'}, [element('a')])); } + + var buildTimeIndex = 0; + for (var i = 0; i < sortedResults.length; i++) { + var result = sortedResults[i]; + if (buildTimes) { + while (buildTimes[buildTimeIndex] > result.build.time()) { + addEmptyCell(); + buildTimeIndex++; + } + if (buildTimes[buildTimeIndex] == result.build.time()) + buildTimeIndex++; + } + cells.push(this._createResultCell(builder.master, builder.name, result, sortedResults[i - 1])); + } + if (buildTimes) { + while (buildTimeIndex < buildTimes.length) { + addEmptyCell(); + buildTimeIndex++; + } + } var formattedModifiers = sortedResults[0].modifiers.split(' ').map(function (modifier) { if (modifier.indexOf('/') > 0) @@ -187,6 +217,12 @@ TestResultsView._createTestResultRow = function (title, results, builder) { return modifier; }); + var slowestTime = Math.max.apply(Math, results.map(function (result) { return result.roundedTime; })); + if (slowestTime >= 1) + slowestTime += 's'; + else + slowestTime = ''; + return element('tr', [ element('th', ['' + title]), element('td', {'class': 'modifiers'}, formattedModifiers), @@ -287,11 +323,14 @@ TestResultsView._populateBuilderPane = function(builderName, failureType, result if (!resultsByTests) return; + table.appendChild(this._createTestResultHeader('Test')); + var builder = this._builders[builderId]; for (var testId in resultsByTests) { var results = resultsByTests[testId]; if (!results.length || !this._matchesFailureType(results, failureType, this._availableTests[testId].name)) continue; + this._createBuildsAndComputeSlownessOfResults(resultsByTests[testId]); table.appendChild(this._createTestResultRow(this._availableTests[testId].name, resultsByTests[testId], builder)); } section.appendChild(table); diff --git a/Websites/test-results/main.css b/Websites/test-results/main.css index 84aabdb179cf..cede3bfe0218 100644 --- a/Websites/test-results/main.css +++ b/Websites/test-results/main.css @@ -34,7 +34,6 @@ border: 0px solid #fff; padding: 0; margin: 0; - width: 100%; } .resultsTable caption { @@ -45,6 +44,10 @@ white-space: pre; } +.resultsTable thead th { + font-weight: bold; +} + .resultsTable td, .resultsTable th { white-space: pre; @@ -71,6 +74,7 @@ .resultsTable .resultCell { display: inline-block; padding: 0.2em 0.2em; + vertical-align: bottom; } .resultsTable tr:hover, @@ -81,6 +85,7 @@ .resultsTable a { color: #00f; text-shadow: none; + text-decoration: underline; } .resultsTable a:visited { @@ -89,14 +94,15 @@ .resultsTable span a { display: block; - width: 1.4em; - height: 2em; - border-radius: 3px; - font-size: 0.5em; - padding: 0.3em; + width: 1.5em; + height: 2.5em; + border-radius: 5px; + font-size: 0.7em; text-align: center; - line-height: 1.9em; + line-height: 2.5em; + padding: 0.1em; color: inherit; + text-decoration: none; } .resultsTable .PASS a { -- 2.36.0