Repository navigation
test(cli): serialize the tests that change the process directory #3494
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 1 commit
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
c0082b2
test(cli): serialize the tests that change the process directory
kojiwakayama a7fe6d7
test(cli): reject nested withCwd instead of deadlocking
kojiwakayama bdb432e
test(cli): tell a nested withCwd call from an independent one
kojiwakayama 3b2bd32
fix(errors): register a slug for the nested working-directory contract
kojiwakayama 2f1f030
fix(testing): serialize withCwd across test files, not just within one
kojiwakayama da7e306
test: move every process-directory mutation onto withCwd
kojiwakayama 48921b3
docs: regenerate the API reference for the new error slug
kojiwakayama File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| /** | ||
| * Serialized access to the process working directory in tests. | ||
| * | ||
| * `Deno.chdir` mutates state shared by every test in the process, and the CLI | ||
| * suite has several files that need it -- each one resolving a relative path | ||
| * the way the command under test would. Run two of them at once and the second | ||
| * `chdir` lands while the first is still awaiting, so the first resolves its | ||
| * path against the wrong directory. That is a race by construction: it depends | ||
| * on which files a shard happens to group, so it fails rarely, somewhere | ||
| * unrelated to whatever change is being tested. | ||
| * | ||
| * Every caller queues here instead, so at most one has the working directory at | ||
| * a time and each is restored before the next begins. | ||
| * | ||
| * @module testing/cwd | ||
| */ | ||
|
|
||
| /** Tail of the queue. Each caller awaits the previous one before it chdirs. */ | ||
| let queue: Promise<void> = Promise.resolve(); | ||
|
|
||
| /** | ||
| * Run `fn` with the process working directory set to `dir`. | ||
| * | ||
| * Waits for any other caller to finish first, and restores the previous | ||
| * directory afterwards even if `fn` throws. | ||
| * | ||
| * @param dir directory to enter | ||
| * @param fn work to run inside it | ||
| * @returns whatever `fn` returns | ||
| */ | ||
| export function withCwd<T>(dir: string, fn: () => Promise<T> | T): Promise<T> { | ||
| const run = queue.then(async () => { | ||
| const previous = Deno.cwd(); | ||
| try { | ||
| Deno.chdir(dir); | ||
| return await fn(); | ||
| } finally { | ||
| Deno.chdir(previous); | ||
| } | ||
| }); | ||
|
|
||
| // The queue advances whether or not this caller succeeded, so one failure | ||
| // does not strand everyone behind it. | ||
| queue = run.then(() => {}, () => {}); | ||
| return run; | ||
|
coderabbitai[bot] marked this conversation as resolved.
Resolved
|
||
| } | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.