| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
|
Review requested:
|
Sorry, something went wrong.
|
We need to turn the cwd option into a URL and get the href. If we make the cwd a part of the globalOptions object, the coverage code will have access to it. Same thing. The test object there will have a reference to the cwd. |
Sorry, something went wrong.
|
@cjihrig thanks for the support, I'm gonna take a look ASAP! |
Sorry, something went wrong.
There was a problem hiding this comment.
I don't think we should add this. The cwd option should be supported by the run() API only IMO.
Sorry, something went wrong.
There was a problem hiding this comment.
Okay, makes sense! I was thinking about a way to set the entire test runner's cwd to allow this behavior to be configured via the CLI as well.
Btw, while working on this, I noticed an unexpected behavior related to isolation and watch mode.
I'm going to open a PR to ask for your feedback, @cjihrig
Sorry, something went wrong.
There was a problem hiding this comment.
If the user wants to use the CLI, they could do something like cd path/to/tests && node --test
Sorry, something went wrong.
There was a problem hiding this comment.
I agree
Sorry, something went wrong.
There was a problem hiding this comment.
I would rather not do this. existsSync() specifically is a race condition. Just assume that the cwd is a directory and handle any errors. For example, the child process APIs, which also take a cwd option don't perform this type of validation.
Sorry, something went wrong.
There was a problem hiding this comment.
I removed the validation and added a couple of tests to check that run handles an incorrect cwd without throwing errors
Sorry, something went wrong.
There was a problem hiding this comment.
We should ensure that options.cwd always exists and remove the ?? process.cwd() fallback.
Sorry, something went wrong.
There was a problem hiding this comment.
I would prefer to get the cwd from the rootTest here instead of adding another argument.
Sorry, something went wrong.
There was a problem hiding this comment.
done
Sorry, something went wrong.
There was a problem hiding this comment.
In the meantime, I've seen that in harness.js we have:
node/lib/internal/test_runner/harness.js
Lines 80 to 90 in c1afd2c
While the method definition is:
node/lib/internal/test_runner/harness.js
Lines 182 to 184 in c1afd2c
Can I remove harness from the setupProcessState method call, or should I do that in a separate PR?
Sorry, something went wrong.
Codecov ReportAttention: Patch coverage is 83.33333% with 3 lines in your changes missing coverage. Please review.
@@ Coverage Diff @@
## main #54705 +/- ##
==========================================
+ Coverage 88.39% 88.42% +0.02%
==========================================
Files 652 652
Lines 186565 186576 +11
Branches 36046 36050 +4
==========================================
+ Hits 164916 164981 +65
+ Misses 14908 14866 -42
+ Partials 6741 6729 -12
|
Sorry, something went wrong.
There was a problem hiding this comment.
Hey @cjihrig, regarding these tests, I was working on a GitHub codespace yesterday, and I noticed that this test was flaky there.
The issue was with the interval: if the system is delayed for any reason beyond the timeout, a second run of "rename" (and similarly for "delete") is triggered, causing an error because the file has already been renamed and can no longer be found under its previous name.
I'll take a look at the other similar tests
Sorry, something went wrong.
There was a problem hiding this comment.
That makes sense. Timers in tests should be avoided like the plague if possible.
Do we need to use an interval for operations like that? For example, would it work to use a setTimeout() and then reschedule the callback again once the timer fires?
Sorry, something went wrong.
There was a problem hiding this comment.
Hey @cjihrig, I agree, I hadn’t thought about replacing it with setTimeout 😬
I’ll do it ASAP !
Sorry, something went wrong.
There was a problem hiding this comment.
@cjihrig, following another fix I was working on for a related flaky test, test/parallel/test-runner-watch-mode-complex.mjs, and following your suggestions, I removed the setIntervals in an attempt to simplify the test's readability while hopefully preventing flakiness
Sorry, something went wrong.
There was a problem hiding this comment.
Can this be simplified to:
| ...(cwd ? { cwd } : {}), | |
| ...(isolation ? { isolation } : {}), | |
| cwd, | |
| isolation, |
Sorry, something went wrong.
There was a problem hiding this comment.
Please use setTimeout() from node:timers/promises (or is this just the changes from your other PR?)
Sorry, something went wrong.
There was a problem hiding this comment.
Absolutely! I worked on them at the same time.
I need to port what we did on the other test to this one 😁
This change could also reduce the flakiness of this test (at least I hope so)
Sorry, something went wrong.
There was a problem hiding this comment.
done
Sorry, something went wrong.
There was a problem hiding this comment.
I wonder if it would be more efficient to either:
I'm personally leaning toward option 2.
Sorry, something went wrong.
There was a problem hiding this comment.
hey @cjihrig, I agree regarding option 2.
IMHO option 1 would make sense if we were adding a new option.
I'm going to take a look ASAP
Sorry, something went wrong.
There was a problem hiding this comment.
lgtm
Sorry, something went wrong.
|
The commit lands cleanly on v22.x-staging but test fails: ./node test/parallel/test-runner-no-isolation-different-cwd.mjs
before one: <root>
suite one
before two: <root>
suite two
beforeEach one: suite one - test
beforeEach two: suite one - test
suite one - test
afterEach one: suite one - test
afterEach two: suite one - test
beforeEach one: test one
beforeEach two: test one
test one
afterEach one: test one
afterEach two: test one
before suite two: suite two
beforeEach one: suite two - test
beforeEach two: suite two - test
suite two - test
afterEach one: suite two - test
afterEach two: suite two - test
after one: <root>
after two: <root>
node:internal/modules/run_main:122
triggerUncaughtException(
^
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected ... Lines skipped
[
'before one: <root>',
...
'afterEach one: suite one - test',
'afterEach two: suite one - test',
+ 'beforeEach one: test one',
+ 'beforeEach two: test one',
+ 'test one',
+ 'afterEach one: test one',
+ 'afterEach two: test one',
'before suite two: suite two',
...
'after one: <root>',
'after two: <root>'
]
at file:///Users/mzasso/git/nodejs/v22.x/test/parallel/test-runner-no-isolation-different-cwd.mjs:16:1
at process.processTicksAndRejections (node:internal/process/task_queues:105:5) {
|
Sorry, something went wrong.
|
My guess is that the problem is the fixture's only test which requires --test-only on v22, but does not on main. |
Sorry, something went wrong.
|
I'll take a look ASAP |
Sorry, something went wrong.
|
Hey @cjihrig, I just took a quick look and the fixtures are not using only. Given one.test.js: suite('suite one', function() {
record(this.name);
test('suite one - test', { only: true }, function() {
record(this.name);
});
});
test('test one', function() {
record(this.name);
});and checking the output it seems that the failing output on the v22.x-staging is indeed correct. The behaviour I would expect is the one in v22.x-staging, do we agree on this? Note: I just tried to execute The output is different, when isolation == none we're skipping test('test one', function() {
record(this.name);
});(I just tested this in main) |
Sorry, something went wrong.
I believe it is:
|
Sorry, something went wrong.
Sorry, I completely missed it, even though I had just recopied it 😬 |
Sorry, something went wrong.
|
@cjihrig, but still, do you think it makes sense to have two different behaviors based on the isolation? Note: > ./node --test --experimental-test-isolation=none test/fixtures/test-runner/no-isolation/one.test.js
▶ suite one
✔ suite one - test (0.510791ms)
✔ suite one (0.929208ms)
ℹ tests 1
ℹ suites 1
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14.173333and > ./node --test --experimental-test-isolation=process test/fixtures/test-runner/no-isolation/one.test.js
▶ suite one
✔ suite one - test (0.441834ms)
ℹ 'only' and 'runOnly' require the --test-only command-line option.
✔ suite one (0.865417ms)
✔ test one (0.209416ms)
ℹ tests 2
ℹ suites 1
ℹ pass 2
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 94.562917 |
Sorry, something went wrong.
For the only flag, I do. When running multiple test processes in parallel, some things are inherently different. For example, look at mocha, which calls out "some important implications of the behavior" including not supporting only at all. |
Sorry, something went wrong.
I agree, but I think I might be missing something here. Why is test-only the default when isolation == none? As a user, I would expect to have to set --test-only even when isolation == none (or perhaps the reverse should be true). What I mean is, I would expect the same default behavior regardless of the isolation mode. This is an honest question. Considering that 22.x is still following this logic, I suppose it's something that was considered and decided recently. I'm not strongly opinionated on this, just curious. EDIT: As always, thanks for your time and support! 🚀 |
Sorry, something went wrong.
|
The idea is that no one ever wants to type --test-only because only tests can be automatically detected and handled appropriately. only is uniquely annoying because the test runner has to discover all of the tests that it will run, determine if any only tests were found, and if so, then apply filtering. When using process isolation the annoyance factor is 100x worse because that logic needs to be coordinated across multiple child processes. It is technically possible to support, but the complexity and performance overhead are not worth it IMO. Prior to isolation=none existing, process isolation was the only mode of execution, so we needed a way to handle only tests. That's how --test-only came to be (the idea was copied from node-tap). |
Sorry, something went wrong.
|
I believe so. |
Sorry, something went wrong.
AFAICT that PR is already on v22.x, but trying to cherry-pick the commit from this PR still have a failing test. |
Sorry, something went wrong.
|
Hey @aduh95, I just tested locally, and I think we're missing this PR: #54881 (landed in commit dbaef33) I suppose it can't be backported, as it's a semver-major. Note: forgive me if what I've said doesn't make sense; I'm not super confident about backporting and release management 😬 |
Sorry, something went wrong.
|
Not having this on v22.x creates more and more divergence between 23.x and 22.x, causing more and more backports to fail. It would be very helpful to work on a backport before the tech debt has grown out of proportions. IIUC it would probably require to find a way to backport #54881 in a non-semver-major way |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
I'm opening this PR as a draft to have a place where we can discuss this implementation.
Some background context:
During #54225, we discussed the possibility of adding a new option to run.
This new option would be cwd.
This change could impact many other parts of the code, such as:
#54225 (comment)
For this reason, we decided to work on this in a separate PR (#54225 (comment)).