X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=tests%2Fpools%2Fabstract%2Fabstract-pool.test.js;h=658be6a9ef99ed63afb692ba864a4745ebf66f89;hb=aee467366d8c393b79e7af82c6a7ab12338ee64e;hp=4224f4ffe7a9e87bdc86169ef66a7b1437352c53;hpb=7fd82a1cb4d9d43e0f44333db35d3c4ad694e010;p=poolifier.git diff --git a/tests/pools/abstract/abstract-pool.test.js b/tests/pools/abstract/abstract-pool.test.js index 4224f4ff..658be6a9 100644 --- a/tests/pools/abstract/abstract-pool.test.js +++ b/tests/pools/abstract/abstract-pool.test.js @@ -1,22 +1,24 @@ const { expect } = require('expect') const { - FixedClusterPool, DynamicThreadPool, + FixedClusterPool, FixedThreadPool, + PoolEvents, WorkerChoiceStrategies } = require('../../../lib/index') describe('Abstract pool test suite', () => { const numberOfWorkers = 1 - const workerNotFoundInTasksUsageMapError = new Error( - 'Worker could not be found in worker tasks usage map' + const workerNotFoundInPoolError = new Error( + 'Worker could not be found in the pool' ) - class StubPoolWithWorkerTasksUsageMapClear extends FixedThreadPool { + class StubPoolWithRemoveAllWorker extends FixedThreadPool { removeAllWorker () { - this.workersTasksUsage.clear() + this.workers = [] + this.promiseResponseMap.clear() } } - class StubPoolWithIsMainMethod extends FixedThreadPool { + class StubPoolWithIsMain extends FixedThreadPool { isMain () { return false } @@ -25,7 +27,7 @@ describe('Abstract pool test suite', () => { it('Simulate pool creation from a non main thread/process', () => { expect( () => - new StubPoolWithIsMainMethod( + new StubPoolWithIsMain( numberOfWorkers, './tests/worker-files/thread/testWorker.js', { @@ -60,7 +62,9 @@ describe('Abstract pool test suite', () => { () => new FixedClusterPool(-1, './tests/worker-files/cluster/testWorker.js') ).toThrowError( - new Error('Cannot instantiate a pool with a negative number of workers') + new RangeError( + 'Cannot instantiate a pool with a negative number of workers' + ) ) }) @@ -69,7 +73,7 @@ describe('Abstract pool test suite', () => { () => new FixedThreadPool(0.25, './tests/worker-files/thread/testWorker.js') ).toThrowError( - new Error( + new TypeError( 'Cannot instantiate a pool with a non integer number of workers' ) ) @@ -95,7 +99,7 @@ describe('Abstract pool test suite', () => { numberOfWorkers, './tests/worker-files/thread/testWorker.js', { - workerChoiceStrategy: WorkerChoiceStrategies.LESS_RECENTLY_USED, + workerChoiceStrategy: WorkerChoiceStrategies.LESS_USED, enableEvents: false, messageHandler: testHandler, errorHandler: testHandler, @@ -106,7 +110,7 @@ describe('Abstract pool test suite', () => { expect(pool.opts.enableEvents).toBe(false) expect(pool.emitter).toBeUndefined() expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.LESS_RECENTLY_USED + WorkerChoiceStrategies.LESS_USED ) expect(pool.opts.messageHandler).toStrictEqual(testHandler) expect(pool.opts.errorHandler).toStrictEqual(testHandler) @@ -115,21 +119,8 @@ describe('Abstract pool test suite', () => { 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( + it('Simulate worker not found during getWorkerTasksUsage', async () => { + const pool = new StubPoolWithRemoveAllWorker( numberOfWorkers, './tests/worker-files/cluster/testWorker.js', { @@ -138,55 +129,8 @@ describe('Abstract pool test suite', () => { ) // 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 + expect(() => pool.getWorkerTasksUsage()).toThrowError( + workerNotFoundInPoolError ) await pool.destroy() }) @@ -196,12 +140,13 @@ describe('Abstract pool test suite', () => { 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) + for (const workerItem of pool.workers) { + expect(workerItem.tasksUsage).toBeDefined() + expect(workerItem.tasksUsage.run).toBe(0) + expect(workerItem.tasksUsage.running).toBe(0) + expect(workerItem.tasksUsage.runTime).toBe(0) + expect(workerItem.tasksUsage.avgRunTime).toBe(0) + expect(workerItem.tasksUsage.error).toBe(0) } await pool.destroy() }) @@ -215,20 +160,22 @@ describe('Abstract pool test suite', () => { 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) + for (const workerItem of pool.workers) { + expect(workerItem.tasksUsage).toBeDefined() + expect(workerItem.tasksUsage.run).toBe(0) + expect(workerItem.tasksUsage.running).toBe(numberOfWorkers * 2) + expect(workerItem.tasksUsage.runTime).toBe(0) + expect(workerItem.tasksUsage.avgRunTime).toBe(0) + expect(workerItem.tasksUsage.error).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) + for (const workerItem of pool.workers) { + expect(workerItem.tasksUsage).toBeDefined() + expect(workerItem.tasksUsage.run).toBe(numberOfWorkers * 2) + expect(workerItem.tasksUsage.running).toBe(0) + expect(workerItem.tasksUsage.runTime).toBeGreaterThanOrEqual(0) + expect(workerItem.tasksUsage.avgRunTime).toBeGreaterThanOrEqual(0) + expect(workerItem.tasksUsage.error).toBe(0) } await pool.destroy() }) @@ -244,24 +191,45 @@ describe('Abstract pool test suite', () => { 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) + for (const workerItem of pool.workers) { + expect(workerItem.tasksUsage).toBeDefined() + expect(workerItem.tasksUsage.run).toBe(numberOfWorkers * 2) + expect(workerItem.tasksUsage.running).toBe(0) + expect(workerItem.tasksUsage.runTime).toBeGreaterThanOrEqual(0) + expect(workerItem.tasksUsage.avgRunTime).toBeGreaterThanOrEqual(0) + expect(workerItem.tasksUsage.error).toBe(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) + for (const workerItem of pool.workers) { + expect(workerItem.tasksUsage).toBeDefined() + expect(workerItem.tasksUsage.run).toBe(0) + expect(workerItem.tasksUsage.running).toBe(0) + expect(workerItem.tasksUsage.runTime).toBe(0) + expect(workerItem.tasksUsage.avgRunTime).toBe(0) + expect(workerItem.tasksUsage.error).toBe(0) } await pool.destroy() }) + it("Verify that pool event emitter 'full' event can register a callback", async () => { + const pool = new DynamicThreadPool( + numberOfWorkers, + numberOfWorkers, + './tests/worker-files/thread/testWorker.js' + ) + const promises = [] + let poolFull = 0 + pool.emitter.on(PoolEvents.full, () => ++poolFull) + for (let i = 0; i < numberOfWorkers * 2; i++) { + promises.push(pool.execute()) + } + await Promise.all(promises) + // The `full` event is triggered when the number of submitted tasks at once reach the number of dynamic pool workers. + // So in total numberOfWorkers + 1 times for a loop submitting up to numberOfWorkers * 2 tasks to the dynamic pool. + expect(poolFull).toBe(numberOfWorkers + 1) + await pool.destroy() + }) + it("Verify that pool event emitter 'busy' event can register a callback", async () => { const pool = new FixedThreadPool( numberOfWorkers, @@ -269,7 +237,7 @@ describe('Abstract pool test suite', () => { ) const promises = [] let poolBusy = 0 - pool.emitter.on('busy', () => poolBusy++) + pool.emitter.on(PoolEvents.busy, () => ++poolBusy) for (let i = 0; i < numberOfWorkers * 2; i++) { promises.push(pool.execute()) }