135 lines
3.2 KiB
JavaScript
135 lines
3.2 KiB
JavaScript
"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);
|
|
}
|