From 823f286c3adae331d5907875d2306f5dc3aad938 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sun, 23 Apr 2023 02:57:10 -0400 Subject: [PATCH] test_runner: move coverage collection to root.postRun() This commit moves code coverage collection from the test harness exit handler to the postRun() function of the root test. This is necessary preparatory work for supporting code coverage with --test. The reason is that --test is implemented on top of run(), and that function calls the root test's postRun() function, which outputs the test summary. This happens before the harness exit handler. PR-URL: https://github.com/nodejs/node/pull/47651 Reviewed-By: Moshe Atlow Reviewed-By: Matteo Collina Reviewed-By: Benjamin Gruenbaum --- lib/internal/test_runner/harness.js | 4 ++-- lib/internal/test_runner/test.js | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/internal/test_runner/harness.js b/lib/internal/test_runner/harness.js index c22b961b381468..7392597409feff 100644 --- a/lib/internal/test_runner/harness.js +++ b/lib/internal/test_runner/harness.js @@ -1,6 +1,7 @@ 'use strict'; const { ArrayPrototypeForEach, + FunctionPrototypeBind, PromiseResolve, SafeMap, } = primordials; @@ -138,7 +139,6 @@ function setup(root) { createProcessEventHandler('unhandledRejection', root); const coverage = configureCoverage(root, globalOptions); const exitHandler = () => { - root.harness.coverage = collectCoverage(root, coverage); root.postRun(new ERR_TEST_FAILURE( 'Promise resolution is still pending but the event loop has already resolved', kCancelledByParent)); @@ -165,7 +165,7 @@ function setup(root) { root.harness = { __proto__: null, bootstrapComplete: false, - coverage: null, + coverage: FunctionPrototypeBind(collectCoverage, null, root, coverage), counters: { __proto__: null, all: 0, diff --git a/lib/internal/test_runner/test.js b/lib/internal/test_runner/test.js index 0fd74d1b257653..92b9c2cbc083e1 100644 --- a/lib/internal/test_runner/test.js +++ b/lib/internal/test_runner/test.js @@ -644,8 +644,10 @@ class Test extends AsyncResource { this.reporter.diagnostic(this.nesting, kFilename, `todo ${this.root.harness.counters.todo}`); this.reporter.diagnostic(this.nesting, kFilename, `duration_ms ${this.#duration()}`); - if (this.harness?.coverage) { - this.reporter.coverage(this.nesting, kFilename, this.harness.coverage); + const coverage = this.harness.coverage(); + + if (coverage) { + this.reporter.coverage(this.nesting, kFilename, coverage); } this.reporter.push(null);