.forEach(function (browserName) { assert(Array.isArray(browsers[browserName]), JSON.stringify(browserName) + ' in ' + name + ' is not a valid browser name.'); var realVersions = browsers[browserName].map(selectVersion); versions[browserName] .forEach(function (version) { assert(realVersions.indexOf(version) !== -1, JSON.stringify(browserName) + ' in ' + name + ' does not have a version ' + JSON.stringify(version)); }); });
function run(config) { var browserName = config.browser; var version = config.version; var browsers = allBrowsers[browserName] .filter(function (browser) { return browser.version === version; }); var url = config.url; var name = config.name; var tags = config.tags || []; var user = config.sauce.user; var key = config.sauce.key; if (browsers.length === 0) { return Q.reject(new Error('There are no browsers called ' + JSON.stringify(browserName) + ' at version ' + JSON.stringify(version))); } var result = head(url) .spread(function (res) { if (res.statusCode === 200) return {passed: true}; else return {passed: false, report: { type: 'status-code', statusCode: res.statusCode}}; }) .then(function (res) { if (res.passed === false) return res; var def = Q.defer(); function next(i) { var browser = browsers[i]; debug('running ' + browser); var config = {user: user, key: key, browser: browser, url: url, name: name, tags: tags}; config.code = code; var start = null; var completedTests = -1; var warned = false; config.parse = function (res, id) { if (start == null) { start = new Date(); } else if (!res.f) { if (completedTests != res.c && typeof res.c === 'number') { completedTests = res.c; start = new Date(); warned = false; } else if (!res.f && start.getTime() + 1000 * 60 < Date.now()) { if (warned) { res = { f: true, p: false, r: { type: 'timeout' } }; } else { warned = true; } } } debug('res %s: %j', browser, res); if (!res.f) return null;//not finished yet return { sauceUser: user, sauceKey: key, sauceTestID: id, passed: res.p, report: res.r || null }; }; return sauce(config) .then(function (result) { if (result.passed === false || i + 1 === browsers.length) return def.resolve(result); else return next(i + 1); }) .done(null, def.reject); } next(0); return def.promise; }) .then(function (result) { if (result.sauceTestID) return Q(result); else return result; }); return result; //{passed, report, sauceTestID} }