1 | "use strict";
|
2 |
|
3 | var extend = require("../lib/extend");
|
4 |
|
5 | var pollWorkerRetries = 30;
|
6 | var pollWorkerRetryInterval = 2000;
|
7 |
|
8 | var encoding = process.env.TRAVIS ? "base64" : "utf8";
|
9 | module.exports.browserStack = {
|
10 | username: Buffer.from(process.env.BROWSERSTACK_USERNAME || "", encoding).toString(),
|
11 | password: Buffer.from(process.env.BROWSERSTACK_KEY || "", encoding).toString()
|
12 | };
|
13 |
|
14 | module.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 |
|
34 | module.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 |
|
45 | module.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 |
|
56 | module.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 |
|
73 | module.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 |
|
93 | module.exports.validateWorker = function validateWorker(w) {
|
94 | w.should.be.an.Object();
|
95 | w.id.should.match(/\d+/);
|
96 | return w;
|
97 | };
|
98 |
|
99 | module.exports.merge = function merge(o, a) {
|
100 | return extend(extend({}, o), a);
|
101 | };
|
102 |
|
103 | function 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 | }
|