Cleanup saucelabs.js round two.

This commit is contained in:
John-David Dalton
2013-10-31 00:02:47 -07:00
parent 8f23611f1a
commit 87297d2a07

View File

@@ -1,124 +1,127 @@
var connect = require('connect'), ;(function() {
path = require('path'), 'use strict';
request = require('request'),
SauceTunnel = require('sauce-tunnel');
var port = 8081, var connect = require('connect'),
username = process.env.SAUCE_USERNAME, path = require('path'),
accessKey = process.env.SAUCE_ACCESS_KEY; request = require('request'),
console.log(process.env) SauceTunnel = require('sauce-tunnel');
var platforms = [
['Windows 7', 'chrome', ''],
['Windows 7', 'firefox', '24'],
['Windows 7', 'firefox', '20'],
['Windows 7', 'firefox', '10'],
['Windows 7', 'firefox', '6'],
['Windows 7', 'firefox', '4'],
['Windows 7', 'firefox', '3'],
['Windows 7', 'internet explorer', '10'],
['Windows 7', 'internet explorer', '9'],
['Windows 7', 'internet explorer', '8'],
['Windows XP', 'internet explorer', '7'],
['Windows XP', 'internet explorer', '6'],
['OS X 10.8', 'safari', '6'],
['Windows 7', 'safari', '5']
];
// create a web server for the local dir var port = 8081,
var server = connect.createServer( username = process.env.SAUCE_USERNAME,
connect.static(path.resolve(__dirname, '..')) accessKey = process.env.SAUCE_ACCESS_KEY;
).listen(port);
// set up sauce connect so we can use this server from saucelabs var platforms = [
var tunnelTimeout = 10000, ['Windows 7', 'chrome', ''],
tunnel = new SauceTunnel(username, accessKey, null, true, tunnelTimeout); ['Windows 7', 'firefox', '25'],
['Windows 7', 'firefox', '20'],
['Windows 7', 'firefox', '10'],
['Windows 7', 'firefox', '6'],
['Windows 7', 'firefox', '4'],
['Windows 7', 'firefox', '3'],
['Windows 7', 'internet explorer', '10'],
['Windows 7', 'internet explorer', '9'],
['Windows 7', 'internet explorer', '8'],
['Windows XP', 'internet explorer', '7'],
['Windows XP', 'internet explorer', '6'],
['OS X 10.8', 'safari', '6'],
['Windows 7', 'safari', '5']
];
console.log('Opening sauce connect tunnel...'); // create a web server for the local dir
var server = connect.createServer(
connect.static(path.resolve(__dirname, '..'))
).listen(port);
tunnel.start(function(success) { // set up sauce connect so we can use this server from saucelabs
if (success) { var tunnelTimeout = 10000,
console.log('Sauce connect tunnel opened'); tunnel = new SauceTunnel(username, accessKey, null, true, tunnelTimeout);
runTests();
} else {
console.error('Failed to open sauce connect tunnel')
process.exit(2);
}
});
function runTests() { console.log('Opening sauce connect tunnel...');
var testDefinition = {
'framework': 'qunit',
'platforms': platforms,
'url': 'http://localhost:' + port + '/test/index.html'
};
console.log('Starting saucelabs tests: ' + JSON.stringify(testDefinition)); tunnel.start(function(success) {
if (success) {
request.post('https://saucelabs.com/rest/v1/' + username + '/js-tests', { console.log('Sauce connect tunnel opened');
'auth': { 'user': username, 'pass': accessKey }, runTests();
'json': testDefinition
}, function(error, response, body) {
if (response.statusCode == 200) {
var testIdentifier = body;
waitForTestCompletion(testIdentifier);
} else { } else {
console.error('Failed to submit test to SauceLabs, status ' + response.statusCode + ', body:\n' + JSON.stringify(body)); console.error('Failed to open sauce connect tunnel')
process.exit(3); process.exit(2);
} }
}); });
}
function waitForTestCompletion(testIdentifier) { function runTests() {
request.post('https://saucelabs.com/rest/v1/' + username + '/js-tests/status', { var testDefinition = {
'auth': { 'user': username, 'pass': accessKey }, 'framework': 'qunit',
'json': testIdentifier 'platforms': platforms,
}, function(error, response, body) { 'url': 'http://localhost:' + port + '/test/index.html'
};
console.log('Starting saucelabs tests: ' + JSON.stringify(testDefinition));
request.post('https://saucelabs.com/rest/v1/' + username + '/js-tests', {
'auth': { 'user': username, 'pass': accessKey },
'json': testDefinition
}, function(error, response, body) {
if (response.statusCode == 200) { if (response.statusCode == 200) {
if (body.completed) { var testIdentifier = body;
handleTestResults(body['js tests']); waitForTestCompletion(testIdentifier);
} else {
console.error('Failed to submit test to SauceLabs, status ' + response.statusCode + ', body:\n' + JSON.stringify(body));
process.exit(3);
}
});
}
function waitForTestCompletion(testIdentifier) {
request.post('https://saucelabs.com/rest/v1/' + username + '/js-tests/status', {
'auth': { 'user': username, 'pass': accessKey },
'json': testIdentifier
}, function(error, response, body) {
if (response.statusCode == 200) {
if (body.completed) {
handleTestResults(body['js tests']);
} else {
waitForTestCompletion(testIdentifier);
}
} else { } else {
waitForTestCompletion(testIdentifier); console.error('Failed to check test status on SauceLabs, status ' + response.statusCode + ', body:\n' + JSON.stringify(body));
process.exit(4);
} }
} else {
console.error('Failed to check test status on SauceLabs, status ' + response.statusCode + ', body:\n' + JSON.stringify(body));
process.exit(4);
}
});
}
function handleTestResults(results) {
var allTestsSuccessful = results.reduce(function(passedSoFar, test) {
return passedSoFar && test.result.failed === 0;
}, true);
if (allTestsSuccessful) {
console.log('Tests passed');
}
else {
var failingTests = results.filter(function(test) {
return test.result.failed !== 0;
});
var failingPlatforms = failingTests.map(function(test) {
return test.platform;
});
console.error('Tests failed on platforms: ' + JSON.stringify(failingPlatforms));
failingTests.forEach(function(test) {
var platform = JSON.stringify(test.platform);
if (test.result.failed) {
console.error(test.result.failed + ' failures on ' + platform + '. See ' + test.url + ' for details.');
} else {
console.error('Testing on ' + platform + ' failed; no results available. See ' + test.url + ' for details.');
}
}); });
} }
console.log('Shutting down sauce connect tunnel...'); function handleTestResults(results) {
var allTestsSuccessful = results.every(function(test) {
return !test.result.failed;
});
tunnel.stop(function() { if (allTestsSuccessful) {
process.exit(allTestsSuccessful ? 0 : 1); console.log('Tests passed');
}) }
} else {
var failingTests = results.filter(function(test) {
return test.result.failed;
});
var failingPlatforms = failingTests.map(function(test) {
return test.platform;
});
console.error('Tests failed on platforms: ' + JSON.stringify(failingPlatforms));
failingTests.forEach(function(test) {
var platform = JSON.stringify(test.platform);
if (test.result.failed) {
console.error(test.result.failed + ' failures on ' + platform + '. See ' + test.url + ' for details.');
} else {
console.error('Testing on ' + platform + ' failed; no results available. See ' + test.url + ' for details.');
}
});
}
console.log('Shutting down sauce connect tunnel...');
tunnel.stop(function() {
process.exit(allTestsSuccessful ? 0 : 1);
});
}
}());