1 | const Promise = require('bluebird');
|
2 | const utils = require('../utils');
|
3 | const gridService = require('../services/gridService');
|
4 | const logger = require('../commons/logger').getLogger("worker-utils");
|
5 | const {timeoutMessages} = require('../commons/constants');
|
6 | const {GetBrowserError} = require('../errors');
|
7 |
|
8 | const waitUntilBrowserTimeout = (err, startTime, interval, projectId, workerId, player, releaseSlotOnTestFinished) => {
|
9 | logger.warn('failed getting browser from grid', { err });
|
10 | return releasePlayer(workerId, releaseSlotOnTestFinished, projectId, player)
|
11 | .then(() => {
|
12 | const requestTime = Date.now() - startTime;
|
13 | const timeDiff = interval - requestTime;
|
14 | return Promise.delay(timeDiff).then(() => Promise.reject(err));
|
15 | });
|
16 |
|
17 | };
|
18 |
|
19 | const releaseGridSlot = (workerId, releaseSlotOnTestFinished, projectId) => {
|
20 | if (!releaseSlotOnTestFinished) {
|
21 | return Promise.resolve();
|
22 | }
|
23 | return gridService.releaseGridSlot(workerId, projectId);
|
24 | };
|
25 |
|
26 | const releasePlayer = (workerId, releaseSlotOnTestFinished, projectId, player) => {
|
27 | logger.info('releasing player', { hasPlayer: Boolean(player) });
|
28 | return (player ? player.onDone() : Promise.resolve())
|
29 | .finally(() => releaseGridSlot(workerId, releaseSlotOnTestFinished, projectId));
|
30 | };
|
31 |
|
32 | module.exports.releasePlayer = releasePlayer;
|
33 |
|
34 | module.exports.getBrowserWithRetries = ({ getBrowserOnce, testPlayerFactory, releaseSlotOnTestFinished }, {totalTimeoutDuration, singleGetBrowserDuration , projectId, workerId, reporter}) => {
|
35 | const maxGetBrowserAttempts = totalTimeoutDuration / singleGetBrowserDuration;
|
36 | let failedAttempts = 0;
|
37 |
|
38 | return utils.runWithRetries(() => {
|
39 | const startTime = Date.now();
|
40 | const player = testPlayerFactory();
|
41 | return getBrowserOnce(player)
|
42 | .then((getBrowserRes) => player || getBrowserRes)
|
43 | .timeout(singleGetBrowserDuration, timeoutMessages.GET_BROWSER_TIMEOUT_MSG)
|
44 | .tapCatch(() => reporter.onGetBrowserFailure(workerId, projectId, ++failedAttempts))
|
45 | .tap(() => reporter.onGetBrowserSuccess(workerId, projectId))
|
46 | .catch(err => waitUntilBrowserTimeout(err, startTime, singleGetBrowserDuration, projectId, workerId, player, releaseSlotOnTestFinished));
|
47 | }, maxGetBrowserAttempts).catch(err => { throw new GetBrowserError(err); });
|
48 | };
|
49 |
|
50 | module.exports.isGetBrowserError = err => err && err.constructor && err.constructor.name === 'GetBrowserError';
|