lix-website/themes/lix/assets/bootstrap/node_modules/browserstack/test/util.js
2024-04-26 22:49:34 -06:00

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);
}