aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/bun-server.test.ts
diff options
context:
space:
mode:
authorGravatar Ciro Spaciari <ciro.spaciari@gmail.com> 2023-03-01 18:15:52 -0300
committerGravatar GitHub <noreply@github.com> 2023-03-01 13:15:52 -0800
commitcf8568ccff4ba5f6e54e8e3b552468069b68bc9e (patch)
treeda6e4088eda132fd59c3874cd49de8a38af020d1 /test/bun.js/bun-server.test.ts
parent56ca48ece88c0de854ec20c5e71a639fee6ccb0f (diff)
downloadbun-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.ts114
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);
+ }
+ });
});