+2013-10-21 Ryosuke Niwa <rniwa@webkit.org>
+
+ 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 <rniwa@webkit.org>
New flakiness dashboard show test time, modifiers, and flaky tests
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;
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)
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),
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);