Skip to content

Investigate flaky and broken WPT fetch/api/abort tests #4708

@npaun

Description

@npaun

The test fetch/api/abort/general.any.js contains a number of flaky and failing subtests.

Flaky tests

  • Stream errors once aborted, after reading. Underlying connection closed
  • Stream errors once aborted. Underlying connection closed.

An example log of them flaking: https://github.com/cloudflare/workerd/actions/runs/15562755101/job/43819049604?pr=4272#step:11:7935
The relevant part is this, which isn't very helpful:

 [AggregateError: Stream errors once aborted, after reading. Underlying connection closed.] {
  [errors]: [
    Error: Timed out
        at PromiseTest.<anonymous> (eval:536:43)
        at async Promise.all (index 48)
        at async RunnerState.validate (harness/harness:59:9)
        at async runTest (harness/harness:258:5)
  ]
} 
 The following tests unexpectedly failed: [
  "Stream errors once aborted, after reading. Underlying connection closed."
] 

Incorrect behaviour (needs investigating)

  • Aborting rejects with AbortError
  • Aborting rejects with abort reason
  • Already aborted signal rejects immediately
  • Already aborted signal rejects immediately
  • Readable stream synchronously cancels with AbortError if aborted before reading

Signal cloning when a request is cloned

  • Signal state is cloned
  • Signal on request object should also have abort reason
  • Signal on request object

These ones might be improved by enabling request_signal_passthrough and/or enable_request_signal but our behaviour around cloning Requests with abort signals might still be wrong

Error type change

  • response.formData() rejects if already aborted

Should be easy but might need a compat flag

The "rejects if already aborted" tests

  • response.arrayBuffer() rejects if already aborted
  • response.blob() rejects if already aborted
  • response.bytes() rejects if already aborted
  • response.json() rejects if already aborted
  • response.text() rejects if already aborted
  • response.formData() rejects if already aborted
  • Call text() twice on aborted response

These probably all have the same underlying cause.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions