blob: 0679c5b9d8cc30ace7a5706efbd94f96616d43f0 [file] [log] [blame]
'use strict';
var isNode = process && !process.browser;
var UAParser = require('ua-parser-js');
var ua = !isNode && new UAParser(navigator.userAgent);
var marky = require('marky');
var median = require('median');
var results = {
tests: {}
};
// Capture test events for selenium output
var testEventsBuffer = [];
global.testEvents = function () {
var events = testEventsBuffer;
testEventsBuffer = [];
return events;
};
// fix for Firefox max timing entries capped to 150:
// https://bugzilla.mozilla.org/show_bug.cgi?id=1331135
/* global performance */
if (typeof performance !== 'undefined' && performance.setResourceTimingBufferSize) {
performance.setResourceTimingBufferSize(100000);
}
var pre = !isNode && global.document.getElementById('output');
function log(msg) {
if (pre) {
pre.textContent += msg;
} else {
console.log(msg);
}
}
exports.log = log;
exports.startSuite = function (suiteName) {
log('Starting suite: ' + suiteName + '\n\n');
testEventsBuffer.push({ name: 'suite', obj: { title: suiteName } });
};
exports.endSuite = function (suiteName) {
testEventsBuffer.push({ name: 'suite end', obj: { title: suiteName } });
};
exports.start = function (testCase, iter) {
var key = testCase.name;
log('Starting test: ' + key + ' with ' + testCase.assertions +
' assertions and ' + iter + ' iterations... ');
results.tests[key] = {
iterations: []
};
};
exports.end = function (testCase) {
var key = testCase.name;
var obj = results.tests[key];
obj.median = median(obj.iterations);
obj.numIterations = obj.iterations.length;
delete obj.iterations; // keep it simple when reporting
log('median: ' + obj.median + ' ms\n');
testEventsBuffer.push({ name: 'pass', obj: { title: testCase.name } });
testEventsBuffer.push({ name: 'benchmark:result', obj });
};
exports.startIteration = function (testCase) {
marky.mark(testCase.name);
};
exports.endIteration = function (testCase) {
var entry = marky.stop(testCase.name);
results.tests[testCase.name].iterations.push(entry.duration);
};
exports.startAll = function () {
testEventsBuffer.push({ name: 'start' });
};
exports.complete = function (adapter) {
results.completed = true;
if (isNode) {
results.client = {
node: process.version
};
} else {
results.client = {
browser: ua.getBrowser(),
device: ua.getDevice(),
engine: ua.getEngine(),
cpu: ua.getCPU(),
os : ua.getOS(),
userAgent: navigator.userAgent
};
}
results.adapter = adapter;
console.log('=>', JSON.stringify(results, null, ' '), '<=');
log('\nTests Complete!\n\n');
testEventsBuffer.push({ name: 'end', obj: results });
};