node icon indicating copy to clipboard operation
node copied to clipboard

`sourcesContent` not correctly handled in coverage reporter with `--enable-source-maps`

Open avivkeller opened this issue 1 year ago • 1 comments

Version

node-v23.0.0-nightly202409243c5ceff85f

Platform

N/A

Subsystem

test_runner

What steps will reproduce the bug?

The Node.js coverage reporter does not correctly handle source maps with a custom sourcesContent and --with-source-maps.

This example was taken from the test-runner/coverage fixture:

  1. Generate a sourcemap via:
echo "import { test } from 'node:test';
test('ok', () => {});

function uncovered() {
  return 'uncovered';
}
" | npx esbuild --sourcemap --sourcefile=stdin.test.ts --sources-content=true --bundle --platform=node --outfile="stdin.test.js"
Output
// stdin.test.ts
var import_node_test = require("node:test");
(0, import_node_test.test)("ok", () => {
});
//# sourceMappingURL=stdin.test.js.map
{
  "version": 3,
  "sources": ["stdin.test.ts"],
  "sourcesContent": ["import { test } from 'node:test';\ntest('ok', () => {});\n\nfunction uncovered() {\n  return 'uncovered';\n}\n\n"],
  "mappings": ";AAAA,uBAAqB;AAAA,IACrB,uBAAK,MAAM,MAAM;AAAC,CAAC;",
  "names": []
}
  1. Compare the output of node --test --experimental-test-coverage --enable-source-maps with node --test --experimental-test-coverage

How often does it reproduce? Is there a required condition?

Everytime

What is the expected behavior? Why is that the expected behavior?

Without --enable-source-maps:

ℹ start of coverage report
ℹ --------------------------------------------------------------
ℹ file          | line % | branch % | funcs % | uncovered lines
ℹ --------------------------------------------------------------
ℹ stdin.test.ts |  57.14 |   100.00 |  100.00 | 4-6
ℹ --------------------------------------------------------------
ℹ all files     |  57.14 |   100.00 |  100.00 |
ℹ --------------------------------------------------------------
ℹ end of coverage report

What do you see instead?

ℹ start of coverage report
ℹ ----------------------------------------------------------------
ℹ file            | line % | branch % | funcs % | uncovered lines
ℹ ----------------------------------------------------------------
ℹ stdin.test.ts   |  42.86 |   100.00 |    0.00 | 2 4-6
ℹ ----------------------------------------------------------------
ℹ all files       |  42.86 |   100.00 |    0.00 |
ℹ ----------------------------------------------------------------
ℹ end of coverage report

Additional information

No response

avivkeller avatar Sep 24 '24 18:09 avivkeller

In v22.9.0, there is no difference in the output with/without --enable-source-maps:

ℹ start of coverage report
ℹ --------------------------------------------------------------
ℹ file          | line % | branch % | funcs % | uncovered lines
ℹ --------------------------------------------------------------
ℹ stdin.test.ts |  57.14 |   100.00 |  100.00 | 4-6
ℹ --------------------------------------------------------------
ℹ all files     |  57.14 |   100.00 |  100.00 |
ℹ --------------------------------------------------------------
ℹ end of coverage report

avivkeller avatar Sep 24 '24 18:09 avivkeller

On node v23.0.0-pre I got an error

When executed

./node --test --experimental-test-coverage --enable-source-maps

Error

node:internal/test_runner/test:569
      if (StringPrototypeStartsWith(this.loc.file, 'file://')) {
          ^

This entry returns an empty object instead of undefined which makes it to get into the condition at https://github.com/nodejs/node/blob/main/lib/internal/test_runner/test.js#L563.

The coverage report is displayed anyways

Full output

node:internal/test_runner/test:570
      if (StringPrototypeStartsWith(this.loc.file, 'file://')) {
          ^

TypeError: String.prototype.startsWith called on null or undefined
    at startsWith (<anonymous>)
    at new Test (node:internal/test_runner/test:570:11)
    at createTestTree (node:internal/test_runner/harness:82:16)
    at lazyBootstrapRoot (node:internal/test_runner/harness:263:5)
    at run (node:internal/test_runner/harness:301:61)
    at test (node:internal/test_runner/harness:316:12)
    at Object.<anonymous> (/Users/edysilva/projects/contributions/test-node/repro-55106/stdin.test.ts:2:1)
    at Module._compile (node:internal/modules/cjs/loader:1557:14)
    at Object..js (node:internal/modules/cjs/loader:1700:10)
    at Module.load (node:internal/modules/cjs/loader:1328:32)

Node.js v23.0.0-pre
✖ stdin.test.js (39.7005ms)
  'test failed'

ℹ tests 1
ℹ suites 0
ℹ pass 0
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 45.501625
ℹ start of coverage report
ℹ ----------------------------------------------------------------
ℹ file            | line % | branch % | funcs % | uncovered lines
ℹ ----------------------------------------------------------------
ℹ stdin.test.ts   |  85.71 |   100.00 |    0.00 | 2
ℹ ----------------------------------------------------------------
ℹ all files       |  85.71 |   100.00 |    0.00 |
ℹ ----------------------------------------------------------------
ℹ end of coverage report

✖ failing tests:

test at stdin.test.js:1:1
✖ stdin.test.js (39.7005ms)
  'test failed'

geeksilva97 avatar Sep 30 '24 04:09 geeksilva97

Okay, I reached the expected behavior. Let me confirm.

geeksilva97 avatar Oct 01 '24 17:10 geeksilva97

I Just opened a still-drafted pr.

With source maps:

/.node --test --experimental-test-coverage --enable-source-maps

✔ ok (0.397625ms)
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 53.309625
ℹ start of coverage report
ℹ ----------------------------------------------------------------
ℹ file            | line % | branch % | funcs % | uncovered lines
ℹ ----------------------------------------------------------------
ℹ stdin.test.ts   | 100.00 |   100.00 |  100.00 |
ℹ ----------------------------------------------------------------
ℹ all files       | 100.00 |   100.00 |  100.00 |
ℹ ----------------------------------------------------------------
ℹ end of coverage report

Without source maps:

./node/node --test --experimental-test-coverage
✔ ok (0.377625ms)
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 54.716125
ℹ start of coverage report
ℹ ----------------------------------------------------------------
ℹ file            | line % | branch % | funcs % | uncovered lines
ℹ ----------------------------------------------------------------
ℹ stdin.test.ts   |  57.14 |   100.00 |  100.00 | 4-6
ℹ ----------------------------------------------------------------
ℹ all files       |  57.14 |   100.00 |  100.00 |
ℹ ----------------------------------------------------------------
ℹ end of coverage report

geeksilva97 avatar Oct 01 '24 21:10 geeksilva97