creevey 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/creevey.js +8 -4
- package/dist/creevey.js.map +1 -1
- package/dist/server/config.js +1 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/docker.js +1 -1
- package/dist/server/docker.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/logger.d.ts +2 -1
- package/dist/server/logger.js +7 -3
- package/dist/server/logger.js.map +1 -1
- package/dist/server/master/api.js +1 -1
- package/dist/server/master/api.js.map +1 -1
- package/dist/server/master/index.js +4 -4
- package/dist/server/master/index.js.map +1 -1
- package/dist/server/master/pool.d.ts +3 -3
- package/dist/server/master/pool.js +13 -64
- package/dist/server/master/pool.js.map +1 -1
- package/dist/server/master/queue.d.ts +13 -0
- package/dist/server/master/queue.js +60 -0
- package/dist/server/master/queue.js.map +1 -0
- package/dist/server/master/runner.d.ts +1 -0
- package/dist/server/master/runner.js +6 -1
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.js +1 -1
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/selenium/browser.js +116 -90
- package/dist/server/selenium/browser.js.map +1 -1
- package/dist/server/storybook/providers/browser.js +1 -1
- package/dist/server/storybook/providers/browser.js.map +1 -1
- package/dist/server/storybook/providers/hybrid.js +1 -1
- package/dist/server/storybook/providers/hybrid.js.map +1 -1
- package/dist/server/utils.d.ts +2 -1
- package/dist/server/utils.js +11 -0
- package/dist/server/utils.js.map +1 -1
- package/dist/server/worker/reporter.js +2 -2
- package/dist/server/worker/reporter.js.map +1 -1
- package/dist/server/worker/worker.js +22 -15
- package/dist/server/worker/worker.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/creevey.ts +8 -5
- package/src/server/config.ts +1 -0
- package/src/server/docker.ts +1 -1
- package/src/server/index.ts +2 -2
- package/src/server/logger.ts +6 -2
- package/src/server/master/api.ts +1 -1
- package/src/server/master/index.ts +7 -4
- package/src/server/master/pool.ts +20 -49
- package/src/server/master/queue.ts +59 -0
- package/src/server/master/runner.ts +6 -1
- package/src/server/master/server.ts +1 -1
- package/src/server/selenium/browser.ts +129 -97
- package/src/server/storybook/providers/browser.ts +1 -1
- package/src/server/storybook/providers/hybrid.ts +1 -1
- package/src/server/utils.ts +12 -1
- package/src/server/worker/reporter.ts +2 -2
- package/src/server/worker/worker.ts +21 -15
- package/src/types.ts +6 -0
package/dist/server/utils.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":";;;;;;AA+BA,gCAiBC;AAED,gDA0BC;AAED,0CAqBC;AAED,4BAEC;AAED,0CAEC;AAED,kCAIC;AAED,sCAeC;AAsCD,4CAQC;AAGD,gDAMC;AAGD,wCAiBC;
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"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"}
|
@@ -19,10 +19,10 @@ class CreeveyReporter extends mocha_1.reporters.Base {
|
|
19
19
|
constructor(runner, options) {
|
20
20
|
super(runner);
|
21
21
|
const { sessionId, topLevelSuite } = options.reporterOptions;
|
22
|
-
const testLogger = loglevel_1.default.getLogger(
|
22
|
+
const testLogger = loglevel_1.default.getLogger(sessionId);
|
23
23
|
loglevel_plugin_prefix_1.default.apply(testLogger, {
|
24
24
|
format(level) {
|
25
|
-
return
|
25
|
+
return `[${topLevelSuite}:${chalk_1.default.gray(process.pid)}] ${testLevels[level]} => ${chalk_1.default.gray(sessionId)}`;
|
26
26
|
},
|
27
27
|
});
|
28
28
|
runner.on('test', (test) => {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/server/worker/reporter.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,wDAA8B;AAC9B,oFAA4C;AAC5C,iCAAwD;AACxD,6CAAiE;AAUjE,MAAM,UAAU,GAA2B;IACzC,IAAI,EAAE,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACzB,IAAI,EAAE,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC;IAC3B,KAAK,EAAE,eAAK,CAAC,GAAG,CAAC,MAAM,CAAC;CACzB,CAAC;AAEF,MAAa,eAAgB,SAAQ,iBAAS,CAAC,IAAI;IACjD,gDAAgD;IAChD,YAAY,MAAc,EAAE,OAAqB;QAC/C,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,eAAkC,CAAC;QAChF,MAAM,UAAU,GAAG,kBAAM,CAAC,SAAS,CAAC,
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/server/worker/reporter.ts"],"names":[],"mappings":"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"}
|
@@ -123,7 +123,21 @@ async function start(config, options) {
|
|
123
123
|
const mocha = new mocha_1.default(mochaOptions);
|
124
124
|
mocha.cleanReferencesAfterRun(false);
|
125
125
|
chai_1.default.use((0, chai_image_js_1.default)(getExpected, config.diffOptions));
|
126
|
-
|
126
|
+
const browser = await (async () => {
|
127
|
+
try {
|
128
|
+
return await (0, index_js_1.getBrowser)(config, options);
|
129
|
+
}
|
130
|
+
catch (error) {
|
131
|
+
const errorMessage = error instanceof Error ? error.message : (error ?? 'Unknown error');
|
132
|
+
(0, logger_js_1.logger)().error('Failed to initiate webdriver:', errorMessage);
|
133
|
+
(0, messages_js_1.emitWorkerMessage)({
|
134
|
+
type: 'error',
|
135
|
+
payload: { error: errorMessage },
|
136
|
+
});
|
137
|
+
return null;
|
138
|
+
}
|
139
|
+
})();
|
140
|
+
if (browser == null)
|
127
141
|
return;
|
128
142
|
await (0, helpers_js_1.addTestsFromStories)(mocha.suite, config, {
|
129
143
|
browser: options.browser,
|
@@ -131,18 +145,11 @@ async function start(config, options) {
|
|
131
145
|
debug: options.debug,
|
132
146
|
port: options.port,
|
133
147
|
});
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
}
|
140
|
-
const browser = await (0, index_js_1.getBrowser)(config, options);
|
141
|
-
const sessionId = (await browser?.getSession())?.getId();
|
142
|
-
if (browser == null)
|
143
|
-
return;
|
144
|
-
const interval = setInterval(() => void browser.getCurrentUrl().then((url) => {
|
145
|
-
logger_js_1.logger.debug(`${options.browser}:${chalk_1.default.gray(sessionId)}`, 'current url', chalk_1.default.magenta(url));
|
148
|
+
const sessionId = (await browser.getSession()).getId();
|
149
|
+
const interval = setInterval(() =>
|
150
|
+
// NOTE Simple way to keep session alive
|
151
|
+
void browser.getCurrentUrl().then((url) => {
|
152
|
+
(0, logger_js_1.logger)().debug('current url', chalk_1.default.magenta(url));
|
146
153
|
}), 10 * 1000);
|
147
154
|
(0, messages_js_1.subscribeOn)('shutdown', () => {
|
148
155
|
clearInterval(interval);
|
@@ -166,7 +173,7 @@ async function start(config, options) {
|
|
166
173
|
const logs = await browser.manage().logs().get(type);
|
167
174
|
output.push(logs.map((log) => JSON.stringify(log.toJSON(), null, 2)).join('\n'));
|
168
175
|
}
|
169
|
-
logger_js_1.logger.debug('----------',
|
176
|
+
(0, logger_js_1.logger)().debug('----------', this.currentTest?.titlePath().join('/'), '----------\n', output.join('\n'), '\n----------------------------------------------------------------------------------------------------');
|
170
177
|
});
|
171
178
|
}
|
172
179
|
(0, messages_js_1.subscribeOn)('test', (message) => {
|
@@ -203,7 +210,7 @@ async function start(config, options) {
|
|
203
210
|
}
|
204
211
|
});
|
205
212
|
});
|
206
|
-
logger_js_1.logger.info(
|
213
|
+
(0, logger_js_1.logger)().info('Worker is ready');
|
207
214
|
(0, messages_js_1.emitWorkerMessage)({ type: 'ready' });
|
208
215
|
}
|
209
216
|
function hasTimeout(str) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/server/worker/worker.ts"],"names":[],"mappings":";;;;;AA4CA,
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/server/worker/worker.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
@@ -215,6 +215,11 @@ export interface Config {
|
|
215
215
|
* The `--ui` CLI option ignores this option
|
216
216
|
*/
|
217
217
|
failFast: boolean;
|
218
|
+
/**
|
219
|
+
* Start workers in sequential queue
|
220
|
+
* @default false
|
221
|
+
*/
|
222
|
+
useWorkerQueue: boolean;
|
218
223
|
/**
|
219
224
|
* Specify platform for docker images
|
220
225
|
*/
|
@@ -331,6 +336,7 @@ export type DockerHandler = (message: DockerMessage) => void;
|
|
331
336
|
export type ShutdownHandler = (message: ShutdownMessage) => void;
|
332
337
|
export interface Worker extends ClusterWorker {
|
333
338
|
isRunning?: boolean;
|
339
|
+
isShuttingDown?: boolean;
|
334
340
|
}
|
335
341
|
export interface Images {
|
336
342
|
actual: string;
|
package/dist/types.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;AAgcA,oBAEC;AAED,8BAEC;AAED,wBASC;AAED,4BAEC;AAED,4BAEC;AAGD,gCAEC;AAED,oCAEC;AAED,4CAEC;AAED,0CAEC;AAED,4CAEC;AAED,sCAEC;AAED,4CAEC;AAED,0CAEC;AA1DD,SAAgB,IAAI;IAClB,UAAU;AACZ,CAAC;AAED,SAAgB,SAAS,CAAI,KAA2B;IACtD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC;AAED,SAAgB,MAAM,CAAC,CAA8B;IACnD,OAAO,CACL,SAAS,CAAC,CAAC,CAAC;QACZ,QAAQ,CAAC,CAAC,CAAC;QACX,IAAI,IAAI,CAAC;QACT,SAAS,IAAI,CAAC;QACd,OAAO,CAAC,CAAC,EAAE,IAAI,QAAQ;QACvB,OAAO,CAAC,CAAC,OAAO,IAAI,QAAQ,CAC7B,CAAC;AACJ,CAAC;AAED,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,IAAI,QAAQ,CAAC;AAC9B,CAAC;AAED,8DAA8D;AAC9D,SAAgB,UAAU,CAAC,CAAU;IACnC,OAAO,OAAO,CAAC,IAAI,UAAU,CAAC;AAChC,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;AACrD,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC;AACjD,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;AAChE,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;AACjE,CAAC;AAED,SAAgB,aAAa,CAAC,OAAgB;IAC5C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;AAC9D,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;AACjE,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;AAChE,CAAC"}
|
package/package.json
CHANGED
package/src/creevey.ts
CHANGED
@@ -5,14 +5,14 @@ import { noop, Options } from './types.js';
|
|
5
5
|
import { emitWorkerMessage } from './server/messages.js';
|
6
6
|
import { isShuttingDown, shutdown, shutdownWorkers } from './server/utils.js';
|
7
7
|
import Logger from 'loglevel';
|
8
|
-
import { logger } from './server/logger.js';
|
8
|
+
import { logger, setRootName } from './server/logger.js';
|
9
9
|
|
10
10
|
function shutdownOnException(reason: unknown): void {
|
11
11
|
if (isShuttingDown.current) return;
|
12
12
|
|
13
13
|
const error = reason instanceof Error ? (reason.stack ?? reason.message) : (reason as string);
|
14
14
|
|
15
|
-
logger.error(error);
|
15
|
+
logger().error(error);
|
16
16
|
|
17
17
|
process.exitCode = -1;
|
18
18
|
if (cluster.isWorker) emitWorkerMessage({ type: 'error', payload: { error } });
|
@@ -31,16 +31,19 @@ const argv = minimist<Options>(process.argv.slice(2), {
|
|
31
31
|
alias: { port: 'p', config: 'c', debug: 'd', update: 'u' },
|
32
32
|
});
|
33
33
|
|
34
|
+
if ('port' in argv && !isNaN(argv.port)) argv.port = Number(argv.port);
|
35
|
+
if ('browser' in argv && argv.browser) setRootName(argv.browser);
|
36
|
+
|
34
37
|
// @ts-expect-error: define log level for storybook
|
35
38
|
global.LOGLEVEL = argv.trace ? 'trace' : argv.debug ? 'debug' : 'warn';
|
36
39
|
if (argv.trace) {
|
37
|
-
logger.setDefaultLevel(Logger.levels.TRACE);
|
40
|
+
logger().setDefaultLevel(Logger.levels.TRACE);
|
38
41
|
Logger.setDefaultLevel(Logger.levels.TRACE);
|
39
42
|
} else if (argv.debug) {
|
40
|
-
logger.setDefaultLevel(Logger.levels.DEBUG);
|
43
|
+
logger().setDefaultLevel(Logger.levels.DEBUG);
|
41
44
|
Logger.setDefaultLevel(Logger.levels.DEBUG);
|
42
45
|
} else {
|
43
|
-
logger.setDefaultLevel(Logger.levels.INFO);
|
46
|
+
logger().setDefaultLevel(Logger.levels.INFO);
|
44
47
|
Logger.setDefaultLevel(Logger.levels.INFO);
|
45
48
|
}
|
46
49
|
|
package/src/server/config.ts
CHANGED
@@ -9,6 +9,7 @@ export const defaultBrowser = 'chrome';
|
|
9
9
|
|
10
10
|
export const defaultConfig: Omit<Config, 'gridUrl' | 'storiesProvider' | 'testsDir' | 'tsConfig'> = {
|
11
11
|
disableTelemetry: false,
|
12
|
+
useWorkerQueue: false,
|
12
13
|
useDocker: true,
|
13
14
|
dockerImage: 'aerokube/selenoid:latest-release',
|
14
15
|
dockerImagePlatform: '',
|
package/src/server/docker.ts
CHANGED
@@ -23,7 +23,7 @@ export async function pullImages(
|
|
23
23
|
if (auth) args.authconfig = auth;
|
24
24
|
if (platform) args.platform = platform;
|
25
25
|
|
26
|
-
logger.info('Pull docker images');
|
26
|
+
logger().info('Pull docker images');
|
27
27
|
for (const image of images) {
|
28
28
|
await new Promise<void>((resolve, reject) => {
|
29
29
|
const spinner = ora(`${image}: Pull start`).start();
|
package/src/server/index.ts
CHANGED
@@ -33,14 +33,14 @@ export default async function (options: Options): Promise<void> {
|
|
33
33
|
return;
|
34
34
|
}
|
35
35
|
case cluster.isPrimary: {
|
36
|
-
logger.info('Starting Master Process');
|
36
|
+
logger().info('Starting Master Process');
|
37
37
|
|
38
38
|
const resolveApi = (await import('./master/server.js')).start(config.reportDir, port, ui);
|
39
39
|
|
40
40
|
return (await import('./master/index.js')).start(config, options, resolveApi);
|
41
41
|
}
|
42
42
|
default: {
|
43
|
-
logger.info(`Starting Worker for ${browser}`);
|
43
|
+
logger().info(`Starting Worker for ${browser}`);
|
44
44
|
|
45
45
|
return (await import('./worker/index.js')).start(config, {
|
46
46
|
...options,
|
package/src/server/logger.ts
CHANGED
@@ -10,12 +10,16 @@ export const colors = {
|
|
10
10
|
ERROR: chalk.red,
|
11
11
|
};
|
12
12
|
|
13
|
+
let rootName = 'Creevey';
|
14
|
+
|
13
15
|
prefix.reg(Logger);
|
14
16
|
prefix.apply(Logger, {
|
15
|
-
format(level, name =
|
17
|
+
format(level, name = rootName) {
|
16
18
|
const levelColor = colors[level.toUpperCase() as keyof typeof colors];
|
17
19
|
return `[${name}:${chalk.gray(process.pid)}] ${levelColor(level)} =>`;
|
18
20
|
},
|
19
21
|
});
|
20
22
|
|
21
|
-
export const
|
23
|
+
export const setRootName = (newName: string) => (rootName = newName);
|
24
|
+
|
25
|
+
export const logger = () => Logger.getLogger(rootName);
|
package/src/server/master/api.ts
CHANGED
@@ -26,7 +26,7 @@ export default function creeveyApi(runner: Runner): CreeveyApi {
|
|
26
26
|
|
27
27
|
handleMessage(ws: WebSocket, message: WebSocket.Data) {
|
28
28
|
if (typeof message != 'string') {
|
29
|
-
logger.info('unhandled message', message);
|
29
|
+
logger().info('unhandled message', message);
|
30
30
|
return;
|
31
31
|
}
|
32
32
|
|
@@ -42,7 +42,10 @@ function outputUnnecessaryImages(imagesDir: string, images: Set<string>): void {
|
|
42
42
|
.map((imagePath) => path.posix.relative(imagesDir, imagePath))
|
43
43
|
.filter((imagePath) => !images.has(imagePath));
|
44
44
|
if (unnecessaryImages.length > 0) {
|
45
|
-
logger.warn(
|
45
|
+
logger().warn(
|
46
|
+
'We found unnecessary screenshot images, those can be safely removed:\n',
|
47
|
+
unnecessaryImages.join('\n'),
|
48
|
+
);
|
46
49
|
}
|
47
50
|
}
|
48
51
|
|
@@ -79,10 +82,10 @@ export async function start(config: Config, options: Options, resolveApi: (api:
|
|
79
82
|
|
80
83
|
if (options.ui) {
|
81
84
|
resolveApi(creeveyApi(runner));
|
82
|
-
logger.info(`Started on http://localhost:${options.port}`);
|
85
|
+
logger().info(`Started on http://localhost:${options.port}`);
|
83
86
|
} else {
|
84
87
|
if (Object.values(runner.status.tests).filter((test) => test && !test.skip).length == 0) {
|
85
|
-
logger.warn("Don't have any tests to run");
|
88
|
+
logger().warn("Don't have any tests to run");
|
86
89
|
|
87
90
|
void shutdownWorkers().then(() => process.exit());
|
88
91
|
return;
|
@@ -99,7 +102,7 @@ export async function start(config: Config, options: Options, resolveApi: (api:
|
|
99
102
|
void sendScreenshotsCount(config, options, runner.status)
|
100
103
|
.catch((reason: unknown) => {
|
101
104
|
const error = reason instanceof Error ? (reason.stack ?? reason.message) : (reason as string);
|
102
|
-
logger.warn(`Can't send telemetry: ${error}`);
|
105
|
+
logger().warn(`Can't send telemetry: ${error}`);
|
103
106
|
})
|
104
107
|
.finally(() => {
|
105
108
|
void shutdownWorkers().then(() => process.exit());
|
@@ -1,10 +1,9 @@
|
|
1
|
-
import
|
1
|
+
import { Worker as ClusterWorker } from 'cluster';
|
2
2
|
import { EventEmitter } from 'events';
|
3
|
-
import { Worker, Config, TestResult, BrowserConfig,
|
4
|
-
import { sendTestMessage,
|
5
|
-
import { isShuttingDown } from '../utils.js';
|
6
|
-
|
7
|
-
const FORK_RETRIES = 5;
|
3
|
+
import { Worker, Config, TestResult, BrowserConfig, TestStatus } from '../../types.js';
|
4
|
+
import { sendTestMessage, subscribeOnWorker } from '../messages.js';
|
5
|
+
import { gracefullyKill, isShuttingDown } from '../utils.js';
|
6
|
+
import { WorkerQueue } from './queue.js';
|
8
7
|
|
9
8
|
interface WorkerTest {
|
10
9
|
id: string;
|
@@ -23,6 +22,7 @@ export default class Pool extends EventEmitter {
|
|
23
22
|
return this.workers.length !== this.freeWorkers.length;
|
24
23
|
}
|
25
24
|
constructor(
|
25
|
+
public scheduler: WorkerQueue,
|
26
26
|
config: Config,
|
27
27
|
private browser: string,
|
28
28
|
) {
|
@@ -35,10 +35,9 @@ export default class Pool extends EventEmitter {
|
|
35
35
|
|
36
36
|
async init(): Promise<void> {
|
37
37
|
const poolSize = Math.max(1, this.config.limit ?? 1);
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
);
|
38
|
+
this.workers = (
|
39
|
+
await Promise.all(Array.from({ length: poolSize }).map(() => this.scheduler.forkWorker(this.browser)))
|
40
|
+
).filter((workerOrError): workerOrError is Worker => workerOrError instanceof ClusterWorker);
|
42
41
|
if (this.workers.length != poolSize)
|
43
42
|
throw new Error(`Can't instantiate workers for ${this.browser} due many errors`);
|
44
43
|
this.workers.forEach((worker) => {
|
@@ -55,7 +54,7 @@ export default class Pool extends EventEmitter {
|
|
55
54
|
return true;
|
56
55
|
}
|
57
56
|
|
58
|
-
stop()
|
57
|
+
stop() {
|
59
58
|
if (!this.isRunning) {
|
60
59
|
this.emit('stop');
|
61
60
|
return;
|
@@ -65,7 +64,7 @@ export default class Pool extends EventEmitter {
|
|
65
64
|
this.queue = [];
|
66
65
|
}
|
67
66
|
|
68
|
-
process()
|
67
|
+
process() {
|
69
68
|
const worker = this.getFreeWorker();
|
70
69
|
const test = this.queue.at(0);
|
71
70
|
|
@@ -88,7 +87,9 @@ export default class Pool extends EventEmitter {
|
|
88
87
|
|
89
88
|
sendTestMessage(worker, { type: 'start', payload: test });
|
90
89
|
|
91
|
-
|
90
|
+
setImmediate(() => {
|
91
|
+
this.process();
|
92
|
+
});
|
92
93
|
}
|
93
94
|
|
94
95
|
private sendStatus(message: { id: string; status: TestStatus; result?: TestResult }): void {
|
@@ -96,45 +97,25 @@ export default class Pool extends EventEmitter {
|
|
96
97
|
}
|
97
98
|
|
98
99
|
private getFreeWorker(): Worker | undefined {
|
99
|
-
|
100
|
+
const freeWorkers = this.freeWorkers;
|
101
|
+
|
102
|
+
return freeWorkers[Math.floor(Math.random() * freeWorkers.length)];
|
100
103
|
}
|
101
104
|
|
102
105
|
private get aliveWorkers(): Worker[] {
|
103
|
-
return this.workers.filter((worker) => !worker.exitedAfterDisconnect);
|
106
|
+
return this.workers.filter((worker) => !worker.exitedAfterDisconnect && !worker.isShuttingDown);
|
104
107
|
}
|
105
108
|
|
106
109
|
private get freeWorkers(): Worker[] {
|
107
110
|
return this.aliveWorkers.filter((worker) => !worker.isRunning);
|
108
111
|
}
|
109
112
|
|
110
|
-
private async forkWorker(retry = 0): Promise<Worker | { error: string }> {
|
111
|
-
cluster.setupPrimary({
|
112
|
-
args: ['--browser', this.browser, ...process.argv.slice(2)],
|
113
|
-
});
|
114
|
-
const worker = cluster.fork();
|
115
|
-
const message = await new Promise((resolve: (value: WorkerMessage) => void) => {
|
116
|
-
const readyHandler = (message: unknown): void => {
|
117
|
-
if (!isWorkerMessage(message)) return;
|
118
|
-
worker.off('message', readyHandler);
|
119
|
-
resolve(message);
|
120
|
-
};
|
121
|
-
worker.on('message', readyHandler);
|
122
|
-
});
|
123
|
-
|
124
|
-
if (message.type != 'error') return worker;
|
125
|
-
|
126
|
-
this.gracefullyKill(worker);
|
127
|
-
|
128
|
-
if (retry == FORK_RETRIES) return message.payload;
|
129
|
-
return this.forkWorker(retry + 1);
|
130
|
-
}
|
131
|
-
|
132
113
|
private exitHandler(worker: Worker): void {
|
133
114
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
134
115
|
worker.once('exit', async () => {
|
135
116
|
if (isShuttingDown.current) return;
|
136
117
|
|
137
|
-
const workerOrError = await this.forkWorker();
|
118
|
+
const workerOrError = await this.scheduler.forkWorker(this.browser);
|
138
119
|
|
139
120
|
if (!(workerOrError instanceof ClusterWorker))
|
140
121
|
throw new Error(`Can't instantiate worker for ${this.browser} due many errors`);
|
@@ -145,16 +126,6 @@ export default class Pool extends EventEmitter {
|
|
145
126
|
});
|
146
127
|
}
|
147
128
|
|
148
|
-
private gracefullyKill(worker: Worker): void {
|
149
|
-
const timeout = setTimeout(() => {
|
150
|
-
worker.kill();
|
151
|
-
}, 10000);
|
152
|
-
worker.on('exit', () => {
|
153
|
-
clearTimeout(timeout);
|
154
|
-
});
|
155
|
-
sendShutdownMessage(worker);
|
156
|
-
}
|
157
|
-
|
158
129
|
private shouldRetry(test: WorkerTest): boolean {
|
159
130
|
return test.retries < this.maxRetries && !this.forcedStop;
|
160
131
|
}
|
@@ -185,7 +156,7 @@ export default class Pool extends EventEmitter {
|
|
185
156
|
unsubscribe();
|
186
157
|
});
|
187
158
|
|
188
|
-
|
159
|
+
gracefullyKill(worker);
|
189
160
|
|
190
161
|
this.handleTestResult(worker, test, { status: 'failed', ...message.payload });
|
191
162
|
}),
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import cluster from 'cluster';
|
2
|
+
import { isWorkerMessage, Worker, WorkerMessage } from '../../types.js';
|
3
|
+
import { gracefullyKill, isShuttingDown } from '../utils.js';
|
4
|
+
|
5
|
+
const FORK_RETRIES = 5;
|
6
|
+
|
7
|
+
type MaybeWorker = Worker | { error: string };
|
8
|
+
|
9
|
+
export class WorkerQueue {
|
10
|
+
private isProcessing = false;
|
11
|
+
private queue: { browser: string; retry: number; resolve: (mw: MaybeWorker) => void }[] = [];
|
12
|
+
|
13
|
+
// TODO Add concurrency
|
14
|
+
constructor(private useQueue: boolean) {}
|
15
|
+
|
16
|
+
async forkWorker(browser: string, retry = 0): Promise<MaybeWorker> {
|
17
|
+
return new Promise<MaybeWorker>((resolve) => {
|
18
|
+
this.queue.push({ browser, retry, resolve });
|
19
|
+
|
20
|
+
void this.process();
|
21
|
+
});
|
22
|
+
}
|
23
|
+
|
24
|
+
private async process() {
|
25
|
+
if ((this.useQueue && this.isProcessing) || isShuttingDown.current) return;
|
26
|
+
|
27
|
+
const { browser, retry, resolve } = this.queue.pop() ?? {};
|
28
|
+
|
29
|
+
if (browser == undefined || retry == undefined || resolve == undefined) return;
|
30
|
+
|
31
|
+
this.isProcessing = true;
|
32
|
+
|
33
|
+
cluster.setupPrimary({
|
34
|
+
args: ['--browser', browser, ...process.argv.slice(2)],
|
35
|
+
});
|
36
|
+
const worker = cluster.fork();
|
37
|
+
const message = await new Promise((resolve: (value: WorkerMessage) => void) => {
|
38
|
+
const readyHandler = (message: unknown): void => {
|
39
|
+
if (!isWorkerMessage(message)) return;
|
40
|
+
worker.off('message', readyHandler);
|
41
|
+
resolve(message);
|
42
|
+
};
|
43
|
+
worker.on('message', readyHandler);
|
44
|
+
});
|
45
|
+
|
46
|
+
if (message.type == 'error') {
|
47
|
+
gracefullyKill(worker);
|
48
|
+
|
49
|
+
if (retry == FORK_RETRIES) resolve(message.payload);
|
50
|
+
else this.queue.push({ browser, retry: retry + 1, resolve });
|
51
|
+
} else {
|
52
|
+
resolve(worker);
|
53
|
+
}
|
54
|
+
|
55
|
+
this.isProcessing = false;
|
56
|
+
|
57
|
+
setImmediate(() => void this.process());
|
58
|
+
}
|
59
|
+
}
|
@@ -13,12 +13,14 @@ import {
|
|
13
13
|
TestMeta,
|
14
14
|
} from '../../types.js';
|
15
15
|
import Pool from './pool.js';
|
16
|
+
import { WorkerQueue } from './queue.js';
|
16
17
|
|
17
18
|
export default class Runner extends EventEmitter {
|
18
19
|
private failFast: boolean;
|
19
20
|
private screenDir: string;
|
20
21
|
private reportDir: string;
|
21
22
|
private browsers: string[];
|
23
|
+
private scheduler: WorkerQueue;
|
22
24
|
private pools: Record<string, Pool> = {};
|
23
25
|
tests: Partial<Record<string, ServerTest>> = {};
|
24
26
|
public get isRunning(): boolean {
|
@@ -30,9 +32,10 @@ export default class Runner extends EventEmitter {
|
|
30
32
|
this.failFast = config.failFast;
|
31
33
|
this.screenDir = config.screenDir;
|
32
34
|
this.reportDir = config.reportDir;
|
35
|
+
this.scheduler = new WorkerQueue(config.useWorkerQueue);
|
33
36
|
this.browsers = Object.keys(config.browsers);
|
34
37
|
this.browsers
|
35
|
-
.map((browser) => (this.pools[browser] = new Pool(config, browser)))
|
38
|
+
.map((browser) => (this.pools[browser] = new Pool(this.scheduler, config, browser)))
|
36
39
|
.map((pool) => pool.on('test', this.handlePoolMessage));
|
37
40
|
}
|
38
41
|
|
@@ -202,12 +205,14 @@ export default class Runner extends EventEmitter {
|
|
202
205
|
test.approved = {};
|
203
206
|
}
|
204
207
|
test.approved[name] = retry;
|
208
|
+
test.status = 'approved';
|
205
209
|
|
206
210
|
updatedTests[test.id] = {
|
207
211
|
id: test.id,
|
208
212
|
browser: test.browser,
|
209
213
|
storyPath: test.storyPath,
|
210
214
|
storyId: test.storyId,
|
215
|
+
status: test.status,
|
211
216
|
approved: { [name]: retry },
|
212
217
|
};
|
213
218
|
}
|