diff options
author | 2023-01-27 01:56:07 -0800 | |
---|---|---|
committer | 2023-01-27 01:56:07 -0800 | |
commit | b136125bb0ad8b66e92322c143094deee4996bcd (patch) | |
tree | a72ac5c671707f0b5c86e35c81ab09ec8fc18564 /test/bun.js/hot.test.ts | |
parent | 1da7f5fe5defb1294ffe4eb646c71b852b044d72 (diff) | |
download | bun-b136125bb0ad8b66e92322c143094deee4996bcd.tar.gz bun-b136125bb0ad8b66e92322c143094deee4996bcd.tar.zst bun-b136125bb0ad8b66e92322c143094deee4996bcd.zip |
[`[bun hot]`] More reliability improvements to macOS watcher
Diffstat (limited to '')
-rw-r--r-- | test/bun.js/hot.test.ts | 88 |
1 files changed, 79 insertions, 9 deletions
diff --git a/test/bun.js/hot.test.ts b/test/bun.js/hot.test.ts index c7c8d0524..97dff6d91 100644 --- a/test/bun.js/hot.test.ts +++ b/test/bun.js/hot.test.ts @@ -39,7 +39,7 @@ it("should hot reload when file is overwritten", async () => { break; } - expect(str).toContain(`[#!root] Reloaded: ${reloadCounter}`); + expect(line).toContain(`[#!root] Reloaded: ${reloadCounter}`); any = true; } @@ -49,6 +49,73 @@ it("should hot reload when file is overwritten", async () => { expect(reloadCounter).toBe(3); }); +it("should recover from errors", async () => { + const root = import.meta.dir + "/hot-runner.js"; + const runner = spawn({ + cmd: [bunExe(), "--hot", "run", root], + env: bunEnv, + stdout: "pipe", + stderr: "pipe", + stdin: "ignore", + }); + + let reloadCounter = 0; + const input = readFileSync(root, "utf-8"); + function onReloadGood() { + writeFileSync(root, input); + } + + function onReloadError() { + writeFileSync(root, "throw new Error('error');\n"); + } + + var queue = [onReloadError, onReloadGood, onReloadError, onReloadGood]; + var errors: string[] = []; + var onError; + (async () => { + for await (let line of runner.stderr!) { + var str = new TextDecoder().decode(line); + errors.push(str); + onError && onError(str); + } + })(); + + for await (const line of runner.stdout!) { + var str = new TextDecoder().decode(line); + var any = false; + for (let line of str.split("\n")) { + if (!line.includes("[#!root]")) continue; + reloadCounter++; + + if (reloadCounter === 3) { + runner.unref(); + runner.kill(); + break; + } + + expect(line).toContain(`[#!root] Reloaded: ${reloadCounter}`); + any = true; + } + + if (any) { + queue.shift()!(); + await new Promise<void>((resolve, reject) => { + if (errors.length > 0) { + errors.length = 0; + resolve(); + return; + } + + onError = resolve; + }); + + queue.shift()!(); + } + } + + expect(reloadCounter).toBe(3); +}); + it("should not hot reload when a random file is written", async () => { const root = import.meta.dir + "/hot-runner.js"; const runner = spawn({ @@ -59,16 +126,16 @@ it("should not hot reload when a random file is written", async () => { stdin: "ignore", }); - var reloadCounter = 0; - + let reloadCounter = 0; + const code = readFileSync(root, "utf-8"); async function onReload() { - writeFileSync(root + ".another.yet.js", readFileSync(root, "utf-8")); + writeFileSync(root + ".another.yet.js", code); unlinkSync(root + ".another.yet.js"); } var waiter = new Promise<void>((resolve, reject) => { setTimeout(async () => { resolve(); - }, 10); + }, 50); }); var finished = false; await Promise.race([ @@ -85,10 +152,13 @@ it("should not hot reload when a random file is written", async () => { var str = new TextDecoder().decode(line); for (let line of str.split("\n")) { if (!line.includes("[#!root]")) continue; + if (finished) { + return; + } await onReload(); reloadCounter++; - expect(str).toContain(`[#!root] Reloaded: ${reloadCounter}`); + expect(line).toContain(`[#!root] Reloaded: ${reloadCounter}`); } } })(), @@ -97,7 +167,7 @@ it("should not hot reload when a random file is written", async () => { runner.kill(0); runner.unref(); - expect(reloadCounter).toBe(0); + expect(reloadCounter).toBe(1); }); it("should hot reload when a file is deleted and rewritten", async () => { @@ -131,7 +201,7 @@ it("should hot reload when a file is deleted and rewritten", async () => { break; } - expect(str).toContain(`[#!root] Reloaded: ${reloadCounter}`); + expect(line).toContain(`[#!root] Reloaded: ${reloadCounter}`); any = true; } @@ -176,7 +246,7 @@ it("should hot reload when a file is renamed() into place", async () => { break; } - expect(str).toContain(`[#!root] Reloaded: ${reloadCounter}`); + expect(line).toContain(`[#!root] Reloaded: ${reloadCounter}`); any = true; } |