From 8d7104e1a977f44a5b78bcbd6876f2da33899809 Mon Sep 17 00:00:00 2001 From: Khang Date: Tue, 3 Dec 2024 19:59:10 +0100 Subject: [PATCH] chore: more explicit logic in test --- application.test.ts | 28 ++++++++++++++++++++++++---- http_server_native.ts | 8 ++++++-- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/application.test.ts b/application.test.ts index bcf3865..499246d 100644 --- a/application.test.ts +++ b/application.test.ts @@ -1116,7 +1116,10 @@ Deno.test({ const { signal } = controller; const p = app.listen({ signal }); controller.abort(); - assertRejects(async () => await p, "aborted prematurely before 'listen' event"); + assertRejects( + async () => await p, + "aborted prematurely before 'listen' event", + ); teardown(); }, }); @@ -1130,10 +1133,27 @@ Deno.test({ ctx.response.body = "hello world"; }); const { signal } = controller; - app.addEventListener("listen", () => controller.abort()) const p = app.listen({ signal }); - await p; - teardown(); + app.addEventListener("listen", async () => controller.abort()); + const GRACEFUL_TIME = 1000; + let timer: number | undefined; + const raceResult = await Promise.race([ + new Promise(async (resolve) => { + await p; + clearTimeout(timer); + resolve("resolved cleanly"); + }), + new Promise((resolve) => + timer = setTimeout( + () => resolve("likely forever pending"), + GRACEFUL_TIME, + ) + ), + ]); + assert( + raceResult === "resolved cleanly", + `'listen promise' should resolve before ${GRACEFUL_TIME} ms`, + ); }, }); diff --git a/http_server_native.ts b/http_server_native.ts index 2e49f6e..1bb24e0 100644 --- a/http_server_native.ts +++ b/http_server_native.ts @@ -81,7 +81,9 @@ export class Server> const { promise, resolve } = createPromiseWithResolvers(); if (signal?.aborted) { // if user somehow aborted before `listen` is invoked, we throw - return Promise.reject(new Error("aborted prematurely before 'listen' event")); + return Promise.reject( + new Error("aborted prematurely before 'listen' event"), + ); } this.#stream = new ReadableStream({ start: (controller) => { @@ -102,7 +104,9 @@ export class Server> }); // closinng stream, so that the Application listen promise can resolve itself // https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultController/close - signal?.addEventListener("abort", () => controller.close(), { once: true }); + signal?.addEventListener("abort", () => controller.close(), { + once: true, + }); }, });