ladjs / supertest

🕷 Super-agent driven library for testing node.js HTTP servers using a fluent API. Maintained for @forwardemail, @ladjs, @spamscanner, @breejs, @cabinjs, and @lassjs.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[fix] write EPIPE error when attaching a file. (small repro)

eddienubes opened this issue · comments

Describe the bug

Node.js version: v20.11.0

OS version: macOS Sonoma 14.2.1

Description:
When trying to attach 2 cat images (7mb and 560kb) node throws "write EPIPE" error.
The list of facts:

  1. The occurrence is intermittent
  2. Only when the suit of tests is run altogether.
  3. Running individual tests doesn't trigger anything.
  4. Even ridiculously small files (8 bytes) fail because of this.
  5. This scenario is also noticeable on v18 version of node.

A test snippet:

it('should upload cat test 1', async () => {
    const res = await request(app).post('/api')
      .attach('file', 'cat1.png')
      .attach('file2', 'cat2.png');

    expect(res.statusCode).toEqual(200);
    expect(res.body).toEqual({
      message: 'pass!'
    })
});

When I run ~14 of these in a single test suite the error occurs. (The test suit in the repro)
Also, for simplicity of this test suite I didn't use any multipart/form-data parser.

Perhaps, connected to #824 or #491.

We're unable to upgrade our repo with thousands of tests from v16 to v20 or even v18 because of this. Not sure how to proceed. Any advice will be highly appreciated!

Actual behavior

Node throws write EPIPE error supposedly due to how supertest handles streaming of these files.

Error: write EPIPE

    at afterWriteDispatched (node:internal/stream_base_commons:160:15)
    at writevGeneric (node:internal/stream_base_commons:143:3)
    at Socket._writeGeneric (node:net:950:11)
    at Socket._writev (node:net:959:8)
    at doWrite (node:internal/streams/writable:588:12)
    at clearBuffer (node:internal/streams/writable:765:5)
    at Socket.Writable.uncork (node:internal/streams/writable:523:7)
    at connectionCorkNT (node:_http_outgoing:955:8)
    at processTicksAndRejections (node:internal/process/task_queues:81:21)

Expected behavior

Should upload files without this error occurring.

Code to reproduce

A small repo with a test to reproduce the issue:
https://github.com/eddienubes/supertest-write-epipe-bug-repro

Checklist

  • I have searched through GitHub issues for similar issues.
  • I have completely read through the README and documentation.
  • I have tested my code with the latest version of Node.js and this package and confirmed it is still not working.