Skip to content
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

Prevent a ENOENT crash by checking for file existence in jest-message-util #5405

Merged
merged 4 commits into from
Jan 28, 2018

Conversation

niieani
Copy link
Contributor

@niieani niieani commented Jan 27, 2018

Summary

Jest tries to load the stack-trace based on the top frame. The problem is, the filename may be provided by the source-map, which is unreliable since it can point to a non-existent file. In such a case, the code would cause a hard crash of "Test suite failed to run" with a stack-trace pointing at "exports.formatStackTrace", which I have corrected here.

I've run into this issue while migrating webpack, to use jest.
(CC: @ooflorent).

Test plan

Added an integration test for malformed source-maps.
Watch the video comparing before and after.

video comparing before and after

Jest tries to load the stack-trace based on the top frame. The problem is, the filename may be provided by the source-map, which is unreliable since it can point to a non-existent file. In such a case, the code would cause a hard crash of "Test suite failed to run" with a stack-trace pointing at "exports.formatStackTrace", which I have corrected here.
@niieani niieani changed the title Prevent a ENOENT crash by checking for existence Prevent a ENOENT crash by checking for file existence in jest-message-util Jan 27, 2018
@niieani
Copy link
Contributor Author

niieani commented Jan 27, 2018

Note: The fail on Node 8 is not related to this PR.

@@ -227,7 +227,7 @@ export const formatStackTrace = (
if (topFrame) {
const filename = topFrame.file;

if (path.isAbsolute(filename)) {
if (path.isAbsolute(filename) && fs.existsSync(filename)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be better to just catch the readFileSync to save an io operation?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What we should do is check the hastefs cache and just read from that

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See #5087 (comment). Fixing that (ignoring files not in the cache) is the real fix

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@SimenB I don't know how HasteFS works or how to read its cache, however I suspect there could be cases where the file would not appear in it either. One of those cases could be running vm.runInThisContext or vm.runInNewContext from within a test, and the contents of the file is evaled (rather than being read from the disk). Unless that somehow ends up in the HasteFS too? I'm only mentioning it, since it's also exactly what happens in the webpack case.

Could I try/catch the readFileSync for now, so you could ship this bugfix as soon as possible, and we can prepare the proper fix at a later time, since I don't have enough knowledge about HasteFS? Unless it's something really simple, and you could point me to the right place?

Cheers!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not a simple change as we have to somehow thread the cache all the way through.

Sticking the readFileSync in a try should be good enough

CHANGELOG.md Outdated
@@ -7,6 +7,7 @@

### Fixes

* `[jest-message-util]` Prevent an `ENOENT` crash when the test file contained a malformed source-map.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add a link to this PR (and run yarn lint:md to format the file)

@codecov-io
Copy link

Codecov Report

Merging #5405 into master will not change coverage.
The diff coverage is 100%.

Impacted file tree graph

@@           Coverage Diff           @@
##           master    #5405   +/-   ##
=======================================
  Coverage   61.32%   61.32%           
=======================================
  Files         205      205           
  Lines        6925     6925           
  Branches        3        3           
=======================================
  Hits         4247     4247           
  Misses       2677     2677           
  Partials        1        1
Impacted Files Coverage Δ
packages/jest-message-util/src/index.js 84.48% <100%> (ø) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 922b037...76f2999. Read the comment docs.

@niieani
Copy link
Contributor Author

niieani commented Jan 28, 2018

@SimenB I've pushed both changes.

@SimenB
Copy link
Member

SimenB commented Jan 28, 2018

CI is drunk, it doesn't pick up our config...

@github-actions
Copy link

This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.
Please note this issue tracker is not a help forum. We recommend using StackOverflow or our discord channel for questions.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators May 12, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants