diff options
Diffstat (limited to 'cli/tests')
-rw-r--r-- | cli/tests/subdir/busy_worker.js | 8 | ||||
-rw-r--r-- | cli/tests/subdir/racy_worker.js | 21 | ||||
-rw-r--r-- | cli/tests/workers_test.out | 14 | ||||
-rw-r--r-- | cli/tests/workers_test.ts | 77 |
4 files changed, 102 insertions, 18 deletions
diff --git a/cli/tests/subdir/busy_worker.js b/cli/tests/subdir/busy_worker.js new file mode 100644 index 000000000..7deba0321 --- /dev/null +++ b/cli/tests/subdir/busy_worker.js @@ -0,0 +1,8 @@ +self.onmessage = function (_evt) { + // infinite loop + for (let i = 0; true; i++) { + if (i % 1000 == 0) { + postMessage(i); + } + } +}; diff --git a/cli/tests/subdir/racy_worker.js b/cli/tests/subdir/racy_worker.js new file mode 100644 index 000000000..83756b791 --- /dev/null +++ b/cli/tests/subdir/racy_worker.js @@ -0,0 +1,21 @@ +// See issue for details +// https://github.com/denoland/deno/issues/4080 +// +// After first call to `postMessage() this worker schedules +// [close(), postMessage()] ops on the same turn of microtask queue +// (because message is rather big). +// Only single `postMessage()` call should make it +// to host, ie. after calling `close()` no more code should be run. + +setTimeout(() => { + close(); +}, 50); + +while (true) { + await new Promise((done) => { + setTimeout(() => { + postMessage({ buf: new Array(999999) }); + done(); + }); + }); +} diff --git a/cli/tests/workers_test.out b/cli/tests/workers_test.out index efc0ce57c..ca7500917 100644 --- a/cli/tests/workers_test.out +++ b/cli/tests/workers_test.out @@ -1,7 +1,9 @@ -running 4 tests -test workersBasic ... ok [WILDCARD] -test nestedWorker ... ok [WILDCARD] -test workerThrowsWhenExecuting ... ok [WILDCARD] -test workerCanUseFetch ... ok [WILDCARD] +running 6 tests +test worker terminate ... ok [WILDCARD] +test worker nested ... ok [WILDCARD] +test worker throws when executing ... ok [WILDCARD] +test worker fetch API ... ok [WILDCARD] +test worker terminate busy loop ... ok [WILDCARD] +test worker race condition ... ok [WILDCARD] -test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out [WILDCARD] +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out [WILDCARD] diff --git a/cli/tests/workers_test.ts b/cli/tests/workers_test.ts index 42bd96d96..2c56a491c 100644 --- a/cli/tests/workers_test.ts +++ b/cli/tests/workers_test.ts @@ -28,11 +28,10 @@ export function createResolvable<T>(): Resolvable<T> { } Deno.test({ - name: "workersBasic", - // FIXME(bartlomieju): - disableOpSanitizer: true, + name: "worker terminate", fn: async function (): Promise<void> { const promise = createResolvable(); + const jsWorker = new Worker("../tests/subdir/test_worker.js", { type: "module", name: "jsWorker", @@ -59,13 +58,13 @@ Deno.test({ jsWorker.postMessage("Hello World"); await promise; + tsWorker.terminate(); + jsWorker.terminate(); }, }); Deno.test({ - name: "nestedWorker", - // FIXME(bartlomieju): - disableOpSanitizer: true, + name: "worker nested", fn: async function (): Promise<void> { const promise = createResolvable(); @@ -81,13 +80,12 @@ Deno.test({ nestedWorker.postMessage("Hello World"); await promise; + nestedWorker.terminate(); }, }); Deno.test({ - name: "workerThrowsWhenExecuting", - // FIXME(bartlomieju): - disableOpSanitizer: true, + name: "worker throws when executing", fn: async function (): Promise<void> { const promise = createResolvable(); const throwingWorker = new Worker("../tests/subdir/throwing_worker.js", { @@ -102,13 +100,12 @@ Deno.test({ }; await promise; + throwingWorker.terminate(); }, }); Deno.test({ - name: "workerCanUseFetch", - // FIXME(bartlomieju): - disableOpSanitizer: true, + name: "worker fetch API", fn: async function (): Promise<void> { const promise = createResolvable(); @@ -129,5 +126,61 @@ Deno.test({ }; await promise; + fetchingWorker.terminate(); + }, +}); + +Deno.test({ + name: "worker terminate busy loop", + fn: async function (): Promise<void> { + const promise = createResolvable(); + + const busyWorker = new Worker("../tests/subdir/busy_worker.js", { + type: "module", + }); + + let testResult = 0; + + busyWorker.onmessage = (e): void => { + testResult = e.data; + if (testResult >= 10000) { + busyWorker.terminate(); + busyWorker.onmessage = (_e): void => { + throw new Error("unreachable"); + }; + setTimeout(() => { + assertEquals(testResult, 10000); + promise.resolve(); + }, 100); + } + }; + + busyWorker.postMessage("ping"); + await promise; + }, +}); + +Deno.test({ + name: "worker race condition", + fn: async function (): Promise<void> { + // See issue for details + // https://github.com/denoland/deno/issues/4080 + const promise = createResolvable(); + + const racyWorker = new Worker("../tests/subdir/racy_worker.js", { + type: "module", + }); + + racyWorker.onmessage = (e): void => { + assertEquals(e.data.buf.length, 999999); + racyWorker.onmessage = (_e): void => { + throw new Error("unreachable"); + }; + setTimeout(() => { + promise.resolve(); + }, 100); + }; + + await promise; }, }); |