loopback/bin/test-browser.js

105 lines
2.6 KiB
JavaScript

#!/usr/bin/env node
var path = require('path');
var spawn = require('child_process').spawn;
var wd = require('wd');
var devserver = require('./dev-server.js');
var SELENIUM_PATH = '../node_modules/.bin/start-selenium';
var testUrl = 'http://127.0.0.1:8000/tests/test.html';
var testTimeout = 2 * 60 * 1000;
var currentTest = '';
var results = {};
var client = {};
var browsers = [
'firefox',
// Temporarily disable safari until it is fixed (#1068)
// 'safari',
'chrome'
];
// Don't do it on trais
if (process.env.TRAVIS) {
console.log('skipping tests on travis');
process.exit(0)
}
var numBrowsers = browsers.length;
var finishedBrowsers = 0;
function startServers(callback) {
// Starts the file and CORS proxy
devserver.start();
// Start selenium
var started = false;
var selenium = spawn(path.resolve(__dirname, SELENIUM_PATH));
selenium.stdout.on('data', function(data) {
if (!started &&
/Started org.openqa.jetty.jetty.servlet.ServletHandler/.test(data)) {
started = true;
callback();
}
});
}
function testsComplete() {
var passed = Object.keys(results).length && Object.keys(results).every(function(x) {
return !results[x].failed;
});
if (passed) {
console.log('Woot, all ' + Object.keys(results).length + ' tests passed');
process.exit(0);
} else if (!Object.keys(results).length) {
console.error('no tests ran');
process.exit(4);
} else {
console.error('we ran ' + Object.keys(results).length + ' tests and ' + results[x].failed + ' failed');
process.exit(1);
}
}
function startTest() {
if (numBrowsers === finishedBrowsers) {
return testsComplete();
}
if (!browsers.length) {
return;
}
var currentTest = browsers.pop();
console.log('[' + currentTest + '] starting');
var client = wd.promiseChainRemote();
client.init({
browserName: currentTest
}).get(testUrl).setAsyncScriptTimeout(testTimeout)
.executeAsync('var cb = arguments[arguments.length - 1];QUnit.done(function( report ) {cb(report)});')
.then(function (result) {
finishedBrowsers++;
if (!result.failed) {
console.log('[' + currentTest + '] passed ' + result.passed + ' of ' + result.total + ' tests');
} else {
console.log('[' + currentTest + '] failed ' + result.failed + ' of ' + result.total + ' tests');
return client.quit().then(function() {
process.exit(2);
})
}
results[currentTest] = result;
}).quit()
.then(startTest,function(e) {
console.error(e);
console.error('Doh, tests failed');
client.quit();
process.exit(3);
});
}
startServers(function() {
startTest();
});