blob: 4016f7571e0488278f95290206a729cd7332f5f8 [file] [log] [blame]
// Copyright (C) 2012 Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// @fileoverview Base JS file for pages that want to parse the results JSON
// from the testing bots. This deals with generic utility functions, visible
// history, popups and appending the script elements for the JSON files.
//////////////////////////////////////////////////////////////////////////////
// CONSTANTS
//////////////////////////////////////////////////////////////////////////////
var GTEST_EXPECTATIONS_MAP_ = {
'P': 'PASS',
'F': 'FAIL',
'N': 'NO DATA',
'X': 'SKIPPED'
};
var LAYOUT_TEST_EXPECTATIONS_MAP_ = {
'P': 'PASS',
'N': 'NO DATA',
'X': 'SKIP',
'T': 'TIMEOUT',
'F': 'TEXT',
'C': 'CRASH',
'I': 'IMAGE',
'Z': 'IMAGE+TEXT',
// We used to glob a bunch of expectations into "O" as OTHER. Expectations
// are more precise now though and it just means MISSING.
'O': 'MISSING'
};
// Keys in the JSON files.
var WONTFIX_COUNTS_KEY = 'wontfixCounts';
var FIXABLE_COUNTS_KEY = 'fixableCounts';
var DEFERRED_COUNTS_KEY = 'deferredCounts';
var WONTFIX_DESCRIPTION = 'Tests never to be fixed (WONTFIX)';
var FIXABLE_DESCRIPTION = 'All tests for this release';
var DEFERRED_DESCRIPTION = 'All deferred tests (DEFER)';
var FIXABLE_COUNT_KEY = 'fixableCount';
var ALL_FIXABLE_COUNT_KEY = 'allFixableCount';
var WEBKIT_REVISIONS_KEY = 'webkitRevision';
var TIMESTAMPS_KEY = 'secondsSinceEpoch';
var BUILD_NUMBERS_KEY = 'buildNumbers';
var TESTS_KEY = 'tests';
var ONE_DAY_SECONDS = 60 * 60 * 24;
var ONE_WEEK_SECONDS = ONE_DAY_SECONDS * 7;
// These should match the testtype uploaded to webkit-test-results.webkit.org.
// See https://webkit-test-results.webkit.org/testfile.
var TEST_TYPES = [
'layout-tests'
];
// Enum for indexing into the run-length encoded results in the JSON files.
// 0 is where the count is length is stored. 1 is the value.
var RLE = {
LENGTH: 0,
VALUE: 1
}
function isFailingResult(value)
{
return 'FSTOCIZ'.indexOf(value) != -1;
}
// Generic utility functions.
function $(id)
{
return document.getElementById(id);
}
function currentBuilderGroupCategory()
{
return LAYOUT_TESTS_BUILDER_GROUPS;
}
function currentBuilderGroupName()
{
return g_history.crossDashboardState.group || Object.keys(currentBuilderGroupCategory())[0];
}
function currentBuilderGroup()
{
return currentBuilderGroupCategory()[currentBuilderGroupName()];
}
function currentBuilders()
{
return currentBuilderGroup().builders;
}
function isTipOfTreeWebKitBuilder()
{
return true;
}
var g_resultsByBuilder = {};
var g_expectationsByPlatform = {};
function isFlakinessDashboard()
{
return string.endsWith(window.location.pathname, 'flakiness_dashboard.html');
}
// Create a new function with some of its arguements
// pre-filled.
// Taken from goog.partial in the Closure library.
// @param {Function} fn A function to partially apply.
// @param {...*} var_args Additional arguments that are partially
// applied to fn.
// @return {!Function} A partially-applied form of the function bind() was
// invoked as a method of.
function partial(fn, var_args)
{
var args = Array.prototype.slice.call(arguments, 1);
return function() {
// Prepend the bound arguments to the current arguments.
var newArgs = Array.prototype.slice.call(arguments);
newArgs.unshift.apply(newArgs, args);
return fn.apply(this, newArgs);
};
};
// Returns the appropriate expectations map for the current testType.
function expectationsMap()
{
return g_history.isLayoutTestResults() ? LAYOUT_TEST_EXPECTATIONS_MAP_ : GTEST_EXPECTATIONS_MAP_;
}