Skip to content

Commit 7639390

Browse files
addaleaxtargos
authored andcommitted
worker,coverage: support V8 coverage generation
PR-URL: #22928 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 5d70652 commit 7639390

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

lib/internal/process/coverage.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
'use strict';
22
const path = require('path');
33
const { mkdirSync, writeFileSync } = require('fs');
4-
// TODO(addaleax): add support for coverage to worker threads.
5-
const hasInspector = process.config.variables.v8_enable_inspector === 1 &&
6-
require('internal/worker').isMainThread;
4+
const hasInspector = process.config.variables.v8_enable_inspector === 1;
75
let inspector = null;
86
if (hasInspector) inspector = require('inspector');
97

@@ -14,7 +12,9 @@ function writeCoverage() {
1412
return;
1513
}
1614

17-
const filename = `coverage-${process.pid}-${Date.now()}.json`;
15+
const { threadId } = require('internal/worker');
16+
17+
const filename = `coverage-${process.pid}-${Date.now()}-${threadId}.json`;
1818
try {
1919
// TODO(bcoe): switch to mkdirp once #22302 is addressed.
2020
mkdirSync(process.env.NODE_V8_COVERAGE);

test/fixtures/v8-coverage/worker.js

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
const { Worker } = require('worker_threads');
3+
const path = require('path');
4+
5+
new Worker(path.resolve(__dirname, 'subprocess.js'));

test/parallel/test-v8-coverage.js

+17
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,23 @@ function nextdir() {
7979
assert.strictEqual(fixtureCoverage.functions[2].ranges[1].count, 0);
8080
}
8181

82+
// outputs coverage from worker.
83+
{
84+
const coverageDirectory = path.join(tmpdir.path, nextdir());
85+
const output = spawnSync(process.execPath, [
86+
'--experimental-worker',
87+
require.resolve('../fixtures/v8-coverage/worker')
88+
], { env: { ...process.env, NODE_V8_COVERAGE: coverageDirectory } });
89+
assert.strictEqual(output.status, 0);
90+
const fixtureCoverage = getFixtureCoverage('subprocess.js',
91+
coverageDirectory);
92+
assert.ok(fixtureCoverage);
93+
// first branch executed.
94+
assert.strictEqual(fixtureCoverage.functions[2].ranges[0].count, 1);
95+
// second branch did not execute.
96+
assert.strictEqual(fixtureCoverage.functions[2].ranges[1].count, 0);
97+
}
98+
8299
// does not output coverage if NODE_V8_COVERAGE is empty.
83100
{
84101
const coverageDirectory = path.join(tmpdir.path, nextdir());

0 commit comments

Comments
 (0)