diff options
author | 2022-07-01 03:25:17 -0700 | |
---|---|---|
committer | 2022-07-01 03:25:17 -0700 | |
commit | 13e2ac08bd768485f1425e74b4184e36605e4c4c (patch) | |
tree | 0d1f2cfd6ff76203974312070c4dcec79441cc53 | |
parent | 589993192a205a6abd789b73ece6e0bc2421ac93 (diff) | |
download | bun-13e2ac08bd768485f1425e74b4184e36605e4c4c.tar.gz bun-13e2ac08bd768485f1425e74b4184e36605e4c4c.tar.zst bun-13e2ac08bd768485f1425e74b4184e36605e4c4c.zip |
Add some tests for error handling
-rw-r--r-- | test/bun.js/serve.test.ts | 188 |
1 files changed, 187 insertions, 1 deletions
diff --git a/test/bun.js/serve.test.ts b/test/bun.js/serve.test.ts index dd491c297..8961372c1 100644 --- a/test/bun.js/serve.test.ts +++ b/test/bun.js/serve.test.ts @@ -3,9 +3,88 @@ import { describe, expect, it } from "bun:test"; import { readFileSync } from "fs"; import { resolve } from "path"; -var port = 40000; +var port = 40001; + +class TestPass extends Error { + constructor(message) { + super(message); + this.name = "TestPass"; + } +} describe("streaming", () => { + describe("error handler", () => { + it("throw on pull reports an error and close the connection", async () => { + var server; + try { + var pass = false; + server = serve({ + port: port++, + development: false, + error(e) { + pass = true; + return new Response("fail", { status: 500 }); + }, + + fetch(req) { + return new Response( + new ReadableStream({ + pull(controller) { + throw new Error("error"); + }, + }) + ); + }, + }); + + const response = await fetch(`http://localhost:${server.port}`); + if (response.status > 0) expect(response.status).toBe(500); + expect(await response.text()).toBe("fail"); + expect(pass).toBe(true); + } catch (e) { + throw e; + } finally { + server?.stop(); + } + }); + + it("throw on pull after writing should not call the error handler", async () => { + var server; + try { + var pass = true; + server = serve({ + port: port++, + development: false, + error(e) { + pass = false; + return new Response("fail", { status: 500 }); + }, + + fetch(req) { + return new Response( + new ReadableStream({ + pull(controller) { + controller.enqueue("such fail"); + throw new Error("error"); + }, + }) + ); + }, + }); + + const response = await fetch(`http://localhost:${server.port}`); + // connection terminated + if (response.status > 0) expect(response.status).toBe(200); + expect(await response.text()).toBe("such fail"); + expect(pass).toBe(true); + } catch (e) { + throw e; + } finally { + server?.stop(); + } + }); + }); + it("text from JS, one chunk", async () => { const relative = new URL("./fetch.js.txt", import.meta.url); const textToExpect = readFileSync(relative, "utf-8"); @@ -53,6 +132,68 @@ describe("streaming", () => { server.stop(); }); + it("text from JS throws on start no error handler", async () => { + var server; + try { + var pass = false; + server = serve({ + port: port++, + development: false, + fetch(req) { + return new Response( + new ReadableStream({ + start(controller) { + throw new TestPass("Test Passed"); + }, + }) + ); + }, + }); + + const response = await fetch(`http://localhost:${server.port}`); + expect(response.status).toBe(500); + } catch (e) { + if (!e || !(e instanceof TestPass)) { + throw e; + } + } finally { + server?.stop(); + } + }); + + it("text from JS throws on start has error handler", async () => { + var server; + try { + var pass = false; + server = serve({ + port: port++, + development: false, + error(e) { + pass = true; + return new Response("Fail", { status: 500 }); + }, + fetch(req) { + return new Response( + new ReadableStream({ + start(controller) { + throw new Error("error"); + }, + }) + ); + }, + }); + + const response = await fetch(`http://localhost:${server.port}`); + expect(response.status).toBe(500); + expect(await response.text()).toBe("Fail"); + expect(pass).toBe(true); + } catch (e) { + throw e; + } finally { + server?.stop(); + } + }); + it("text from JS, 2 chunks, with delay", async () => { const fixture = resolve(import.meta.dir, "./fetch.js.txt"); const textToExpect = readFileSync(fixture, "utf-8"); @@ -301,3 +442,48 @@ it(`should work for a file ${count} times serial`, async () => { server.stop(); }); + +var count = 50; +it(`should work for text ${count} times serial`, async () => { + const textToExpect = "hello"; + var ran = 0; + const server = serve({ + port: port++, + fetch(req) { + return new Response(textToExpect); + }, + }); + + // this gets stuck if run about 200 times awaiting all the promises + // when the promises are run altogether, instead of one at a time + // it's hard to say if this only happens here due to some weird stuff with the test runner + // or if it's "real" issue + for (let i = 0; i < count; i++) { + const response = await fetch(`http://localhost:${server.port}`); + expect(await response.text()).toBe(textToExpect); + } + + server.stop(); +}); + +it(`should work for ArrayBuffer ${count} times serial`, async () => { + const textToExpect = "hello"; + var ran = 0; + const server = serve({ + port: port++, + fetch(req) { + return new Response(new TextEncoder().encode(textToExpect)); + }, + }); + + // this gets stuck if run about 200 times awaiting all the promises + // when the promises are run altogether, instead of one at a time + // it's hard to say if this only happens here due to some weird stuff with the test runner + // or if it's "real" issue + for (let i = 0; i < count; i++) { + const response = await fetch(`http://localhost:${server.port}`); + expect(await response.text()).toBe(textToExpect); + } + + server.stop(); +}); |