diff options
author | 2023-03-01 18:15:52 -0300 | |
---|---|---|
committer | 2023-03-01 13:15:52 -0800 | |
commit | cf8568ccff4ba5f6e54e8e3b552468069b68bc9e (patch) | |
tree | da6e4088eda132fd59c3874cd49de8a38af020d1 /test/bun.js/bun-server.test.ts | |
parent | 56ca48ece88c0de854ec20c5e71a639fee6ccb0f (diff) | |
download | bun-cf8568ccff4ba5f6e54e8e3b552468069b68bc9e.tar.gz bun-cf8568ccff4ba5f6e54e8e3b552468069b68bc9e.tar.zst bun-cf8568ccff4ba5f6e54e8e3b552468069b68bc9e.zip |
fix deinit behavior when connection is aborted using ResponseStream and abort event behavior (#2252)
* fix deinit behavior when connection is aborted using ResponseStream
* fix abort handling on stream, and get better tests
* avoid segfault by trying to deinit 2x when aborted
* make tests more reliable
* more reliable onResolveStream after aborted
* add test case for not firing the abort signal
Diffstat (limited to 'test/bun.js/bun-server.test.ts')
-rw-r--r-- | test/bun.js/bun-server.test.ts | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/test/bun.js/bun-server.test.ts b/test/bun.js/bun-server.test.ts index d5aae537e..6e0eab6fd 100644 --- a/test/bun.js/bun-server.test.ts +++ b/test/bun.js/bun-server.test.ts @@ -48,4 +48,118 @@ describe("Server", () => { server.stop(true); } }); + + test("abort signal on server should only fire if aborted", async () => { + { + const abortController = new AbortController(); + + let signalOnServer = false; + const server = Bun.serve({ + async fetch(req) { + req.signal.addEventListener("abort", () => { + signalOnServer = true; + }); + return new Response("Hello"); + }, + port: 0, + }); + + try { + await fetch(`http://${server.hostname}:${server.port}`, { signal: abortController.signal }); + } catch {} + expect(signalOnServer).toBe(false); + server.stop(true); + } + }); + + test("abort signal on server with direct stream", async () => { + { + let signalOnServer = false; + const abortController = new AbortController(); + + const server = Bun.serve({ + async fetch(req) { + req.signal.addEventListener("abort", () => { + signalOnServer = true; + }); + return new Response( + new ReadableStream({ + type: "direct", + async pull(controller) { + abortController.abort(); + + const buffer = await Bun.file(import.meta.dir + "/fixture.html.gz").arrayBuffer(); + controller.write(buffer); + + //wait to detect the connection abortion + await Bun.sleep(15); + + controller.close(); + }, + }), + { + headers: { + "Content-Encoding": "gzip", + "Content-Type": "text/html; charset=utf-8", + "Content-Length": "1", + }, + }, + ); + }, + port: 0, + }); + + try { + await fetch(`http://${server.hostname}:${server.port}`, { signal: abortController.signal }); + } catch {} + await Bun.sleep(10); + expect(signalOnServer).toBe(true); + server.stop(true); + } + }); + + test("abort signal on server with stream", async () => { + { + let signalOnServer = false; + const abortController = new AbortController(); + + const server = Bun.serve({ + async fetch(req) { + req.signal.addEventListener("abort", () => { + signalOnServer = true; + }); + return new Response( + new ReadableStream({ + async pull(controller) { + abortController.abort(); + + const buffer = await Bun.file(import.meta.dir + "/fixture.html.gz").arrayBuffer(); + controller.enqueue(buffer); + + //wait to detect the connection abortion + await Bun.sleep(15); + + controller.close(); + }, + }), + { + headers: { + "Content-Encoding": "gzip", + "Content-Type": "text/html; charset=utf-8", + "Content-Length": "1", + }, + }, + ); + }, + port: 0, + }); + + try { + await fetch(`http://${server.hostname}:${server.port}`, { signal: abortController.signal }); + } catch {} + await Bun.sleep(10); + expect(signalOnServer).toBe(true); + server.stop(true); + } + }); }); |