Simple test result logger

This commit is contained in:
Thomas Aylott
2013-11-06 15:30:50 -05:00
parent 694cd6e9e8
commit c4727944df
2 changed files with 135 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
console._error = console.error;
console._warn = console.warn;
console._log = console.log;
console.log = window.print = function(message){
console._log(message);
testImageURL('/print?type=log&message=' + encodeURIComponent(message) + '&_=' + Date.now().toString(36));
};
console.error = function(message){
console._error(message);
testImageURL('/print?type=error&message=' + encodeURIComponent(message) + '&_=' + Date.now().toString(36));
};
console.warn = function(message){
console._warn(message);
testImageURL('/print?type=warn&message=' + encodeURIComponent(message) + '&_=' + Date.now().toString(36));
};
;(function(env){
env.addReporter(new jasmine.JSReporter());
env.addReporter(new TAPReporter(window.print));
function report(){
if (typeof jasmine.getJSReport != 'function') return setTimeout(report, 100);
postDataToURL(JSON.stringify(jasmine.getJSReport()), '/reportTestResults', function(error, event){
if (error) return console.error(error);
console.log(event);
});
}
var oldCallback = env.currentRunner().finishCallback;
env.currentRunner().finishCallback = function(){
if (oldCallback) oldCallback.apply(this, arguments);
report();
};
function postDataToURL(data, url, callback){
var id = '$' + (+new Date()).toString(36);
var postReportingTarget = document.createElement('iframe');
postReportingTarget.id = postReportingTarget.name = 'postReportingTarget' + id;
var postReportingForm = document.createElement('form');
postReportingForm.method = 'POST';
postReportingForm.action = url;
postReportingForm.target = postReportingTarget.name;
var postReportingData = document.createElement('input');
postReportingData.type = 'hidden';
postReportingData.name = 'data';
postReportingData.value = data || '{"error":"unknown error in postReportingData"}';
postReportingForm.appendChild(postReportingData);
postReportingForm.appendChild(postReportingTarget);
postReportingForm.style.cssText = "visibility:hidden; position:absolute; bottom:100%; right:100%";
function done(error, event){
postReportingForm.parentNode.removeChild(postReportingForm);
callback(error, event);
}
postReportingTarget.onerror = function(error){
done(error);
}
postReportingTarget.onload = function(event){
done(null, event);
}
document.body.appendChild(postReportingForm);
postReportingForm.submit();
}
}(window.jasmine.getEnv()));
+60
View File
@@ -0,0 +1,60 @@
testImageURL._recycle = function(img){
console.log('_recycle', img);
try {
img.src = '';
img.onload = img.onerror = null;
} catch(e){}
testImageURL._recycleBin.push(img);
}
testImageURL.getImage = function(callback){
// if (!testImageURL._recycleBin) testImageURL._recycleBin = [new Image(),new Image(),new Image(),new Image()];
// function get(){
// if (testImageURL._recycleBin.length === 0) return setTimeout(get, 100);
// callback(testImageURL._recycleBin.shift(), testImageURL._recycle);
// }
// get();
callback(new Image(), function recycle(){});
}
testImageURL.defaultCallback = function(error, event){}
function testImageURL(url, timeout, callback){
if (typeof timeout == 'function'){
callback = timeout;
timeout = testImageURL.timeout;
}
if (typeof callback != 'function') callback = testImageURL.defaultCallback;
testImageURL.getImage(function(img, done){
function callbackWrapper(error, event){
callbackWrapper = testImageURL.noop;
clearTimeout(timer);
done(img);
img = url = timeout = null;
callback(error, event);
error = event = callback = null;
}
var timer = setTimeout(function(){callbackWrapper(Error('timeout'));}, timeout);
try {
img.onload = function(event){ callbackWrapper(null, event || window.event); };
img.onerror = function(error){ callbackWrapper(error); };
img.src = url;
if (img.complete === true
|| img.readyState == 4
|| img.width > 0
|| img.height > 0
|| img.readyState == 'complete'
) callbackWrapper(null, null);
}
catch(error){
callbackWrapper(error);
}
});
}
testImageURL.noop = function(){};
testImageURL.timeout = 5000;