+ expect(pool.opts.workerChoiceStrategy).toBe(
+ WorkerChoiceStrategies.LESS_RECENTLY_USED
+ )
+ expect(pool.opts.messageHandler).toStrictEqual(testHandler)
+ expect(pool.opts.errorHandler).toStrictEqual(testHandler)
+ expect(pool.opts.onlineHandler).toStrictEqual(testHandler)
+ expect(pool.opts.exitHandler).toStrictEqual(testHandler)
+ await pool.destroy()
+ })
+
+ it('Simulate worker not found during increaseWorkerRunningTasks', async () => {
+ const pool = new StubPoolWithWorkerTasksUsageMapClear(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js'
+ )
+ // Simulate worker not found.
+ pool.removeAllWorker()
+ expect(() => pool.increaseWorkerRunningTasks()).toThrowError(
+ workerNotFoundInTasksUsageMapError
+ )
+ await pool.destroy()
+ })
+
+ it('Simulate worker not found during decreaseWorkerRunningTasks', async () => {
+ const pool = new StubPoolWithWorkerTasksUsageMapClear(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js',
+ {
+ errorHandler: e => console.error(e)
+ }
+ )
+ // Simulate worker not found.
+ pool.removeAllWorker()
+ expect(() => pool.decreaseWorkerRunningTasks()).toThrowError(
+ workerNotFoundInTasksUsageMapError
+ )
+ await pool.destroy()
+ })
+
+ it('Simulate worker not found during stepWorkerRunTasks', async () => {
+ const pool = new StubPoolWithWorkerTasksUsageMapClear(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js',
+ {
+ errorHandler: e => console.error(e)
+ }
+ )
+ // Simulate worker not found.
+ pool.removeAllWorker()
+ expect(() => pool.stepWorkerRunTasks()).toThrowError(
+ workerNotFoundInTasksUsageMapError
+ )
+ await pool.destroy()
+ })
+
+ it('Simulate worker not found during updateWorkerTasksRunTime with strategy not requiring it', async () => {
+ const pool = new StubPoolWithWorkerTasksUsageMapClear(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js',
+ {
+ errorHandler: e => console.error(e)
+ }
+ )
+ // Simulate worker not found.
+ pool.removeAllWorker()
+ expect(() => pool.updateWorkerTasksRunTime()).not.toThrowError()
+ await pool.destroy()
+ })
+
+ it('Simulate worker not found during updateWorkerTasksRunTime with strategy requiring it', async () => {
+ const pool = new StubPoolWithWorkerTasksUsageMapClear(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js',
+ {
+ workerChoiceStrategy: WorkerChoiceStrategies.FAIR_SHARE,
+ errorHandler: e => console.error(e)
+ }
+ )
+ // Simulate worker not found.
+ pool.removeAllWorker()
+ expect(() => pool.updateWorkerTasksRunTime()).toThrowError(
+ workerNotFoundInTasksUsageMapError
+ )
+ await pool.destroy()
+ })
+
+ it('Verify that worker pool tasks usage are initialized', async () => {
+ const pool = new FixedClusterPool(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js'
+ )
+ for (const tasksUsage of pool.workersTasksUsage.values()) {
+ expect(tasksUsage).toBeDefined()
+ expect(tasksUsage.run).toBe(0)
+ expect(tasksUsage.running).toBe(0)
+ expect(tasksUsage.runTime).toBe(0)
+ expect(tasksUsage.avgRunTime).toBe(0)
+ }
+ await pool.destroy()
+ })
+
+ it('Verify that worker pool tasks usage are computed', async () => {
+ const pool = new FixedClusterPool(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js'
+ )
+ const promises = []
+ for (let i = 0; i < numberOfWorkers * 2; i++) {
+ promises.push(pool.execute())
+ }
+ for (const tasksUsage of pool.workersTasksUsage.values()) {
+ expect(tasksUsage).toBeDefined()
+ expect(tasksUsage.run).toBe(0)
+ expect(tasksUsage.running).toBe(numberOfWorkers * 2)
+ expect(tasksUsage.runTime).toBe(0)
+ expect(tasksUsage.avgRunTime).toBe(0)
+ }
+ await Promise.all(promises)
+ for (const tasksUsage of pool.workersTasksUsage.values()) {
+ expect(tasksUsage).toBeDefined()
+ expect(tasksUsage.run).toBe(numberOfWorkers * 2)
+ expect(tasksUsage.running).toBe(0)
+ expect(tasksUsage.runTime).toBeGreaterThanOrEqual(0)
+ expect(tasksUsage.avgRunTime).toBeGreaterThanOrEqual(0)
+ }
+ await pool.destroy()
+ })
+
+ it('Verify that worker pool tasks usage are reset at worker choice strategy change', async () => {
+ const pool = new DynamicThreadPool(
+ numberOfWorkers,
+ numberOfWorkers,
+ './tests/worker-files/thread/testWorker.js'
+ )
+ const promises = []
+ for (let i = 0; i < numberOfWorkers * 2; i++) {
+ promises.push(pool.execute())
+ }
+ await Promise.all(promises)
+ for (const tasksUsage of pool.workersTasksUsage.values()) {
+ expect(tasksUsage).toBeDefined()
+ expect(tasksUsage.run).toBe(numberOfWorkers * 2)
+ expect(tasksUsage.running).toBe(0)
+ expect(tasksUsage.runTime).toBeGreaterThanOrEqual(0)
+ expect(tasksUsage.avgRunTime).toBeGreaterThanOrEqual(0)
+ }
+ pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.FAIR_SHARE)
+ for (const tasksUsage of pool.workersTasksUsage.values()) {
+ expect(tasksUsage).toBeDefined()
+ expect(tasksUsage.run).toBe(0)
+ expect(tasksUsage.running).toBe(0)
+ expect(tasksUsage.runTime).toBe(0)
+ expect(tasksUsage.avgRunTime).toBe(0)
+ }
+ await pool.destroy()