Skip to content

Commit

Permalink
doc,test: fix concurrency option of test()
Browse files Browse the repository at this point in the history
The documentation appears to still be wrong w.r.t. the meaning of the
concurrency option of the test() function. The implementation appears to
default to Infinity when the option is set to true. Is that intended or
a good idea? I don't know. It certainly makes more sense than what the
documentation says (which is basing the number of concurrent tasks
within a single thread on the number of CPU cores).

This changes the documentation to hopefully match the implementation and
adds a test that rules out the (rather arbitrary) behavior described in
the documentation.

Refs: nodejs#47365
Refs: nodejs#47642
  • Loading branch information
tniessen committed Apr 26, 2023
1 parent e2e3f5c commit 9122dba
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
5 changes: 2 additions & 3 deletions doc/api/test.md
Original file line number Diff line number Diff line change
Expand Up @@ -812,9 +812,8 @@ changes:
properties are supported:
* `concurrency` {number|boolean} If a number is provided,
then that many tests would run in parallel within the application thread.
If `true`, it would run `os.availableParallelism() - 1` tests in parallel.
For subtests, it will be `Infinity` tests in parallel.
If `false`, it would only run one test at a time.
If `true`, all scheduled asynchronous tests run concurrently within the
thread. If `false`, only one test runs at a time.
If unspecified, subtests inherit this value from their parent.
**Default:** `false`.
* `only` {boolean} If truthy, and the test context is configured to run
Expand Down
17 changes: 17 additions & 0 deletions test/parallel/test-runner-concurrency.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const assert = require('node:assert');
const path = require('node:path');
const fs = require('node:fs/promises');
const os = require('node:os');
const timers = require('node:timers/promises');

tmpdir.refresh();

Expand Down Expand Up @@ -35,6 +36,22 @@ describe(
}
);

// Despite the docs saying so at some point, setting concurrency to true should
// not limit concurrency to the number of available CPU cores.
describe('concurrency: true implies Infinity', { concurrency: true }, () => {
// The factor 5 is intentionally chosen to be higher than the default libuv
// thread pool size.
const nTests = 5 * os.availableParallelism();
let nStarted = 0;
for (let i = 0; i < nTests; i++) {
it(`should run test ${i} concurrently`, async () => {
assert.strictEqual(nStarted++, i);
await timers.setImmediate();
assert.strictEqual(nStarted, nTests);
});
}
});

{
// Make sure tests run in order when root concurrency is 1 (default)
const tree = [];
Expand Down

0 comments on commit 9122dba

Please sign in to comment.