167 lines
5.4 KiB
JavaScript
167 lines
5.4 KiB
JavaScript
var srcFolder = '../../../src/node_modules/';
|
|
var wd = require(`${srcFolder}wd`);
|
|
var async = require(`${srcFolder}async`);
|
|
|
|
var config = {
|
|
host: 'ondemand.saucelabs.com',
|
|
port: 80,
|
|
username: process.env.SAUCE_USER,
|
|
accessKey: process.env.SAUCE_ACCESS_KEY,
|
|
};
|
|
|
|
var allTestsPassed = true;
|
|
// overwrite the default exit code
|
|
// in case not all worker can be run (due to saucelabs limits), `queue.drain` below will not be called
|
|
// and the script would silently exit with error code 0
|
|
process.exitCode = 2;
|
|
process.on('exit', (code) => {
|
|
if (code === 2) {
|
|
console.log('\x1B[31mFAILED\x1B[39m Not all saucelabs runner have been started.');
|
|
}
|
|
});
|
|
|
|
var sauceTestWorker = async.queue((testSettings, callback) => {
|
|
const browser = wd.promiseChainRemote(config.host, config.port, config.username, config.accessKey);
|
|
const name = `${process.env.GIT_HASH} - ${testSettings.browserName} ${testSettings.version}, ${testSettings.platform}`;
|
|
testSettings.name = name;
|
|
testSettings.public = true;
|
|
testSettings.build = process.env.GIT_HASH;
|
|
testSettings.extendedDebugging = true; // console.json can be downloaded via saucelabs, don't know how to print them into output of the tests
|
|
testSettings.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER;
|
|
|
|
browser.init(testSettings).get('http://localhost:9001/tests/frontend/', () => {
|
|
const url = `https://saucelabs.com/jobs/${browser.sessionID}`;
|
|
console.log(`Remote sauce test '${name}' started! ${url}`);
|
|
|
|
// tear down the test excecution
|
|
const stopSauce = function (success, timesup) {
|
|
clearInterval(getStatusInterval);
|
|
clearTimeout(timeout);
|
|
|
|
browser.quit(() => {
|
|
if (!success) {
|
|
allTestsPassed = false;
|
|
}
|
|
|
|
// if stopSauce is called via timeout (in contrast to via getStatusInterval) than the log of up to the last
|
|
// five seconds may not be available here. It's an error anyway, so don't care about it.
|
|
printLog(logIndex);
|
|
|
|
if (timesup) {
|
|
console.log(`[${testSettings.browserName} ${testSettings.platform}${testSettings.version === '' ? '' : (` ${testSettings.version}`)}] \x1B[31mFAILED\x1B[39m allowed test duration exceeded`);
|
|
}
|
|
console.log(`Remote sauce test '${name}' finished! ${url}`);
|
|
|
|
callback();
|
|
});
|
|
};
|
|
|
|
/**
|
|
* timeout if a test hangs or the job exceeds 14.5 minutes
|
|
* It's necessary because if travis kills the saucelabs session due to inactivity, we don't get any output
|
|
* @todo this should be configured in testSettings, see https://wiki.saucelabs.com/display/DOCS/Test+Configuration+Options#TestConfigurationOptions-Timeouts
|
|
*/
|
|
var timeout = setTimeout(() => {
|
|
stopSauce(false, true);
|
|
}, 870000); // travis timeout is 15 minutes, set this to a slightly lower value
|
|
|
|
let knownConsoleText = '';
|
|
// how many characters of the log have been sent to travis
|
|
let logIndex = 0;
|
|
var getStatusInterval = setInterval(() => {
|
|
browser.eval("$('#console').text()", (err, consoleText) => {
|
|
if (!consoleText || err) {
|
|
return;
|
|
}
|
|
knownConsoleText = consoleText;
|
|
|
|
if (knownConsoleText.indexOf('FINISHED') > 0) {
|
|
const match = knownConsoleText.match(/FINISHED.*([0-9]+) tests passed, ([0-9]+) tests failed/);
|
|
// finished without failures
|
|
if (match[2] && match[2] == '0') {
|
|
stopSauce(true);
|
|
|
|
// finished but some tests did not return or some tests failed
|
|
} else {
|
|
stopSauce(false);
|
|
}
|
|
} else {
|
|
// not finished yet
|
|
printLog(logIndex);
|
|
logIndex = knownConsoleText.length;
|
|
}
|
|
});
|
|
}, 5000);
|
|
|
|
/**
|
|
* Replaces color codes in the test runners log, appends
|
|
* browser name, platform etc. to every line and prints them.
|
|
*
|
|
* @param {number} index offset from where to start
|
|
*/
|
|
function printLog(index) {
|
|
let testResult = knownConsoleText.substring(index).replace(/\[red\]/g, '\x1B[31m').replace(/\[yellow\]/g, '\x1B[33m')
|
|
.replace(/\[green\]/g, '\x1B[32m').replace(/\[clear\]/g, '\x1B[39m');
|
|
testResult = testResult.split('\\n').map((line) => `[${testSettings.browserName} ${testSettings.platform}${testSettings.version === '' ? '' : (` ${testSettings.version}`)}] ${line}`).join('\n');
|
|
|
|
console.log(testResult);
|
|
}
|
|
});
|
|
}, 6); // run 6 tests in parrallel
|
|
|
|
// 1) Firefox on Linux
|
|
sauceTestWorker.push({
|
|
platform: 'Windows 7',
|
|
browserName: 'firefox',
|
|
version: '52.0',
|
|
});
|
|
|
|
// 2) Chrome on Linux
|
|
sauceTestWorker.push({
|
|
platform: 'Windows 7',
|
|
browserName: 'chrome',
|
|
version: '55.0',
|
|
args: ['--use-fake-device-for-media-stream'],
|
|
});
|
|
|
|
/*
|
|
// 3) Safari on OSX 10.15
|
|
sauceTestWorker.push({
|
|
'platform' : 'OS X 10.15'
|
|
, 'browserName' : 'safari'
|
|
, 'version' : '13.1'
|
|
});
|
|
*/
|
|
|
|
// 4) Safari on OSX 10.14
|
|
sauceTestWorker.push({
|
|
platform: 'OS X 10.15',
|
|
browserName: 'safari',
|
|
version: '13.1',
|
|
});
|
|
// IE 10 doesn't appear to be working anyway
|
|
/*
|
|
// 4) IE 10 on Win 8
|
|
sauceTestWorker.push({
|
|
'platform' : 'Windows 8'
|
|
, 'browserName' : 'iexplore'
|
|
, 'version' : '10.0'
|
|
});
|
|
*/
|
|
// 5) Edge on Win 10
|
|
sauceTestWorker.push({
|
|
platform: 'Windows 10',
|
|
browserName: 'microsoftedge',
|
|
version: '83.0',
|
|
});
|
|
// 6) Firefox on Win 7
|
|
sauceTestWorker.push({
|
|
platform: 'Windows 7',
|
|
browserName: 'firefox',
|
|
version: '78.0',
|
|
});
|
|
|
|
sauceTestWorker.drain(() => {
|
|
process.exit(allTestsPassed ? 0 : 1);
|
|
});
|