Skip to content

Commit

Permalink
test(flaky): avoid relying on race condition for tested behavior #6452
Browse files Browse the repository at this point in the history
## Problem
#6451

This rename test relies on a specific result of a race condition for the
expected result.
- The test is checking for a telemetry result that is only emitted when
`fs.exists` takes more than 1 attempt to resolve to true.
- Therefore, it wants the first `fs.exists` check to fail, then a
subsequent one to succeed.
- It does this by not awaiting the result, and then writing the file to
be renamed.

Usually this is fine, but it is possible that the write (`toFile`)
happens before the read (`fs.exists`) since neither is awaited. This
behavior leads to a flaky test as described in the issue.

## Solution
- use a stub to force the first call to `fs.exists` to fail. 
- allow all other calls to "go through" to the original function.
  • Loading branch information
Hweinstock authored Jan 30, 2025
1 parent 3a03e95 commit 30face9
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions packages/core/src/test/shared/fs/fs.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -411,16 +411,20 @@ describe('FileSystem', function () {
const oldPath = testFolder.pathFrom('oldFile.txt')
const newPath = testFolder.pathFrom('newFile.txt')

const result = fs.rename(oldPath, newPath)
// this file is created after the first "exists" check fails, the following check should pass
void testutil.toFile('hello world', oldPath)
await result
const existsStub = Sinon.stub(FileSystem.prototype, 'exists')
existsStub.onFirstCall().resolves(false)
existsStub.callThrough()

await testutil.toFile('hello world', oldPath)
await fs.rename(oldPath, newPath)

testutil.assertTelemetry('ide_fileSystem', {
action: 'rename',
result: 'Succeeded',
reason: 'RenameRaceCondition',
})

existsStub.restore()
})
})

Expand Down

0 comments on commit 30face9

Please sign in to comment.