diff options
Diffstat (limited to 'test/js/node/process/process-nexttick.test.js')
-rw-r--r-- | test/js/node/process/process-nexttick.test.js | 950 |
1 files changed, 943 insertions, 7 deletions
diff --git a/test/js/node/process/process-nexttick.test.js b/test/js/node/process/process-nexttick.test.js index becf3c236..6f1eee6ba 100644 --- a/test/js/node/process/process-nexttick.test.js +++ b/test/js/node/process/process-nexttick.test.js @@ -1,4 +1,8 @@ -import { it } from "bun:test"; +// Running this file in jest/vitest does not work as expected. Jest & Vitest +// mess with timers, producing unreliable results. You must manually test this +// in Node. +import { test, expect, it } from "bun:test"; +const isBun = !!process.versions.bun; it("process.nextTick", async () => { // You can verify this test is correct by copy pasting this into a browser's console and checking it doesn't throw an error. @@ -52,25 +56,35 @@ it("process.nextTick", async () => { }); { - var passed = false; + let passed = false; try { queueMicrotask(1234); } catch (exception) { - passed = exception instanceof TypeError; + if (isBun) { + passed = exception instanceof TypeError; + } else { + // Node.js throws a non-TypeError TypeError + passed = exception instanceof Error && exception.name === "TypeError"; + } } - if (!passed) throw new Error("queueMicrotask should throw a TypeError if the argument is not a function"); + if (!passed) throw new Error("1: queueMicrotask should throw a TypeError if the argument is not a function"); } { - var passed = false; + let passed = false; try { queueMicrotask(); } catch (exception) { - passed = exception instanceof TypeError; + if (isBun) { + passed = exception instanceof TypeError; + } else { + // Node.js throws a non-TypeError TypeError + passed = exception instanceof Error && exception.name === "TypeError"; + } } - if (!passed) throw new Error("queueMicrotask should throw a TypeError if the argument is empty"); + if (!passed) throw new Error("2: queueMicrotask should throw a TypeError if the argument is empty"); } }); @@ -97,3 +111,925 @@ it("process.nextTick 5 args", async () => { }, ...args); }); }); + +it("process.nextTick runs after queueMicrotask", async () => { + var resolve; + var promise = new Promise(_resolve => { + resolve = _resolve; + }); + + const order = []; + var nextTickI = 0; + var microtaskI = 0; + var remaining = 400; + var runs = []; + for (let i = 0; i < 100; i++) { + queueMicrotask(() => { + runs.push(queueMicrotask.name); + order.push("queueMicrotask " + microtaskI++); + if (--remaining === 0) resolve(order); + }); + process.nextTick(() => { + runs.push(process.nextTick.name); + order.push("process.nextTick " + nextTickI++); + if (--remaining === 0) resolve(order); + }); + } + + for (let i = 0; i < 100; i++) { + queueMicrotask(() => { + runs.push(queueMicrotask.name); + order.push("queueMicrotask " + microtaskI++); + if (--remaining === 0) resolve(order); + }); + } + + for (let i = 0; i < 100; i++) { + process.nextTick(() => { + runs.push(process.nextTick.name); + order.push("process.nextTick " + nextTickI++); + if (--remaining === 0) resolve(order); + }); + } + + await promise; + expect({ + order, + runs, + }).toEqual({ + "order": [ + "process.nextTick 0", + "process.nextTick 1", + "process.nextTick 2", + "process.nextTick 3", + "process.nextTick 4", + "process.nextTick 5", + "process.nextTick 6", + "process.nextTick 7", + "process.nextTick 8", + "process.nextTick 9", + "process.nextTick 10", + "process.nextTick 11", + "process.nextTick 12", + "process.nextTick 13", + "process.nextTick 14", + "process.nextTick 15", + "process.nextTick 16", + "process.nextTick 17", + "process.nextTick 18", + "process.nextTick 19", + "process.nextTick 20", + "process.nextTick 21", + "process.nextTick 22", + "process.nextTick 23", + "process.nextTick 24", + "process.nextTick 25", + "process.nextTick 26", + "process.nextTick 27", + "process.nextTick 28", + "process.nextTick 29", + "process.nextTick 30", + "process.nextTick 31", + "process.nextTick 32", + "process.nextTick 33", + "process.nextTick 34", + "process.nextTick 35", + "process.nextTick 36", + "process.nextTick 37", + "process.nextTick 38", + "process.nextTick 39", + "process.nextTick 40", + "process.nextTick 41", + "process.nextTick 42", + "process.nextTick 43", + "process.nextTick 44", + "process.nextTick 45", + "process.nextTick 46", + "process.nextTick 47", + "process.nextTick 48", + "process.nextTick 49", + "process.nextTick 50", + "process.nextTick 51", + "process.nextTick 52", + "process.nextTick 53", + "process.nextTick 54", + "process.nextTick 55", + "process.nextTick 56", + "process.nextTick 57", + "process.nextTick 58", + "process.nextTick 59", + "process.nextTick 60", + "process.nextTick 61", + "process.nextTick 62", + "process.nextTick 63", + "process.nextTick 64", + "process.nextTick 65", + "process.nextTick 66", + "process.nextTick 67", + "process.nextTick 68", + "process.nextTick 69", + "process.nextTick 70", + "process.nextTick 71", + "process.nextTick 72", + "process.nextTick 73", + "process.nextTick 74", + "process.nextTick 75", + "process.nextTick 76", + "process.nextTick 77", + "process.nextTick 78", + "process.nextTick 79", + "process.nextTick 80", + "process.nextTick 81", + "process.nextTick 82", + "process.nextTick 83", + "process.nextTick 84", + "process.nextTick 85", + "process.nextTick 86", + "process.nextTick 87", + "process.nextTick 88", + "process.nextTick 89", + "process.nextTick 90", + "process.nextTick 91", + "process.nextTick 92", + "process.nextTick 93", + "process.nextTick 94", + "process.nextTick 95", + "process.nextTick 96", + "process.nextTick 97", + "process.nextTick 98", + "process.nextTick 99", + "process.nextTick 100", + "process.nextTick 101", + "process.nextTick 102", + "process.nextTick 103", + "process.nextTick 104", + "process.nextTick 105", + "process.nextTick 106", + "process.nextTick 107", + "process.nextTick 108", + "process.nextTick 109", + "process.nextTick 110", + "process.nextTick 111", + "process.nextTick 112", + "process.nextTick 113", + "process.nextTick 114", + "process.nextTick 115", + "process.nextTick 116", + "process.nextTick 117", + "process.nextTick 118", + "process.nextTick 119", + "process.nextTick 120", + "process.nextTick 121", + "process.nextTick 122", + "process.nextTick 123", + "process.nextTick 124", + "process.nextTick 125", + "process.nextTick 126", + "process.nextTick 127", + "process.nextTick 128", + "process.nextTick 129", + "process.nextTick 130", + "process.nextTick 131", + "process.nextTick 132", + "process.nextTick 133", + "process.nextTick 134", + "process.nextTick 135", + "process.nextTick 136", + "process.nextTick 137", + "process.nextTick 138", + "process.nextTick 139", + "process.nextTick 140", + "process.nextTick 141", + "process.nextTick 142", + "process.nextTick 143", + "process.nextTick 144", + "process.nextTick 145", + "process.nextTick 146", + "process.nextTick 147", + "process.nextTick 148", + "process.nextTick 149", + "process.nextTick 150", + "process.nextTick 151", + "process.nextTick 152", + "process.nextTick 153", + "process.nextTick 154", + "process.nextTick 155", + "process.nextTick 156", + "process.nextTick 157", + "process.nextTick 158", + "process.nextTick 159", + "process.nextTick 160", + "process.nextTick 161", + "process.nextTick 162", + "process.nextTick 163", + "process.nextTick 164", + "process.nextTick 165", + "process.nextTick 166", + "process.nextTick 167", + "process.nextTick 168", + "process.nextTick 169", + "process.nextTick 170", + "process.nextTick 171", + "process.nextTick 172", + "process.nextTick 173", + "process.nextTick 174", + "process.nextTick 175", + "process.nextTick 176", + "process.nextTick 177", + "process.nextTick 178", + "process.nextTick 179", + "process.nextTick 180", + "process.nextTick 181", + "process.nextTick 182", + "process.nextTick 183", + "process.nextTick 184", + "process.nextTick 185", + "process.nextTick 186", + "process.nextTick 187", + "process.nextTick 188", + "process.nextTick 189", + "process.nextTick 190", + "process.nextTick 191", + "process.nextTick 192", + "process.nextTick 193", + "process.nextTick 194", + "process.nextTick 195", + "process.nextTick 196", + "process.nextTick 197", + "process.nextTick 198", + "process.nextTick 199", + "queueMicrotask 0", + "queueMicrotask 1", + "queueMicrotask 2", + "queueMicrotask 3", + "queueMicrotask 4", + "queueMicrotask 5", + "queueMicrotask 6", + "queueMicrotask 7", + "queueMicrotask 8", + "queueMicrotask 9", + "queueMicrotask 10", + "queueMicrotask 11", + "queueMicrotask 12", + "queueMicrotask 13", + "queueMicrotask 14", + "queueMicrotask 15", + "queueMicrotask 16", + "queueMicrotask 17", + "queueMicrotask 18", + "queueMicrotask 19", + "queueMicrotask 20", + "queueMicrotask 21", + "queueMicrotask 22", + "queueMicrotask 23", + "queueMicrotask 24", + "queueMicrotask 25", + "queueMicrotask 26", + "queueMicrotask 27", + "queueMicrotask 28", + "queueMicrotask 29", + "queueMicrotask 30", + "queueMicrotask 31", + "queueMicrotask 32", + "queueMicrotask 33", + "queueMicrotask 34", + "queueMicrotask 35", + "queueMicrotask 36", + "queueMicrotask 37", + "queueMicrotask 38", + "queueMicrotask 39", + "queueMicrotask 40", + "queueMicrotask 41", + "queueMicrotask 42", + "queueMicrotask 43", + "queueMicrotask 44", + "queueMicrotask 45", + "queueMicrotask 46", + "queueMicrotask 47", + "queueMicrotask 48", + "queueMicrotask 49", + "queueMicrotask 50", + "queueMicrotask 51", + "queueMicrotask 52", + "queueMicrotask 53", + "queueMicrotask 54", + "queueMicrotask 55", + "queueMicrotask 56", + "queueMicrotask 57", + "queueMicrotask 58", + "queueMicrotask 59", + "queueMicrotask 60", + "queueMicrotask 61", + "queueMicrotask 62", + "queueMicrotask 63", + "queueMicrotask 64", + "queueMicrotask 65", + "queueMicrotask 66", + "queueMicrotask 67", + "queueMicrotask 68", + "queueMicrotask 69", + "queueMicrotask 70", + "queueMicrotask 71", + "queueMicrotask 72", + "queueMicrotask 73", + "queueMicrotask 74", + "queueMicrotask 75", + "queueMicrotask 76", + "queueMicrotask 77", + "queueMicrotask 78", + "queueMicrotask 79", + "queueMicrotask 80", + "queueMicrotask 81", + "queueMicrotask 82", + "queueMicrotask 83", + "queueMicrotask 84", + "queueMicrotask 85", + "queueMicrotask 86", + "queueMicrotask 87", + "queueMicrotask 88", + "queueMicrotask 89", + "queueMicrotask 90", + "queueMicrotask 91", + "queueMicrotask 92", + "queueMicrotask 93", + "queueMicrotask 94", + "queueMicrotask 95", + "queueMicrotask 96", + "queueMicrotask 97", + "queueMicrotask 98", + "queueMicrotask 99", + "queueMicrotask 100", + "queueMicrotask 101", + "queueMicrotask 102", + "queueMicrotask 103", + "queueMicrotask 104", + "queueMicrotask 105", + "queueMicrotask 106", + "queueMicrotask 107", + "queueMicrotask 108", + "queueMicrotask 109", + "queueMicrotask 110", + "queueMicrotask 111", + "queueMicrotask 112", + "queueMicrotask 113", + "queueMicrotask 114", + "queueMicrotask 115", + "queueMicrotask 116", + "queueMicrotask 117", + "queueMicrotask 118", + "queueMicrotask 119", + "queueMicrotask 120", + "queueMicrotask 121", + "queueMicrotask 122", + "queueMicrotask 123", + "queueMicrotask 124", + "queueMicrotask 125", + "queueMicrotask 126", + "queueMicrotask 127", + "queueMicrotask 128", + "queueMicrotask 129", + "queueMicrotask 130", + "queueMicrotask 131", + "queueMicrotask 132", + "queueMicrotask 133", + "queueMicrotask 134", + "queueMicrotask 135", + "queueMicrotask 136", + "queueMicrotask 137", + "queueMicrotask 138", + "queueMicrotask 139", + "queueMicrotask 140", + "queueMicrotask 141", + "queueMicrotask 142", + "queueMicrotask 143", + "queueMicrotask 144", + "queueMicrotask 145", + "queueMicrotask 146", + "queueMicrotask 147", + "queueMicrotask 148", + "queueMicrotask 149", + "queueMicrotask 150", + "queueMicrotask 151", + "queueMicrotask 152", + "queueMicrotask 153", + "queueMicrotask 154", + "queueMicrotask 155", + "queueMicrotask 156", + "queueMicrotask 157", + "queueMicrotask 158", + "queueMicrotask 159", + "queueMicrotask 160", + "queueMicrotask 161", + "queueMicrotask 162", + "queueMicrotask 163", + "queueMicrotask 164", + "queueMicrotask 165", + "queueMicrotask 166", + "queueMicrotask 167", + "queueMicrotask 168", + "queueMicrotask 169", + "queueMicrotask 170", + "queueMicrotask 171", + "queueMicrotask 172", + "queueMicrotask 173", + "queueMicrotask 174", + "queueMicrotask 175", + "queueMicrotask 176", + "queueMicrotask 177", + "queueMicrotask 178", + "queueMicrotask 179", + "queueMicrotask 180", + "queueMicrotask 181", + "queueMicrotask 182", + "queueMicrotask 183", + "queueMicrotask 184", + "queueMicrotask 185", + "queueMicrotask 186", + "queueMicrotask 187", + "queueMicrotask 188", + "queueMicrotask 189", + "queueMicrotask 190", + "queueMicrotask 191", + "queueMicrotask 192", + "queueMicrotask 193", + "queueMicrotask 194", + "queueMicrotask 195", + "queueMicrotask 196", + "queueMicrotask 197", + "queueMicrotask 198", + "queueMicrotask 199", + ], + "runs": [ + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "nextTick", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + "queueMicrotask", + ], + }); +}); + +it("process.nextTick can be called 100,000 times", async () => { + var county = 0; + function ticky() { + county++; + } + for (let i = 0; i < 100_000; i++) { + process.nextTick(ticky); + } + + await 1; + expect(county).toBe(100_000); +}); + +it("process.nextTick works more than once", async () => { + var county = 0; + function ticky() { + county++; + } + for (let i = 0; i < 1000; i++) { + process.nextTick(ticky); + await 1; + } + expect(county).toBe(1); + await new Promise(resolve => setTimeout(resolve, 0)); + expect(county).toBe(1000); +}); + +// `enterWith` is problematic because it and `nextTick` both rely on +// JSC's `global.onEachMicrotaskTick`, and this test is designed to +// cover what happens when both are active +it("process.nextTick and AsyncLocalStorage.enterWith don't conflict", async () => { + const AsyncLocalStorage = require("async_hooks").AsyncLocalStorage; + const t = require("timers/promises"); + const storage = new AsyncLocalStorage(); + + let call1 = false; + let call2 = false; + + process.nextTick(() => (call1 = true)); + + const p = Promise.withResolvers(); + const p2 = p.promise.then(() => { + return storage.getStore(); // should not leak "hello" + }); + const promise = Promise.resolve().then(async () => { + storage.enterWith("hello"); + process.nextTick(() => (call2 = true)); + + let didCall = false; + let value = null; + function ticky() { + didCall = true; + value = storage.getStore(); + } + process.nextTick(ticky); + await t.setTimeout(1); + expect(didCall).toBe(true); + expect(value).toBe("hello"); + expect(storage.getStore()).toBe("hello"); + }); + + expect(storage.getStore()).toBe(undefined); + await promise; + p.resolve(); + expect(await p2).toBe(undefined); + + expect(call1).toBe(true); + expect(call2).toBe(true); +}); |