Skip to content

Commit b7de782

Browse files
committed
process: handle process.env.NODE_V8_COVERAGE in pre-execution
Since this depends on environment variable, and the worker threads do not need to persist the variable value because they cannot switch cwd. PR-URL: nodejs#26466 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
1 parent 15842af commit b7de782

File tree

3 files changed

+36
-23
lines changed

3 files changed

+36
-23
lines changed

lib/internal/bootstrap/node.js

-23
Original file line numberDiff line numberDiff line change
@@ -315,29 +315,6 @@ Object.defineProperty(process, 'features', {
315315
hasUncaughtExceptionCaptureCallback;
316316
}
317317

318-
// User-facing NODE_V8_COVERAGE environment variable that writes
319-
// ScriptCoverage to a specified file.
320-
if (process.env.NODE_V8_COVERAGE) {
321-
const originalReallyExit = process.reallyExit;
322-
const cwd = NativeModule.require('internal/process/execution').tryGetCwd();
323-
const { resolve } = NativeModule.require('path');
324-
// Resolve the coverage directory to an absolute path, and
325-
// overwrite process.env so that the original path gets passed
326-
// to child processes even when they switch cwd.
327-
const coverageDirectory = resolve(cwd, process.env.NODE_V8_COVERAGE);
328-
process.env.NODE_V8_COVERAGE = coverageDirectory;
329-
const {
330-
writeCoverage,
331-
setCoverageDirectory
332-
} = NativeModule.require('internal/coverage-gen/with_profiler');
333-
setCoverageDirectory(coverageDirectory);
334-
process.on('exit', writeCoverage);
335-
process.reallyExit = (code) => {
336-
writeCoverage();
337-
originalReallyExit(code);
338-
};
339-
}
340-
341318
function setupProcessObject() {
342319
const EventEmitter = NativeModule.require('events');
343320
const origProcProto = Object.getPrototypeOf(process);

lib/internal/bootstrap/pre_execution.js

+29
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ function prepareMainThreadExecution() {
1010

1111
setupWarningHandler();
1212

13+
// Resolve the coverage directory to an absolute path, and
14+
// overwrite process.env so that the original path gets passed
15+
// to child processes even when they switch cwd.
16+
if (process.env.NODE_V8_COVERAGE) {
17+
process.env.NODE_V8_COVERAGE =
18+
setupCoverageHooks(process.env.NODE_V8_COVERAGE);
19+
}
20+
1321
// Only main thread receives signals.
1422
setupSignalHandlers();
1523

@@ -47,6 +55,26 @@ function setupWarningHandler() {
4755
}
4856
}
4957

58+
// Setup User-facing NODE_V8_COVERAGE environment variable that writes
59+
// ScriptCoverage to a specified file.
60+
function setupCoverageHooks(dir) {
61+
const originalReallyExit = process.reallyExit;
62+
const cwd = require('internal/process/execution').tryGetCwd();
63+
const { resolve } = require('path');
64+
const coverageDirectory = resolve(cwd, dir);
65+
const {
66+
writeCoverage,
67+
setCoverageDirectory
68+
} = require('internal/coverage-gen/with_profiler');
69+
setCoverageDirectory(coverageDirectory);
70+
process.on('exit', writeCoverage);
71+
process.reallyExit = (code) => {
72+
writeCoverage();
73+
originalReallyExit(code);
74+
};
75+
return coverageDirectory;
76+
}
77+
5078
function initializeReport() {
5179
if (!getOptionValue('--experimental-report')) {
5280
return;
@@ -256,6 +284,7 @@ function loadPreloadModules() {
256284
}
257285

258286
module.exports = {
287+
setupCoverageHooks,
259288
setupWarningHandler,
260289
prepareMainThreadExecution,
261290
initializeDeprecations,

lib/internal/main/worker_thread.js

+7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// message port.
55

66
const {
7+
setupCoverageHooks,
78
setupWarningHandler,
89
initializeDeprecations,
910
initializeESMLoader,
@@ -42,6 +43,12 @@ const debug = require('util').debuglog('worker');
4243

4344
setupWarningHandler();
4445

46+
// Since worker threads cannot switch cwd, we do not need to
47+
// overwrite the process.env.NODE_V8_COVERAGE variable.
48+
if (process.env.NODE_V8_COVERAGE) {
49+
setupCoverageHooks(process.env.NODE_V8_COVERAGE);
50+
}
51+
4552
debug(`[${threadId}] is setting up worker child environment`);
4653

4754
// Set up the message port and start listening

0 commit comments

Comments
 (0)