refactor: use PoolEvents enum
[poolifier.git] / tests / pools / thread / dynamic.test.mjs
index 4fcd2d1b039c3c27e3c3308399c25e2c94a1867c..6f563f520989246cdd17198518e178dec1052384 100644 (file)
@@ -1,7 +1,12 @@
 import { expect } from 'expect'
-import { DynamicThreadPool, PoolEvents } from '../../../lib/index.js'
-import { TaskFunctions } from '../../test-types.js'
-import { sleep, waitWorkerEvents } from '../../test-utils.js'
+
+import {
+  DynamicThreadPool,
+  PoolEvents,
+  WorkerChoiceStrategies
+} from '../../../lib/index.cjs'
+import { TaskFunctions } from '../../test-types.cjs'
+import { sleep, waitPoolEvents, waitWorkerEvents } from '../../test-utils.cjs'
 
 describe('Dynamic thread pool test suite', () => {
   const min = 1
@@ -37,10 +42,10 @@ describe('Dynamic thread pool test suite', () => {
     expect(poolBusy).toBe(1)
     const numberOfExitEvents = await waitWorkerEvents(pool, 'exit', max - min)
     expect(numberOfExitEvents).toBe(max - min)
+    expect(pool.workerNodes.length).toBe(min)
   })
 
   it('Verify scale thread up and down is working', async () => {
-    expect(pool.workerNodes.length).toBe(min)
     for (let i = 0; i < max * 2; i++) {
       pool.execute()
     }
@@ -67,6 +72,11 @@ describe('Dynamic thread pool test suite', () => {
     await pool.destroy()
     const numberOfExitEvents = await exitPromise
     expect(pool.started).toBe(false)
+    expect(pool.emitter.eventNames()).toStrictEqual([
+      PoolEvents.busy,
+      PoolEvents.destroy
+    ])
+    expect(pool.readyEventEmitted).toBe(false)
     expect(pool.workerNodes.length).toBe(0)
     expect(numberOfExitEvents).toBe(min)
     expect(poolDestroy).toBe(1)
@@ -74,7 +84,7 @@ describe('Dynamic thread pool test suite', () => {
 
   it('Validation of inputs test', () => {
     expect(() => new DynamicThreadPool(min)).toThrow(
-      "Cannot find the worker file 'undefined'"
+      'The worker file path must be specified'
     )
   })
 
@@ -150,4 +160,37 @@ describe('Dynamic thread pool test suite', () => {
     // 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 DynamicThreadPool(
+        0,
+        max,
+        './tests/worker-files/thread/testWorker.mjs',
+        {
+          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()
+    }
+  })
 })