From 6a3ebf7c601494a81324feb272921d09c3d7e22e Mon Sep 17 00:00:00 2001 From: pulkit-30 Date: Wed, 6 Dec 2023 22:30:47 +0530 Subject: [PATCH] test_runner: fixed test object is incorrectly passed to setup() --- lib/internal/test_runner/harness.js | 4 +++- lib/internal/test_runner/runner.js | 4 +++- lib/internal/test_runner/utils.js | 19 ++++++++++++++----- test/parallel/test-runner-run.mjs | 17 +++++++++++++++++ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/lib/internal/test_runner/harness.js b/lib/internal/test_runner/harness.js index 2f18b0bcf091ac..982cd788ddf085 100644 --- a/lib/internal/test_runner/harness.js +++ b/lib/internal/test_runner/harness.js @@ -23,6 +23,7 @@ const { parseCommandLine, reporterScope, setupTestReporters, + colorizeTestFiles, } = require('internal/test_runner/utils'); const { bigint: hrtime } = process.hrtime; @@ -205,7 +206,8 @@ function getGlobalRoot() { process.exitCode = kGenericUserError; } }); - reportersSetup = setupTestReporters(globalRoot); + reportersSetup = setupTestReporters(globalRoot.reporter); + colorizeTestFiles(globalRoot); } return globalRoot; } diff --git a/lib/internal/test_runner/runner.js b/lib/internal/test_runner/runner.js index 34100213ebd935..a745820868cca3 100644 --- a/lib/internal/test_runner/runner.js +++ b/lib/internal/test_runner/runner.js @@ -70,6 +70,7 @@ const { convertStringToRegExp, countCompletedTest, kDefaultPattern, + colorizeTestFiles, } = require('internal/test_runner/utils'); const { Glob } = require('internal/fs/glob'); const { once } = require('events'); @@ -491,6 +492,7 @@ function run(options = kEmptyObject) { return root.reporter; } let testFiles = files ?? createTestFileList(); + colorizeTestFiles(root); if (shard) { testFiles = ArrayPrototypeFilter(testFiles, (_, index) => index % shard.total === shard.index - 1); @@ -512,7 +514,7 @@ function run(options = kEmptyObject) { }); }; - PromisePrototypeThen(PromisePrototypeThen(PromiseResolve(setup?.(root)), runFiles), postRun); + PromisePrototypeThen(PromisePrototypeThen(PromiseResolve(setup?.(root.reporter)), runFiles), postRun); return root.reporter; } diff --git a/lib/internal/test_runner/utils.js b/lib/internal/test_runner/utils.js index 6b4663f14302c3..b5e444e98785c9 100644 --- a/lib/internal/test_runner/utils.js +++ b/lib/internal/test_runner/utils.js @@ -3,6 +3,7 @@ const { ArrayPrototypeJoin, ArrayPrototypeMap, ArrayPrototypeFlatMap, + ArrayPrototypeForEach, ArrayPrototypePush, ArrayPrototypeReduce, ObjectGetOwnPropertyDescriptor, @@ -128,10 +129,17 @@ function tryBuiltinReporter(name) { return require(builtinPath); } -async function getReportersMap(reporters, destinations, rootTest) { +function colorizeTestFiles(rootTest) { + const { reporters, destinations } = parseCommandLine(); + ArrayPrototypeForEach(reporters, (_, index) => { + const destination = kBuiltinDestinations.get(destinations[index]) ?? createWriteStream(destinations[index]); + rootTest.harness.shouldColorizeTestFiles ||= shouldColorize(destination); + }); +} + +async function getReportersMap(reporters, destinations) { return SafePromiseAllReturnArrayLike(reporters, async (name, i) => { const destination = kBuiltinDestinations.get(destinations[i]) ?? createWriteStream(destinations[i]); - rootTest.harness.shouldColorizeTestFiles ||= shouldColorize(destination); // Load the test reporter passed to --test-reporter let reporter = tryBuiltinReporter(name); @@ -166,12 +174,12 @@ async function getReportersMap(reporters, destinations, rootTest) { } const reporterScope = new AsyncResource('TestReporterScope'); -const setupTestReporters = reporterScope.bind(async (rootTest) => { +const setupTestReporters = reporterScope.bind(async (rootReporter) => { const { reporters, destinations } = parseCommandLine(); - const reportersMap = await getReportersMap(reporters, destinations, rootTest); + const reportersMap = await getReportersMap(reporters, destinations); for (let i = 0; i < reportersMap.length; i++) { const { reporter, destination } = reportersMap[i]; - compose(rootTest.reporter, reporter).pipe(destination); + compose(rootReporter, reporter).pipe(destination); } }); @@ -413,6 +421,7 @@ function getCoverageReport(pad, summary, symbol, color, table) { } module.exports = { + colorizeTestFiles, convertStringToRegExp, countCompletedTest, createDeferredCallback, diff --git a/test/parallel/test-runner-run.mjs b/test/parallel/test-runner-run.mjs index c712f500153b42..1fa5da4da05b43 100644 --- a/test/parallel/test-runner-run.mjs +++ b/test/parallel/test-runner-run.mjs @@ -1,10 +1,14 @@ +// Flags: --expose-internals + import * as common from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import { join } from 'node:path'; import { describe, it, run } from 'node:test'; import { dot, spec, tap } from 'node:test/reporters'; import assert from 'node:assert'; +import stream from 'internal/test_runner/tests_stream'; +const { TestsStream } = stream; const testFixtures = fixtures.path('test-runner'); describe('require(\'node:test\').run', { concurrency: true }, () => { @@ -465,6 +469,19 @@ describe('require(\'node:test\').run', { concurrency: true }, () => { code: 'ERR_INVALID_ARG_TYPE' })); }); + + it('should pass instance of stream to setup', async () => { + const stream = run({ + files: [join(testFixtures, 'default-behavior/test/random.cjs')], + setup: common.mustCall((root) => { + assert(root instanceof TestsStream); + }), + }); + stream.on('test:fail', common.mustNotCall()); + stream.on('test:pass', common.mustCall()); + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + }); }); it('should run with no files', async () => {