blob: 524552dabdf9270cf7788e7a10b125db9ab1bdc5 [file] [log] [blame]
var libraries = ['cordova-android','cordova-ios'];
function $(id) { return document.getElementById(id); }
function XHR(url, cb) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechange=function() {
if (xhr.readyState==4) {
if (xhr.status==200) {
cb(false, JSON.parse(xhr.responseText));
} else {
cb(true, xhr);
}
}
};
xhr.send(null);
}
function popup_close() {
$('popup').style.display = 'none';
}
function popup_show(title, html) {
$('popup_html').innerHTML = html;
$('popup_title').innerText = title;
$('popup').style.display = '';
}
function getFailures(results) {
var fs = [];
if (results.fails && results.fails.length) {
fs = fs.concat(results.fails);
} else {
for (var sub in results) if (results.hasOwnProperty(sub)) {
fs = fs.concat(getFailures(results[sub]));
}
}
return fs;
}
function getPercentage(results) {
if (results.tests) {
var total = results.tests;
var failed = results.num_fails;
return ((total-failed)/total)*100;
} else {
var ps = [];
for (var sub in results) if (results.hasOwnProperty(sub)) {
ps.push(getPercentage(results[sub]));
}
return (ps.reduce(function(a,b) { return a+b; }) / ps.length);
}
}
function renderDashboardRow(platform, date, lastSha, lastResults, secondSha, secondResults) {
var colors = Highcharts.getOptions().colors;
var lib = 'cordova-' + platform;
// date column
$(platform + '_commit_date').innerText = date;
var date_anchor = $(platform + '_last_commit');
date_anchor.innerText = lastSha.substr(0,7);
date_anchor.setAttribute('href', 'https://git-wip-us.apache.org/repos/asf?p=' + lib + '.git;a=commit;h=' + lastSha);
// pass column
var current_percent = getPercentage(lastResults);
var last_percent = getPercentage(secondResults);
var p = $(platform + '_last_percentage');
p.innerText = current_percent.toFixed(2) + '%';
var arrow = document.createElement('img');
var updown = current_percent >= last_percent ? 'up' : 'down';
arrow.src='/img/' + updown + '.png';
arrow.alt='Current commit ' + updown + ' from previous (' + last_percent.toFixed(2) + '%)';
p.appendChild(arrow);
// pie chart goodness
var versionData = [];
var modelData = [];
var total_devices = 0;
var version_info = {};
var v_counter = 0;
for (var version in lastResults) if (lastResults.hasOwnProperty(version)) {
var models = lastResults[version];
var version_devices = 0;
var model_info = {};
for (var model in models) if (models.hasOwnProperty(model)) {
var numbers = models[model];
total_devices++;
version_devices++;
model_info[model] = numbers;
}
version_info[version] = {
num:version_devices,
details:model_info,
color:colors[v_counter]
};
v_counter++;
}
for (var vee in version_info) if (version_info.hasOwnProperty(vee)) (function(v) {
var y = (version_info[v].num / total_devices)*100;
versionData.push({
name:v,
y:y,
color:version_info[v].color,
sha:lastSha,
mobilespecpercentage:getPercentage(lastResults[v])
});
var details = version_info[v].details;
var model_counter = 0;
for (var em in details) if (details.hasOwnProperty(em)) (function(m) {
var y = (1/total_devices)*100;
var brightness = 0.2 - ((model_counter/total_devices) / 5);
modelData.push({
name:m,
y:y,
color:(Highcharts.Color(version_info[v].color).brighten(brightness).get()),
sha:lastSha,
mobilespecpercentage:getPercentage(lastResults[v][m]),
events:{
click:function() {
var fails = getFailures(lastResults[v][m]);
var html = '';
fails.forEach(function(fail) {
html += '<p class="spec">' + fail.spec + '</p>';
fail.assertions.forEach(function(assertion) {
html += '<code class="exception">' + assertion.exception + '</code>';
if (assertion.trace) {
html += '<pre><code>' + assertion.trace + '</code></pre>';
}
});
});
popup_show('Failed Assertions for ' + m + ', ' + v, html);
}
}
});
model_counter++;
})(em)
})(vee);
var pie = new Highcharts.Chart({
chart:{
renderTo:platform + '_last_pie',
type:'pie'
},
title:{text:null},
tooltip:{
formatter:function() {
return this.point.name + '<br/>' +
this.point.mobilespecpercentage.toFixed(2) + '%' +
(this.point.events && this.point.events.click ? '<br/><i style="font-size:9px;">Hint: click to see failures</i>' : '');
}
},
plotOptions:{pie:{
shadow:false
}},
series:[{
name:'Versions',
data:versionData,
size:'60%',
dataLabels:{
enabled:false
},
showInLegend:true
},{
name:'Models',
data:modelData,
innerSize:'60%'
}]
});
}
function go() {
XHR("/api/commits/recent", function(err, commits) {
if (err) {
// if api isnt ready just reload in 5 seconds :P
setTimeout(function() {
window.location.reload();
}, 5000);
} else {
for (var repo in commits) if (commits.hasOwnProperty(repo)) (function(lib) {
var platform = lib.substr('cordova-'.length);
var most_recent_sha = commits[lib].shas[0];
var second_recent_sha = commits[lib].shas[1];
var most_recent_date = moment(parseInt(commits[lib].dates[0])*1000).fromNow();
XHR("api/results?platform=" + platform + "&sha=" + most_recent_sha, function(err, last_results) {
XHR("api/results?platform=" + platform + "&sha=" + second_recent_sha, function(err, second_results) {
renderDashboardRow(platform, most_recent_date, most_recent_sha, last_results, second_recent_sha, second_results);
});
});
}(repo));
}
});
}