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

[DI] Handle async errors in mocha tests #4991

Merged
merged 3 commits into from
Dec 11, 2024

Conversation

watson
Copy link
Collaborator

@watson watson commented Dec 11, 2024

If an async error is thrown in mocha tests, mocha doesn't see it. Best case, the test will just time out, worst case, it will pass.

In our case, there actually was an error in one of the integration tests, which has gone unnoticed (see 2nd commit).

Example

The following Mocha will never fail even if result isn't 42:

it('should do something', function (done) {
  doSomething((result) => {
    assert.equal(result, 42)
    done()
  })
})

The reason is that assert.equal throws asynchronously because it's inside the doSomething callback, and hence mocha doesn't catch it. I'm aware that in this case, Mocha will instead time out because done isn't called, but there's situations where your test-code contains multiple calls to done and so, the next call to done will end the test and it will not time out (as is evident with the 2nd commit in this PR).

In any case, the normal way to "fix" this is:

it('should do something', function (done) {
  doSomething((result) => {
    try {
      assert.equal(result, 42)
    } catch (err) {
      return done(err)
    }
    done()
  })
})

However, this quickly becomes tedious, if your Mocha tests has a lot of these callbacks. With the addition of the failOnException helper function in this PR, the above code can instead be written like so:

it('should do something', function (done) {
  doSomething(failOnException(done, (result) => {
    assert.equal(result, 42)
    done()
  }))
})

If an async error is thrown in mocha tests, mocha doesn't see it. Best
case, the test will just time out, worst case, it will pass.
@watson watson requested review from a team as code owners December 11, 2024 09:05
@watson watson self-assigned this Dec 11, 2024
Copy link
Collaborator Author

watson commented Dec 11, 2024

Copy link

github-actions bot commented Dec 11, 2024

Overall package size

Self size: 8.23 MB
Deduped: 94.8 MB
No deduping: 95.37 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | @datadog/libdatadog | 0.2.2 | 29.27 MB | 29.27 MB | | @datadog/native-appsec | 8.3.0 | 19.37 MB | 19.38 MB | | @datadog/native-iast-taint-tracking | 3.2.0 | 13.9 MB | 13.91 MB | | @datadog/pprof | 5.4.1 | 9.76 MB | 10.13 MB | | protobufjs | 7.2.5 | 2.77 MB | 5.16 MB | | @datadog/native-iast-rewriter | 2.6.0 | 2.58 MB | 2.72 MB | | @opentelemetry/core | 1.14.0 | 872.87 kB | 1.47 MB | | @datadog/native-metrics | 3.0.1 | 1.06 MB | 1.46 MB | | @opentelemetry/api | 1.8.0 | 1.21 MB | 1.21 MB | | import-in-the-middle | 1.11.2 | 112.74 kB | 826.22 kB | | msgpack-lite | 0.1.26 | 201.16 kB | 281.59 kB | | source-map | 0.7.4 | 226 kB | 226 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | lru-cache | 7.18.3 | 133.92 kB | 133.92 kB | | pprof-format | 2.1.0 | 111.69 kB | 111.69 kB | | @datadog/sketches-js | 2.1.0 | 109.9 kB | 109.9 kB | | semver | 7.6.3 | 95.82 kB | 95.82 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | ignore | 5.3.1 | 51.46 kB | 51.46 kB | | int64-buffer | 0.1.10 | 49.18 kB | 49.18 kB | | shell-quote | 1.8.1 | 44.96 kB | 44.96 kB | | istanbul-lib-coverage | 3.2.0 | 29.34 kB | 29.34 kB | | rfdc | 1.3.1 | 25.21 kB | 25.21 kB | | @isaacs/ttlcache | 1.4.1 | 25.2 kB | 25.2 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | dc-polyfill | 0.1.4 | 23.1 kB | 23.1 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | path-to-regexp | 0.1.12 | 6.6 kB | 6.6 kB | | koalas | 1.0.2 | 6.47 kB | 6.47 kB | | module-details-from-path | 1.0.3 | 4.47 kB | 4.47 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

@pr-commenter
Copy link

pr-commenter bot commented Dec 11, 2024

Benchmarks

Benchmark execution time: 2024-12-11 09:31:52

Comparing candidate commit 56ee3fe in PR branch watson/DEBUG-2614/catch-async-test-exceptions with baseline commit b04ced4 in branch master.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 262 metrics, 4 unstable metrics.

@watson watson merged commit 1a95b0b into master Dec 11, 2024
291 checks passed
@watson watson deleted the watson/DEBUG-2614/catch-async-test-exceptions branch December 11, 2024 11:13
watson added a commit that referenced this pull request Dec 11, 2024
@rochdev rochdev mentioned this pull request Dec 17, 2024
rochdev pushed a commit that referenced this pull request Dec 17, 2024
If an async error is thrown in mocha tests, mocha doesn't see it. Best
case, the test will just time out, worst case, it will pass.
@rochdev rochdev mentioned this pull request Dec 17, 2024
rochdev pushed a commit that referenced this pull request Dec 17, 2024
If an async error is thrown in mocha tests, mocha doesn't see it. Best
case, the test will just time out, worst case, it will pass.
rochdev pushed a commit that referenced this pull request Dec 18, 2024
If an async error is thrown in mocha tests, mocha doesn't see it. Best
case, the test will just time out, worst case, it will pass.
rochdev pushed a commit that referenced this pull request Dec 18, 2024
If an async error is thrown in mocha tests, mocha doesn't see it. Best
case, the test will just time out, worst case, it will pass.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants