123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- "use strict";
- var extend = require("../lib/extend");
- var pollWorkerRetries = 30;
- var pollWorkerRetryInterval = 2000;
- var encoding = process.env.TRAVIS ? "base64" : "utf8";
- module.exports.browserStack = {
- username: Buffer.from(process.env.BROWSERSTACK_USERNAME || "", encoding).toString(),
- password: Buffer.from(process.env.BROWSERSTACK_KEY || "", encoding).toString()
- };
- module.exports.terminateWorkers = function terminateWorkers(client, workers, callback) {
- if (!workers.length) {
- return callback(null);
- }
- if (workers[0].id) {
- workers = workers.map(function(w) {
- return w.id;
- });
- }
- client.terminateWorker(workers.shift(), function() {
- if (!workers.length) {
- return callback(null);
- }
- terminateWorkers(client, workers, callback);
- });
- };
- module.exports.pollApiWorker = function pollApiWorker(client, worker, callback) {
- pollWorker(worker,
- client.getWorker.bind(client),
- function getWorkerId(worker) {
- return worker && worker.id;
- },
- function isWorkerRunning(worker) {
- return worker && worker.status === "running";
- }, callback);
- };
- module.exports.pollScreenshotWorker = function pollScreenshotWorker(client, worker, callback) {
- pollWorker(worker,
- client.getJob.bind(client),
- function getWorkerId(worker) {
- return worker && (worker.job_id || worker.id);
- },
- function isWorkerRunning(worker) {
- return worker && worker.state === "running";
- }, callback);
- };
- module.exports.validateBrowserObject = function validateBrowserObject(browser) {
- [
- "os",
- "os_version",
- "browser",
- browser.device ? "device" : "browser_version"
- ].forEach(function(attr) {
- if (attr.match(/version/)) {
- browser[attr].should.be.a.String().and.match(/\S+/);
- } else {
- browser[attr].should.be.a.String().and.match(/^[a-zA-Z]+/);
- }
- });
- return browser;
- };
- module.exports.validateScreenshotJob = function validateScreenshotJob(job) {
- job.should.be.an.Object().and.not.be.empty();
- (job.job_id || job.id).should.match(/[a-zA-Z0-9]+/);
- [
- "quality",
- "win_res",
- "wait_time"
- ].forEach(function(k) {
- job.should.have.property(k);
- });
- job.screenshots
- .map(this.validateBrowserObject)
- .forEach(function(screenshotState) {
- screenshotState.id.should.match(/[a-zA-Z0-9]+/);
- ["processing", "pending", "queue", "running"].should.containEql(screenshotState.state);
- });
- };
- module.exports.validateWorker = function validateWorker(w) {
- w.should.be.an.Object();
- w.id.should.match(/\d+/);
- return w;
- };
- module.exports.merge = function merge(o, a) {
- return extend(extend({}, o), a);
- };
- function pollWorker(worker, getWorkerStatusFn, getWorkerIdFn, isWorkerRunningFn, callback) {
- var maxRetries = pollWorkerRetries;
- var retryInterval = pollWorkerRetryInterval;
- var workerId = getWorkerIdFn(worker);
- var timer;
- var pollWorkerState = function(id, callback) {
- if (--maxRetries < 1) {
- clearTimeout(timer);
- return callback(null, false);
- }
- getWorkerStatusFn(workerId, function(err, worker) {
- workerId = getWorkerIdFn(worker);
- if (err || !workerId) {
- clearTimeout(timer);
- return callback(err, false);
- }
- if (isWorkerRunningFn(worker)) {
- return callback(null, true);
- }
- setTimeout(function() {
- pollWorkerState(id, callback);
- }, retryInterval);
- });
- };
- pollWorkerState(workerId, callback);
- }
|