test_runner: run top level tests in a microtask

This commit updates the test harness to prevent top level
tests from executing immediately. This allows certain config
data, such as filtering options, to be discovered before running
the tests.

PR-URL: https://github.com/nodejs/node/pull/52092
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
This commit is contained in:
Colin Ihrig 2024-03-17 00:17:36 -04:00 committed by GitHub
parent 97b2c5344d
commit 05db979c01
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 17 additions and 2 deletions

View File

@ -25,6 +25,7 @@ const {
setupTestReporters,
shouldColorizeTestFiles,
} = require('internal/test_runner/utils');
const { queueMicrotask } = require('internal/process/task_queues');
const { bigint: hrtime } = process.hrtime;
const testResources = new SafeMap();
@ -181,6 +182,7 @@ function setup(root) {
root.harness = {
__proto__: null,
allowTestsToRun: false,
bootstrapComplete: false,
coverage: FunctionPrototypeBind(collectCoverage, null, root, coverage),
counters: {
@ -219,7 +221,16 @@ function getGlobalRoot() {
async function startSubtest(subtest) {
await reportersSetup;
getGlobalRoot().harness.bootstrapComplete = true;
const root = getGlobalRoot();
if (!root.harness.bootstrapComplete) {
root.harness.bootstrapComplete = true;
queueMicrotask(() => {
root.harness.allowTestsToRun = true;
root.processPendingSubtests();
});
}
await subtest.start();
}

View File

@ -538,6 +538,7 @@ function run(options = kEmptyObject) {
}
const runFiles = () => {
root.harness.bootstrapComplete = true;
root.harness.allowTestsToRun = true;
return SafePromiseAllSettledReturnVoid(testFiles, (path) => {
const subtest = runTestFile(path, filesWatcher, opts);
filesWatcher?.runningSubtests.set(path, subtest);

View File

@ -599,7 +599,7 @@ class Test extends AsyncResource {
// it. Otherwise, return a Promise to the caller and mark the test as
// pending for later execution.
this.reporter.enqueue(this.nesting, this.loc, this.name);
if (!this.parent.hasConcurrency()) {
if (!this.root.harness.allowTestsToRun || !this.parent.hasConcurrency()) {
const deferred = createDeferredPromise();
deferred.test = this;

View File

@ -21,6 +21,9 @@ not ok 1 - fails
*
*
*
*
*
*
...
1..1
# tests 1