import { expect } from 'expect'
-import { DynamicClusterPool, PoolEvents } from '../../../lib/index.js'
-import { TaskFunctions } from '../../test-types.js'
-import { sleep, waitWorkerEvents } from '../../test-utils.js'
+import {
+ DynamicClusterPool,
+ PoolEvents,
+ WorkerChoiceStrategies
+} from '../../../lib/index.cjs'
+import { TaskFunctions } from '../../test-types.cjs'
+import { sleep, waitPoolEvents, waitWorkerEvents } from '../../test-utils.cjs'
describe('Dynamic cluster pool test suite', () => {
const min = 1
const pool = new DynamicClusterPool(
min,
max,
- './tests/worker-files/cluster/testWorker.js',
+ './tests/worker-files/cluster/testWorker.cjs',
{
errorHandler: e => console.error(e)
}
const pool = new DynamicClusterPool(
min,
max,
- './tests/worker-files/cluster/testWorker.js'
+ './tests/worker-files/cluster/testWorker.cjs'
)
const result = await pool.execute()
expect(result).toStrictEqual({ ok: 1 })
const longRunningPool = new DynamicClusterPool(
min,
max,
- './tests/worker-files/cluster/longRunningWorkerHardBehavior.js',
+ './tests/worker-files/cluster/longRunningWorkerHardBehavior.cjs',
{
errorHandler: e => console.error(e),
onlineHandler: () => console.info('long executing worker is online'),
const longRunningPool = new DynamicClusterPool(
min,
max,
- './tests/worker-files/cluster/longRunningWorkerSoftBehavior.js',
+ './tests/worker-files/cluster/longRunningWorkerSoftBehavior.cjs',
{
errorHandler: e => console.error(e),
onlineHandler: () => console.info('long executing worker is online'),
const pool = new DynamicClusterPool(
0,
max,
- './tests/worker-files/cluster/testWorker.js'
+ './tests/worker-files/cluster/testWorker.cjs'
)
expect(pool).toBeInstanceOf(DynamicClusterPool)
// We need to clean up the resources after our test
await pool.destroy()
})
+
+ it('Verify that a pool with zero worker works', async () => {
+ for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) {
+ const pool = new DynamicClusterPool(
+ 0,
+ max,
+ './tests/worker-files/cluster/testWorker.cjs',
+ {
+ workerChoiceStrategy
+ }
+ )
+ expect(pool.starting).toBe(false)
+ expect(pool.readyEventEmitted).toBe(false)
+ for (let run = 0; run < 2; run++) {
+ run % 2 !== 0 && pool.enableTasksQueue(true)
+ const maxMultiplier = 4
+ const promises = new Set()
+ expect(pool.workerNodes.length).toBe(pool.info.minSize)
+ for (let i = 0; i < max * maxMultiplier; i++) {
+ promises.add(pool.execute())
+ }
+ await Promise.all(promises)
+ expect(pool.readyEventEmitted).toBe(true)
+ expect(pool.workerNodes.length).toBeGreaterThan(pool.info.minSize)
+ expect(pool.workerNodes.length).toBeLessThanOrEqual(pool.info.maxSize)
+ await waitPoolEvents(pool, PoolEvents.empty, 1)
+ expect(pool.readyEventEmitted).toBe(false)
+ expect(pool.workerNodes.length).toBe(pool.info.minSize)
+ }
+ // We need to clean up the resources after our test
+ await pool.destroy()
+ }
+ })
})