You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.7 KiB
133 lines
3.7 KiB
import { MessageChannel } from 'worker_threads';
|
|
import Piscina from '..';
|
|
import { test } from 'tap';
|
|
import { resolve } from 'path';
|
|
|
|
test('postTask() can transfer ArrayBuffer instances', async ({ equal }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/simple-isworkerthread.ts')
|
|
});
|
|
|
|
const ab = new ArrayBuffer(40);
|
|
await pool.runTask({ ab }, [ab]);
|
|
equal(pool.completed, 1);
|
|
equal(ab.byteLength, 0);
|
|
});
|
|
|
|
test('postTask() can transfer ArrayBuffer instances', async ({ equal }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/simple-isworkerthread.ts')
|
|
});
|
|
|
|
const ab = new ArrayBuffer(40);
|
|
await pool.run({ ab }, { transferList: [ab] });
|
|
equal(pool.completed, 1);
|
|
equal(ab.byteLength, 0);
|
|
});
|
|
|
|
test('postTask() cannot clone build-in objects', async ({ rejects }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/simple-isworkerthread.ts')
|
|
});
|
|
|
|
const obj = new MessageChannel().port1;
|
|
rejects(pool.runTask({ obj }));
|
|
});
|
|
|
|
test('postTask() resolves with a rejection when the handler rejects', async ({ rejects }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval.js')
|
|
});
|
|
|
|
rejects(pool.runTask('Promise.reject(new Error("foo"))'), /foo/);
|
|
});
|
|
|
|
test('postTask() resolves with a rejection when the handler throws', async ({ rejects }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval.js')
|
|
});
|
|
|
|
rejects(pool.runTask('throw new Error("foo")'), /foo/);
|
|
});
|
|
|
|
test('postTask() validates transferList', async ({ rejects }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval.js')
|
|
});
|
|
|
|
rejects(pool.runTask('0', 42 as any),
|
|
/transferList argument must be an Array/);
|
|
|
|
rejects(pool.run('0', { transferList: 42 as any }),
|
|
/transferList argument must be an Array/);
|
|
});
|
|
|
|
test('postTask() validates filename', async ({ rejects }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval.js')
|
|
});
|
|
|
|
rejects(pool.runTask('0', [], 42 as any),
|
|
/filename argument must be a string/);
|
|
|
|
rejects(pool.run('0', { filename: 42 as any }),
|
|
/filename argument must be a string/);
|
|
});
|
|
|
|
test('postTask() validates name', async ({ rejects }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval.js')
|
|
});
|
|
|
|
rejects(pool.run('0', { name: 42 as any }),
|
|
/name argument must be a string/);
|
|
});
|
|
|
|
test('postTask() validates abortSignal', async ({ rejects }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval.js')
|
|
});
|
|
|
|
rejects(pool.runTask('0', [], undefined, 42 as any),
|
|
/signal argument must be an object/);
|
|
|
|
rejects(pool.run('0', { signal: 42 as any }),
|
|
/signal argument must be an object/);
|
|
});
|
|
|
|
test('Piscina emits drain', async ({ ok }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval.js')
|
|
});
|
|
|
|
let drained = false;
|
|
pool.on('drain', () => {
|
|
drained = true;
|
|
});
|
|
|
|
await Promise.all([pool.runTask('123'), pool.runTask('123')]);
|
|
|
|
ok(drained);
|
|
});
|
|
|
|
test('Piscina can use async loaded workers', async ({ equal }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval-async.js')
|
|
});
|
|
equal(await pool.runTask('1'), 1);
|
|
});
|
|
|
|
test('Piscina can use async loaded esm workers', {}, async ({ equal }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/esm-async.mjs')
|
|
});
|
|
equal(await pool.runTask('1'), 1);
|
|
});
|
|
|
|
test('Piscina.run options is correct type', async ({ rejects }) => {
|
|
const pool = new Piscina({
|
|
filename: resolve(__dirname, 'fixtures/eval.js')
|
|
});
|
|
|
|
rejects(pool.run(42, 1 as any), /options must be an object/);
|
|
});
|