import { EventEmitterAsyncResource } from 'node:events'
+import { dirname, join } from 'node:path'
import { readFileSync } from 'node:fs'
+import { fileURLToPath } from 'node:url'
import { expect } from 'expect'
import { restore, stub } from 'sinon'
import {
import { WorkerNode } from '../../lib/pools/worker-node.js'
describe('Abstract pool test suite', () => {
- const version = JSON.parse(readFileSync('./package.json', 'utf8')).version
+ const version = JSON.parse(
+ readFileSync(
+ join(dirname(fileURLToPath(import.meta.url)), '../..', 'package.json'),
+ 'utf8'
+ )
+ ).version
const numberOfWorkers = 2
class StubPoolWithIsMain extends FixedThreadPool {
isMain () {
() =>
new StubPoolWithIsMain(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
errorHandler: e => console.error(e)
}
it('Verify that pool statuses properties are set', async () => {
const pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
expect(pool.starting).toBe(false)
expect(pool.started).toBe(true)
() =>
new FixedThreadPool(
undefined,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
).toThrowError(
new Error(
it('Verify that a non integer number of workers is checked', () => {
expect(
() =>
- new FixedThreadPool(0.25, './tests/worker-files/thread/testWorker.js')
+ new FixedThreadPool(0.25, './tests/worker-files/thread/testWorker.mjs')
).toThrowError(
new TypeError(
'Cannot instantiate a pool with a non safe integer number of workers'
new DynamicThreadPool(
0.5,
1,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
).toThrowError(
new TypeError(
)
expect(
() =>
- new DynamicThreadPool(2, 1, './tests/worker-files/thread/testWorker.js')
+ new DynamicThreadPool(
+ 2,
+ 1,
+ './tests/worker-files/thread/testWorker.mjs'
+ )
).toThrowError(
new RangeError(
'Cannot instantiate a dynamic pool with a maximum pool size inferior to the minimum pool size'
)
expect(
() =>
- new DynamicThreadPool(0, 0, './tests/worker-files/thread/testWorker.js')
+ new DynamicThreadPool(
+ 0,
+ 0,
+ './tests/worker-files/thread/testWorker.mjs'
+ )
).toThrowError(
new RangeError(
'Cannot instantiate a dynamic pool with a maximum pool size equal to zero'
it('Verify that pool options are checked', async () => {
let pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
expect(pool.emitter).toBeInstanceOf(EventEmitterAsyncResource)
expect(pool.opts).toStrictEqual({
const testHandler = () => console.info('test handler executed')
pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
workerChoiceStrategy: WorkerChoiceStrategies.LEAST_USED,
workerChoiceStrategyOptions: {
await pool.destroy()
})
- it('Verify that pool options are validated', async () => {
+ it('Verify that pool options are validated', () => {
expect(
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
workerChoiceStrategy: 'invalidStrategy'
}
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
workerChoiceStrategyOptions: {
retries: 'invalidChoiceRetries'
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
workerChoiceStrategyOptions: {
retries: -1
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
workerChoiceStrategyOptions: { weights: {} }
}
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
workerChoiceStrategyOptions: { measurement: 'invalidMeasurement' }
}
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
enableTasksQueue: true,
tasksQueueOptions: 'invalidTasksQueueOptions'
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
enableTasksQueue: true,
tasksQueueOptions: { concurrency: 0 }
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
enableTasksQueue: true,
tasksQueueOptions: { concurrency: -1 }
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
enableTasksQueue: true,
tasksQueueOptions: { concurrency: 0.2 }
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
enableTasksQueue: true,
tasksQueueOptions: { size: 0 }
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
enableTasksQueue: true,
tasksQueueOptions: { size: -1 }
() =>
new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
enableTasksQueue: true,
tasksQueueOptions: { size: 0.2 }
it('Verify that pool worker choice strategy options can be set', async () => {
const pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{ workerChoiceStrategy: WorkerChoiceStrategies.FAIR_SHARE }
)
expect(pool.opts.workerChoiceStrategyOptions).toStrictEqual({
it('Verify that pool tasks queue can be enabled/disabled', async () => {
const pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
expect(pool.opts.enableTasksQueue).toBe(false)
expect(pool.opts.tasksQueueOptions).toBeUndefined()
it('Verify that pool tasks queue options can be set', async () => {
const pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{ enableTasksQueue: true }
)
expect(pool.opts.tasksQueueOptions).toStrictEqual({
it('Verify that pool info is set', async () => {
let pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
expect(pool.info).toStrictEqual({
version,
pool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
for (const workerNode of pool.workerNodes) {
expect(workerNode).toBeInstanceOf(WorkerNode)
pool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
for (const workerNode of pool.workerNodes) {
expect(workerNode).toBeInstanceOf(WorkerNode)
const pool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
const promises = new Set()
const maxMultiplier = 2
it("Verify that pool event emitter 'busy' event can register a callback", async () => {
const pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
expect(pool.emitter.eventNames()).toStrictEqual([])
const promises = new Set()
const pool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
expect(pool.emitter.eventNames()).toStrictEqual([])
const promises = new Set()
it("Verify that pool event emitter 'backPressure' event can register a callback", async () => {
const pool = new FixedThreadPool(
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js',
+ './tests/worker-files/thread/testWorker.mjs',
{
enableTasksQueue: true
}
const dynamicThreadPool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testMultipleTaskFunctionsWorker.js'
+ './tests/worker-files/thread/testMultipleTaskFunctionsWorker.mjs'
)
await waitPoolEvents(dynamicThreadPool, PoolEvents.ready, 1)
expect(dynamicThreadPool.hasTaskFunction(DEFAULT_TASK_NAME)).toBe(true)
const dynamicThreadPool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
await waitPoolEvents(dynamicThreadPool, PoolEvents.ready, 1)
await expect(
const dynamicThreadPool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testWorker.js'
+ './tests/worker-files/thread/testWorker.mjs'
)
await waitPoolEvents(dynamicThreadPool, PoolEvents.ready, 1)
expect(dynamicThreadPool.listTaskFunctionNames()).toStrictEqual([
const dynamicThreadPool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testMultipleTaskFunctionsWorker.js'
+ './tests/worker-files/thread/testMultipleTaskFunctionsWorker.mjs'
)
await waitPoolEvents(dynamicThreadPool, PoolEvents.ready, 1)
expect(dynamicThreadPool.listTaskFunctionNames()).toStrictEqual([
const dynamicThreadPool = new DynamicThreadPool(
Math.floor(numberOfWorkers / 2),
numberOfWorkers,
- './tests/worker-files/thread/testMultipleTaskFunctionsWorker.js'
+ './tests/worker-files/thread/testMultipleTaskFunctionsWorker.mjs'
)
await waitPoolEvents(dynamicThreadPool, PoolEvents.ready, 1)
await expect(