blob: 243bdb4084d4022ce66b73e77cffde8cdaccbdf9 [file] [edit]
// 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 File that lists builders, their masters, and logical groupings
// of them.
function BuilderMaster(name, basePath)
{
this.name = name;
this.basePath = basePath;
}
BuilderMaster.prototype.logPath = function(builder, buildNumber)
{
return this.basePath + 'builders/' + builder + '/builds/' + buildNumber;
};
BuilderMaster.prototype.builderJsonPath = function()
{
return this.basePath + 'json/builders';
};
CHROMIUM_BUILDER_MASTER = new BuilderMaster('Chromium', 'http://build.chromium.org/p/chromium/');
CHROMIUM_WIN_BUILDER_MASTER = new BuilderMaster('ChromiumWin', 'http://build.chromium.org/p/chromium.win/');
CHROMIUM_MAC_BUILDER_MASTER = new BuilderMaster('ChromiumMac', 'http://build.chromium.org/p/chromium.mac/');
CHROMIUM_LINUX_BUILDER_MASTER = new BuilderMaster('ChromiumLinux', 'http://build.chromium.org/p/chromium.linux/');
CHROMIUMOS_BUILDER_MASTER = new BuilderMaster('ChromiumChromiumOS', 'http://build.chromium.org/p/chromium.chromiumos/');
CHROMIUM_GPU_BUILDER_MASTER = new BuilderMaster('ChromiumGPU', 'http://build.chromium.org/p/chromium.gpu/');
CHROMIUM_GPU_FYI_BUILDER_MASTER = new BuilderMaster('ChromiumGPUFYI', 'http://build.chromium.org/p/chromium.gpu.fyi/');
CHROMIUM_PERF_AV_BUILDER_MASTER = new BuilderMaster('ChromiumPerfAv', 'http://build.chromium.org/p/chromium.perf_av/');
CHROMIUM_WEBKIT_BUILDER_MASTER = new BuilderMaster('ChromiumWebkit', 'http://build.chromium.org/p/chromium.webkit/');
WEBKIT_BUILDER_MASTER = new BuilderMaster('webkit.org', 'http://build.webkit.org/');
var LEGACY_BUILDER_MASTERS_TO_GROUPS = {
'Chromium': '@DEPS - chromium.org',
'ChromiumWin': '@DEPS - chromium.org',
'ChromiumMac': '@DEPS - chromium.org',
'ChromiumLinux': '@DEPS - chromium.org',
'ChromiumChromiumOS': '@DEPS CrOS - chromium.org',
'ChromiumGPU': '@DEPS - chromium.org',
'ChromiumGPUFYI': '@DEPS FYI - chromium.org',
'ChromiumPerfAv': '@DEPS - chromium.org',
'ChromiumWebkit': '@ToT - chromium.org',
'webkit.org': '@ToT - webkit.org'
};
function BuilderGroup(isToTWebKit)
{
this.isToTWebKit = isToTWebKit;
// Map of builderName (the name shown in the waterfall) to builderPath (the
// path used in the builder's URL)
this.builders = {};
this.groups = 0;
this.expectedGroups = 0;
}
BuilderGroup.prototype.setbuilder = function(builder, flags) {
this.builders[builder] = builder.replace(/[ .()]/g, '_');
// FIXME: Remove this at some point, we don't actually use DEFAULT_BUILDER
// in any meaningful way anymore. We always just default to the
// first builder in alphabetical order.
if (flags & BuilderGroup.DEFAULT_BUILDER)
this.defaultBuilder = builder;
};
BuilderGroup.prototype.append = function(builders) {
builders.forEach(function(builderAndFlags) {
var builder = builderAndFlags[0];
var flags = builderAndFlags[1];
this.setbuilder(builder, flags);
}, this);
this.groups += 1;
};
BuilderGroup.prototype.loaded = function() {
return this.groups >= this.expectedGroups;
}
BuilderGroup.prototype.setup = function()
{
// FIXME: instead of copying these to globals, it would be better if
// the rest of the code read things from the BuilderGroup instance directly
g_defaultBuilderName = this.defaultBuilder;
g_builders = this.builders;
};
BuilderGroup.TOT_WEBKIT = true;
BuilderGroup.DEPS_WEBKIT = false;
BuilderGroup.DEFAULT_BUILDER = 1 << 1;
var BUILDER_TO_MASTER = {};
function associateBuildersWithMaster(builders, master)
{
builders.forEach(function(builderAndFlags) {
var builder = builderAndFlags[0];
BUILDER_TO_MASTER[builder] = master;
});
}
function doXHR(url, onLoad, builderGroups, groupName)
{
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onload = function() {
if (xhr.status == 200)
onLoad(JSON.parse(xhr.response));
else
onErrorLoadingBuilderList(url, builderGroups, groupName);
};
xhr.onerror = function() { onErrorLoadingBuilderList(url, builderGroups, groupName); };
xhr.send();
}
function requestBuilderList(builderGroups, builderFilter, master, groupName, builderGroup)
{
if (!builderGroups[groupName])
builderGroups[groupName] = builderGroup;
var onLoad = partial(onBuilderListLoad, builderGroups, builderFilter, master, groupName);
doXHR(master.builderJsonPath(), onLoad, builderGroups, groupName);
builderGroups[groupName].expectedGroups += 1;
}
function isChromiumDepsGpuTestRunner(builder)
{
return true;
}
function isChromiumDepsFyiGpuTestRunner(builder)
{
// FIXME: This is kind of wonky, but there's not really a better pattern.
return builder.indexOf('(') != -1;
}
function isChromiumTipOfTreeGpuTestRunner(builder)
{
return builder.indexOf('GPU') != -1;
}
function isWebkitTestRunner(builder)
{
if (builder.indexOf('EFL') != -1)
return builder.indexOf('Build') == -1;
if (builder.indexOf('Tests') != -1) {
// Apple Windows bots still run old-run-webkit-tests, so they don't upload data.
return builder.indexOf('Win') == -1 || (builder.indexOf('Qt') != -1 && builder.indexOf('Chromium') != -1);
}
return builder.indexOf('GTK') != -1 || builder == 'Qt Linux Release';
}
function isChromiumContentShellTestRunner(builder)
{
return builder.indexOf('(Content Shell)') != -1;
}
function isChromiumWebkitTipOfTreeTestRunner(builder)
{
return builder.indexOf('Webkit') != -1 && builder.indexOf('Builder') == -1 && builder.indexOf('(deps)') == -1 && builder.indexOf('ASAN') == -1;
}
function isChromiumWebkitDepsTestRunner(builder)
{
return builder.indexOf('Webkit') != -1 && builder.indexOf('Builder') == -1 && builder.indexOf('(deps)') != -1;
}
function isChromiumDepsGTestRunner(builder)
{
return builder.indexOf('Tests') != -1 && builder.indexOf('Chrome Frame') == -1;
}
function isChromiumDepsCrosGTestRunner(builder)
{
return builder.indexOf('Tests') != -1;
}
function isChromiumTipOfTreeGTestRunner(builder)
{
return !isChromiumTipOfTreeGpuTestRunner(builder) && builder.indexOf('Builder') == -1 && builder.indexOf('Perf') == -1 &&
builder.indexOf('Webkit') == -1 && builder.indexOf('Valgrind') == -1 && builder.indexOf('Chrome Frame') == -1;
}
function isChromiumDepsAVTestRunner(builder)
{
return builder.indexOf('Builder') == -1;
}
function generateBuildersFromBuilderList(builderList, filter)
{
return builderList.filter(filter).map(function(tester, index) {
var builder = [tester];
if (!index)
builder.push(BuilderGroup.DEFAULT_BUILDER);
return builder;
});
}
function onBuilderListLoad(builderGroups, builderFilter, master, groupName, json)
{
var builders = generateBuildersFromBuilderList(Object.keys(json), builderFilter);
associateBuildersWithMaster(builders, master);
builderGroups[groupName].append(builders);
if (builderGroups[groupName].loaded())
g_handleBuildersListLoaded();
}
function onErrorLoadingBuilderList(url, builderGroups, groupName)
{
builderGroups[groupName].groups += 1;
console.log('Could not load list of builders from ' + url + '. Try reloading.');
}
function loadBuildersList(groupName, testType) {
switch (testType) {
case 'gl_tests':
case 'gpu_tests':
switch(groupName) {
case '@DEPS - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, isChromiumDepsGpuTestRunner, CHROMIUM_GPU_BUILDER_MASTER, groupName, builderGroup);
break;
case '@DEPS FYI - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, isChromiumDepsFyiGpuTestRunner, CHROMIUM_GPU_FYI_BUILDER_MASTER, groupName, builderGroup);
break;
case '@ToT - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, isChromiumTipOfTreeGpuTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
break;
}
break;
case 'layout-tests':
switch(groupName) {
case 'Content Shell @ToT - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumContentShellTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
break;
case '@ToT - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumWebkitTipOfTreeTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
break;
case '@ToT - webkit.org':
var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isWebkitTestRunner, WEBKIT_BUILDER_MASTER, groupName, builderGroup);
break;
case '@DEPS - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumWebkitDepsTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumDepsAVTestRunner, CHROMIUM_PERF_AV_BUILDER_MASTER, groupName, builderGroup);
break;
}
break;
case 'test_shell_tests':
case 'webkit_unit_tests':
switch(groupName) {
case '@ToT - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
requestBuilderList(TEST_SHELL_TESTS_BUILDER_GROUPS, isChromiumWebkitTipOfTreeTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
break;
case '@DEPS - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
requestBuilderList(TEST_SHELL_TESTS_BUILDER_GROUPS, isChromiumWebkitDepsTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
requestBuilderList(TEST_SHELL_TESTS_BUILDER_GROUPS, isChromiumDepsAVTestRunner, CHROMIUM_PERF_AV_BUILDER_MASTER, groupName, builderGroup);
break;
}
break;
default:
switch(groupName) {
case '@DEPS - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsGTestRunner, CHROMIUM_BUILDER_MASTER, groupName, builderGroup);
requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsGTestRunner, CHROMIUM_WIN_BUILDER_MASTER, groupName, builderGroup);
requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsGTestRunner, CHROMIUM_MAC_BUILDER_MASTER, groupName, builderGroup);
requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsGTestRunner, CHROMIUM_LINUX_BUILDER_MASTER, groupName, builderGroup);
break;
case '@DEPS CrOS - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsCrosGTestRunner, CHROMIUMOS_BUILDER_MASTER, groupName, builderGroup);
break;
case '@ToT - chromium.org':
var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumTipOfTreeGTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
break;
}
break;
}
}
var TEST_SHELL_TESTS_BUILDER_GROUPS = {
'@ToT - chromium.org': null,
'@DEPS - chromium.org': null,
};
var LAYOUT_TESTS_BUILDER_GROUPS = {
'@ToT - chromium.org': null,
'@ToT - webkit.org': null,
'@DEPS - chromium.org': null,
'Content Shell @ToT - chromium.org': null,
};
var CHROMIUM_GPU_TESTS_BUILDER_GROUPS = {
'@DEPS - chromium.org': null,
'@DEPS FYI - chromium.org': null,
'@ToT - chromium.org': null,
};
var CHROMIUM_GTESTS_BUILDER_GROUPS = {
'@DEPS - chromium.org': null,
'@DEPS CrOS - chromium.org': null,
'@ToT - chromium.org': null,
};