test_runner: propagate only to test ancestors by MoLow · Pull Request #48932 · nodejs/node · GitHub
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions benchmark/test_runner/multi-files.js
7 changes: 1 addition & 6 deletions benchmark/test_runner/suite-tests.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
'use strict';
const common = require('../common');
const { finished } = require('node:stream/promises');

const reporter = require('../fixtures/empty-test-reporter');

const { describe, it } = require('node:test');

const bench = common.createBenchmark(main, {
numberOfSuites: [10, 100],
testsPerSuite: [10, 100, 1000],
testsPerSuite: [10, 100],
testType: ['sync', 'async'],
concurrency: ['yes', 'no'],
}, {
Expand Down Expand Up @@ -52,8 +49,6 @@ async function run({ numberOfSuites, testsPerSuite, testType, concurrency }) {
}
}

await finished(reporter);

return numberOfSuites * testsPerSuite;
}

Expand Down
16 changes: 8 additions & 8 deletions lib/internal/test_runner/harness.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
const {
ArrayPrototypeForEach,
FunctionPrototypeBind,
PromiseResolve,
SafeMap,
} = primordials;
const { getCallerLocation } = internalBinding('util');
Expand All @@ -23,12 +22,13 @@ const {
parseCommandLine,
setupTestReporters,
} = require('internal/test_runner/utils');
const { setImmediate } = require('timers');
const { bigint: hrtime } = process.hrtime;

const testResources = new SafeMap();

function createTestTree(options = kEmptyObject) {
return setup(new Test({ __proto__: null, ...options, name: '<root>' }));
return setup(new Suite({ __proto__: null, ...options, name: '<root>' }));
Comment thread
MoLow marked this conversation as resolved.
}

function createProcessEventHandler(eventName, rootTest) {
Expand Down Expand Up @@ -198,24 +198,24 @@ function getGlobalRoot() {
}
});
reportersSetup = setupTestReporters(globalRoot);
setImmediate(() => globalRoot.run());
}
return globalRoot;
}

async function startSubtest(subtest) {
async function startSubtest(subtest, parent) {
await reportersSetup;
getGlobalRoot().harness.bootstrapComplete = true;
await subtest.start();
if (!(parent instanceof Suite) || (parent.parent === null && parent.endTime !== null)) {
await subtest.start();
}
}

function runInParentContext(Factory) {
function run(name, options, fn, overrides) {
const parent = testResources.get(executionAsyncId()) || getGlobalRoot();
const subtest = parent.createSubtest(Factory, name, options, fn, overrides);
if (!(parent instanceof Suite)) {
return startSubtest(subtest);
}
return PromiseResolve();
return startSubtest(subtest, parent);
}

const test = (name, options, fn) => {
Expand Down
26 changes: 16 additions & 10 deletions lib/internal/test_runner/runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ const {
PromisePrototypeThen,
SafePromiseAll,
SafePromiseAllReturnVoid,
SafePromiseAllSettledReturnVoid,
PromiseResolve,
SafeMap,
SafeSet,
Expand Down Expand Up @@ -378,7 +377,9 @@ function runTestFile(path, root, inspectPort, filesWatcher, testNamePatterns) {
throw err;
}
});
return subtest.start();
if (filesWatcher) {
return subtest.start();
}
}

function watchFiles(testFiles, root, inspectPort, signal, testNamePatterns) {
Expand Down Expand Up @@ -476,22 +477,27 @@ function run(options) {
testFiles = ArrayPrototypeFilter(testFiles, (_, index) => index % shard.total === shard.index - 1);
}

let postRun = () => root.postRun();
let filesWatcher;
if (watch) {
filesWatcher = watchFiles(testFiles, root, inspectPort, signal, testNamePatterns);
postRun = undefined;
}

const runFiles = () => {
root.harness.bootstrapComplete = true;
return SafePromiseAllSettledReturnVoid(testFiles, (path) => {
const subtest = runTestFile(path, root, inspectPort, filesWatcher, testNamePatterns);
filesWatcher?.runningSubtests.set(path, subtest);
return subtest;
});
root.buildPhaseFinished = false;
for (let i = 0; i < testFiles.length; i++) {
const path = testFiles[i];
const enqueued = runTestFile(path, root, inspectPort, filesWatcher, testNamePatterns);
filesWatcher?.runningSubtests.set(path, enqueued);
}
root.buildPhaseFinished = true;
if (filesWatcher) {
return root.processPendingSubtests();
}
return PromisePrototypeThen(root.run(), () => root.postRun());
};

PromisePrototypeThen(PromisePrototypeThen(PromiseResolve(setup?.(root)), runFiles), postRun);
PromisePrototypeThen(PromiseResolve(setup?.(root)), runFiles);

return root.reporter;
}
Expand Down
82 changes: 55 additions & 27 deletions lib/internal/test_runner/test.js
Loading