UNPKG

3.31 kBJavaScriptView Raw
1"use strict";
2
3var extend = require("../lib/extend");
4
5var pollWorkerRetries = 30;
6var pollWorkerRetryInterval = 2000;
7
8var encoding = process.env.TRAVIS ? "base64" : "utf8";
9module.exports.browserStack = {
10 username: Buffer.from(process.env.BROWSERSTACK_USERNAME || "", encoding).toString(),
11 password: Buffer.from(process.env.BROWSERSTACK_KEY || "", encoding).toString()
12};
13
14module.exports.terminateWorkers = function terminateWorkers(client, workers, callback) {
15 if (!workers.length) {
16 return callback(null);
17 }
18
19 if (workers[0].id) {
20 workers = workers.map(function(w) {
21 return w.id;
22 });
23 }
24
25 client.terminateWorker(workers.shift(), function() {
26 if (!workers.length) {
27 return callback(null);
28 }
29
30 terminateWorkers(client, workers, callback);
31 });
32};
33
34module.exports.pollApiWorker = function pollApiWorker(client, worker, callback) {
35 pollWorker(worker,
36 client.getWorker.bind(client),
37 function getWorkerId(worker) {
38 return worker && worker.id;
39 },
40 function isWorkerRunning(worker) {
41 return worker && worker.status === "running";
42 }, callback);
43};
44
45module.exports.pollScreenshotWorker = function pollScreenshotWorker(client, worker, callback) {
46 pollWorker(worker,
47 client.getJob.bind(client),
48 function getWorkerId(worker) {
49 return worker && (worker.job_id || worker.id);
50 },
51 function isWorkerRunning(worker) {
52 return worker && worker.state === "running";
53 }, callback);
54};
55
56module.exports.validateBrowserObject = function validateBrowserObject(browser) {
57 [
58 "os",
59 "os_version",
60 "browser",
61 browser.device ? "device" : "browser_version"
62 ].forEach(function(attr) {
63 if (attr.match(/version/)) {
64 browser[attr].should.be.a.String().and.match(/\S+/);
65 } else {
66 browser[attr].should.be.a.String().and.match(/^[a-zA-Z]+/);
67 }
68 });
69
70 return browser;
71};
72
73module.exports.validateScreenshotJob = function validateScreenshotJob(job) {
74 job.should.be.an.Object().and.not.be.empty();
75 (job.job_id || job.id).should.match(/[a-zA-Z0-9]+/);
76
77 [
78 "quality",
79 "win_res",
80 "wait_time"
81 ].forEach(function(k) {
82 job.should.have.property(k);
83 });
84
85 job.screenshots
86 .map(this.validateBrowserObject)
87 .forEach(function(screenshotState) {
88 screenshotState.id.should.match(/[a-zA-Z0-9]+/);
89 ["processing", "pending", "queue", "running"].should.containEql(screenshotState.state);
90 });
91};
92
93module.exports.validateWorker = function validateWorker(w) {
94 w.should.be.an.Object();
95 w.id.should.match(/\d+/);
96 return w;
97};
98
99module.exports.merge = function merge(o, a) {
100 return extend(extend({}, o), a);
101};
102
103function pollWorker(worker, getWorkerStatusFn, getWorkerIdFn, isWorkerRunningFn, callback) {
104 var maxRetries = pollWorkerRetries;
105 var retryInterval = pollWorkerRetryInterval;
106 var workerId = getWorkerIdFn(worker);
107 var timer;
108
109 var pollWorkerState = function(id, callback) {
110 if (--maxRetries < 1) {
111 clearTimeout(timer);
112 return callback(null, false);
113 }
114
115 getWorkerStatusFn(workerId, function(err, worker) {
116 workerId = getWorkerIdFn(worker);
117
118 if (err || !workerId) {
119 clearTimeout(timer);
120 return callback(err, false);
121 }
122
123 if (isWorkerRunningFn(worker)) {
124 return callback(null, true);
125 }
126
127 setTimeout(function() {
128 pollWorkerState(id, callback);
129 }, retryInterval);
130 });
131 };
132
133 pollWorkerState(workerId, callback);
134}