1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import Piscina from '..';
- import { test } from 'tap';
- import { resolve } from 'path';
- import { once } from 'events';
- test('uncaught exception resets Worker', async ({ rejects }) => {
- const pool = new Piscina({
- filename: resolve(__dirname, 'fixtures/eval.js')
- });
- await rejects(pool.runTask('throw new Error("not_caught")'), /not_caught/);
- });
- test('uncaught exception in immediate resets Worker', async ({ rejects }) => {
- const pool = new Piscina({
- filename: resolve(__dirname, 'fixtures/eval.js')
- });
- await rejects(
- pool.runTask(`
- setImmediate(() => { throw new Error("not_caught") });
- new Promise(() => {}) /* act as if we were doing some work */
- `), /not_caught/);
- });
- test('uncaught exception in immediate after task yields error event', async ({ equal }) => {
- const pool = new Piscina({
- filename: resolve(__dirname, 'fixtures/eval.js'),
- maxThreads: 1,
- useAtomics: false
- });
- const errorEvent : Promise<Error[]> = once(pool, 'error');
- const taskResult = pool.runTask(`
- setTimeout(() => { throw new Error("not_caught") }, 500);
- 42
- `);
- equal(await taskResult, 42);
- // Hack a bit to make sure we get the 'exit'/'error' events.
- equal(pool.threads.length, 1);
- pool.threads[0].ref();
- // This is the main assertion here.
- equal((await errorEvent)[0].message, 'not_caught');
- });
- test('exiting process resets worker', async ({ not, rejects }) => {
- const pool = new Piscina({
- filename: resolve(__dirname, 'fixtures/eval.js'),
- minThreads: 1
- });
- const originalThreadId = pool.threads[0].threadId;
- await rejects(pool.runTask('process.exit(1);'), /worker exited with code: 1/);
- const newThreadId = pool.threads[0].threadId;
- not(originalThreadId, newThreadId);
- });
- test('exiting process in immediate after task errors next task and resets worker', async ({ equal, not, rejects }) => {
- const pool = new Piscina({
- filename: resolve(__dirname, 'fixtures/eval-async.js'),
- minThreads: 1
- });
- const originalThreadId = pool.threads[0].threadId;
- const taskResult = await pool.runTask(`
- setTimeout(() => { process.exit(1); }, 50);
- 42
- `);
- equal(taskResult, 42);
- await rejects(pool.runTask(`
- 'use strict';
- const { promisify } = require('util');
- const sleep = promisify(setTimeout);
- async function _() {
- await sleep(1000);
- return 42
- }
- _();
- `), /worker exited with code: 1/);
- const secondThreadId = pool.threads[0].threadId;
- not(originalThreadId, secondThreadId);
- });
|