aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/hot.test.ts
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-27 01:56:07 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-27 01:56:07 -0800
commitb136125bb0ad8b66e92322c143094deee4996bcd (patch)
treea72ac5c671707f0b5c86e35c81ab09ec8fc18564 /test/bun.js/hot.test.ts
parent1da7f5fe5defb1294ffe4eb646c71b852b044d72 (diff)
downloadbun-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.ts88
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;
}