X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=tests%2Fpools%2Fselection-strategies%2Fselection-strategies.test.js;h=52285d7163f1228a5691b26bb8e1b19e6bf12af5;hb=ec82cfa1f7bd62462991c1c034f2fb473f660440;hp=254f02de7870e5c8da73ab6c260fa954a176283c;hpb=95c83464bb1fab234d1c41204f98defcd01c789f;p=poolifier.git diff --git a/tests/pools/selection-strategies/selection-strategies.test.js b/tests/pools/selection-strategies/selection-strategies.test.js index 254f02de..52285d71 100644 --- a/tests/pools/selection-strategies/selection-strategies.test.js +++ b/tests/pools/selection-strategies/selection-strategies.test.js @@ -33,63 +33,128 @@ describe('Selection strategies test suite', () => { await pool.destroy() }) - it('Verify ROUND_ROBIN strategy is taken at pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js', - { workerChoiceStrategy: WorkerChoiceStrategies.ROUND_ROBIN } - ) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.ROUND_ROBIN - ) - expect( - pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.ROUND_ROBIN - ).nextWorkerId - ).toBe(0) - // We need to clean up the resources after our test - await pool.destroy() + it('Verify available strategies are taken at pool creation', async () => { + for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) { + const pool = new FixedThreadPool( + max, + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } + ) + expect(pool.opts.workerChoiceStrategy).toBe(workerChoiceStrategy) + expect(pool.workerChoiceStrategyContext.workerChoiceStrategy).toBe( + workerChoiceStrategy + ) + await pool.destroy() + } }) - it('Verify ROUND_ROBIN strategy can be set after pool creation', async () => { - const pool = new DynamicThreadPool( - min, + it('Verify available strategies can be set after pool creation', async () => { + for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) { + const pool = new DynamicThreadPool( + min, + max, + './tests/worker-files/thread/testWorker.js' + ) + pool.setWorkerChoiceStrategy(workerChoiceStrategy) + expect(pool.opts.workerChoiceStrategy).toBe(workerChoiceStrategy) + expect(pool.workerChoiceStrategyContext.workerChoiceStrategy).toBe( + workerChoiceStrategy + ) + await pool.destroy() + } + }) + + it('Verify available strategies default internals at pool creation', async () => { + const pool = new FixedThreadPool( max, './tests/worker-files/thread/testWorker.js' ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.ROUND_ROBIN) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.ROUND_ROBIN - ) - // We need to clean up the resources after our test + for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) { + if (workerChoiceStrategy === WorkerChoiceStrategies.ROUND_ROBIN) { + expect( + pool.workerChoiceStrategyContext.workerChoiceStrategies.get( + workerChoiceStrategy + ).nextWorkerNodeId + ).toBe(0) + } else if (workerChoiceStrategy === WorkerChoiceStrategies.FAIR_SHARE) { + for (const workerNodeKey of pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(workerChoiceStrategy) + .workerLastVirtualTaskTimestamp.keys()) { + expect( + pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(workerChoiceStrategy) + .workerLastVirtualTaskTimestamp.get(workerNodeKey).start + ).toBe(0) + expect( + pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(workerChoiceStrategy) + .workerLastVirtualTaskTimestamp.get(workerNodeKey).end + ).toBe(0) + } + } else if ( + workerChoiceStrategy === WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN + ) { + expect( + pool.workerChoiceStrategyContext.workerChoiceStrategies.get( + workerChoiceStrategy + ).currentWorkerNodeId + ).toBe(0) + expect( + pool.workerChoiceStrategyContext.workerChoiceStrategies.get( + workerChoiceStrategy + ).defaultWorkerWeight + ).toBeGreaterThan(0) + for (const workerNodeKey of pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(workerChoiceStrategy) + .workersTaskRunTime.keys()) { + expect( + pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(workerChoiceStrategy) + .workersTaskRunTime.get(workerNodeKey).weight + ).toBeGreaterThan(0) + expect( + pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(workerChoiceStrategy) + .workersTaskRunTime.get(workerNodeKey).runTime + ).toBe(0) + } + } + } await pool.destroy() }) it('Verify ROUND_ROBIN strategy default tasks usage statistics requirements', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN let pool = new FixedThreadPool( max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.ROUND_ROBIN) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(false) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(false) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) await pool.destroy() pool = new DynamicThreadPool( min, max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.ROUND_ROBIN) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(false) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(false) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) // We need to clean up the resources after our test await pool.destroy() }) @@ -100,9 +165,6 @@ describe('Selection strategies test suite', () => { './tests/worker-files/thread/testWorker.js', { workerChoiceStrategy: WorkerChoiceStrategies.ROUND_ROBIN } ) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.ROUND_ROBIN - ) // TODO: Create a better test to cover `RoundRobinWorkerChoiceStrategy#choose` const promises = [] for (let i = 0; i < max * 2; i++) { @@ -120,9 +182,6 @@ describe('Selection strategies test suite', () => { './tests/worker-files/thread/testWorker.js', { workerChoiceStrategy: WorkerChoiceStrategies.ROUND_ROBIN } ) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.ROUND_ROBIN - ) // TODO: Create a better test to cover `RoundRobinWorkerChoiceStrategy#choose` const promises = [] for (let i = 0; i < max * 2; i++) { @@ -134,26 +193,33 @@ describe('Selection strategies test suite', () => { }) it('Verify ROUND_ROBIN strategy runtime behavior', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN let pool = new FixedClusterPool( max, - './tests/worker-files/cluster/testWorker.js' + './tests/worker-files/cluster/testWorker.js', + { workerChoiceStrategy } ) let results = new Set() for (let i = 0; i < max; i++) { - results.add(pool.chooseWorker()[1].id) + results.add(pool.chooseWorkerNode()[1].worker.id) } expect(results.size).toBe(max) await pool.destroy() - pool = new FixedThreadPool(max, './tests/worker-files/thread/testWorker.js') + pool = new FixedThreadPool( + max, + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } + ) results = new Set() for (let i = 0; i < max; i++) { - results.add(pool.chooseWorker()[1].threadId) + results.add(pool.chooseWorkerNode()[1].worker.threadId) } expect(results.size).toBe(max) await pool.destroy() }) it('Verify ROUND_ROBIN strategy internals are resets after setting it', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN let pool = new FixedThreadPool( max, './tests/worker-files/thread/testWorker.js', @@ -161,14 +227,14 @@ describe('Selection strategies test suite', () => { ) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.ROUND_ROBIN - )?.nextWorkerId - ).toBeUndefined() - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.ROUND_ROBIN) + workerChoiceStrategy + ).nextWorkerNodeId + ).toBeDefined() + pool.setWorkerChoiceStrategy(workerChoiceStrategy) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.ROUND_ROBIN - ).nextWorkerId + pool.workerChoiceStrategyContext.workerChoiceStrategy + ).nextWorkerNodeId ).toBe(0) await pool.destroy() pool = new DynamicThreadPool( @@ -179,70 +245,51 @@ describe('Selection strategies test suite', () => { ) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.ROUND_ROBIN - )?.nextWorkerId - ).toBeUndefined() - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.ROUND_ROBIN) + workerChoiceStrategy + ).nextWorkerNodeId + ).toBeDefined() + pool.setWorkerChoiceStrategy(workerChoiceStrategy) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.ROUND_ROBIN - ).nextWorkerId + pool.workerChoiceStrategyContext.workerChoiceStrategy + ).nextWorkerNodeId ).toBe(0) // We need to clean up the resources after our test await pool.destroy() }) - it('Verify LESS_USED strategy is taken at pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js', - { workerChoiceStrategy: WorkerChoiceStrategies.LESS_USED } - ) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.LESS_USED - ) - // We need to clean up the resources after our test - await pool.destroy() - }) - - it('Verify LESS_USED strategy can be set after pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js' - ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.LESS_USED) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.LESS_USED - ) - // We need to clean up the resources after our test - await pool.destroy() - }) - it('Verify LESS_USED strategy default tasks usage statistics requirements', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.LESS_USED let pool = new FixedThreadPool( max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.LESS_USED) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(false) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(false) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) await pool.destroy() pool = new DynamicThreadPool( min, max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.LESS_USED) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(false) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(false) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) // We need to clean up the resources after our test await pool.destroy() }) @@ -280,57 +327,38 @@ describe('Selection strategies test suite', () => { await pool.destroy() }) - it('Verify LESS_BUSY strategy is taken at pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js', - { workerChoiceStrategy: WorkerChoiceStrategies.LESS_BUSY } - ) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.LESS_BUSY - ) - // We need to clean up the resources after our test - await pool.destroy() - }) - - it('Verify LESS_BUSY strategy can be set after pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js' - ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.LESS_BUSY) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.LESS_BUSY - ) - // We need to clean up the resources after our test - await pool.destroy() - }) - it('Verify LESS_BUSY strategy default tasks usage statistics requirements', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.LESS_BUSY let pool = new FixedThreadPool( max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.LESS_BUSY) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(true) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(false) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) await pool.destroy() pool = new DynamicThreadPool( min, max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.LESS_BUSY) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(true) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(false) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) // We need to clean up the resources after our test await pool.destroy() }) @@ -368,71 +396,38 @@ describe('Selection strategies test suite', () => { await pool.destroy() }) - it('Verify FAIR_SHARE strategy is taken at pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js', - { workerChoiceStrategy: WorkerChoiceStrategies.FAIR_SHARE } - ) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.FAIR_SHARE - ) - for (const workerKey of pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) - .workerLastVirtualTaskTimestamp.keys()) { - expect( - pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) - .workerLastVirtualTaskTimestamp.get(workerKey).start - ).toBe(0) - expect( - pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) - .workerLastVirtualTaskTimestamp.get(workerKey).end - ).toBe(0) - } - // We need to clean up the resources after our test - await pool.destroy() - }) - - it('Verify FAIR_SHARE strategy can be set after pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js' - ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.FAIR_SHARE) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.FAIR_SHARE - ) - // We need to clean up the resources after our test - await pool.destroy() - }) - it('Verify FAIR_SHARE strategy default tasks usage statistics requirements', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE let pool = new FixedThreadPool( max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.FAIR_SHARE) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(true) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(true) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) await pool.destroy() pool = new DynamicThreadPool( min, max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.FAIR_SHARE) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(true) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(true) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) // We need to clean up the resources after our test await pool.destroy() }) @@ -451,9 +446,9 @@ describe('Selection strategies test suite', () => { await Promise.all(promises) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.FAIR_SHARE + pool.workerChoiceStrategyContext.workerChoiceStrategy ).workerLastVirtualTaskTimestamp.size - ).toBe(pool.workers.length) + ).toBe(pool.workerNodes.length) // We need to clean up the resources after our test await pool.destroy() }) @@ -475,37 +470,38 @@ describe('Selection strategies test suite', () => { // if (process.platform !== 'win32') { // expect( // pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - // WorkerChoiceStrategies.FAIR_SHARE + // pool.workerChoiceStrategyContext.workerChoiceStrategy // ).workerLastVirtualTaskTimestamp.size - // ).toBe(pool.workers.length) + // ).toBe(pool.workerNodes.length) // } // We need to clean up the resources after our test await pool.destroy() }) it('Verify FAIR_SHARE strategy internals are resets after setting it', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE let pool = new FixedThreadPool( max, './tests/worker-files/thread/testWorker.js' ) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.FAIR_SHARE - )?.workerLastVirtualTaskTimestamp - ).toBeUndefined() - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.FAIR_SHARE) - for (const workerKey of pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) + workerChoiceStrategy + ).workerLastVirtualTaskTimestamp + ).toBeDefined() + pool.setWorkerChoiceStrategy(workerChoiceStrategy) + for (const workerNodeKey of pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) .workerLastVirtualTaskTimestamp.keys()) { expect( pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) - .workerLastVirtualTaskTimestamp.get(workerKey).start + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) + .workerLastVirtualTaskTimestamp.get(workerNodeKey).start ).toBe(0) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) - .workerLastVirtualTaskTimestamp.get(workerKey).end + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) + .workerLastVirtualTaskTimestamp.get(workerNodeKey).end ).toBe(0) } await pool.destroy() @@ -516,103 +512,60 @@ describe('Selection strategies test suite', () => { ) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.FAIR_SHARE - )?.workerLastVirtualTaskTimestamp - ).toBeUndefined() - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.FAIR_SHARE) - for (const workerKey of pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) + workerChoiceStrategy + ).workerLastVirtualTaskTimestamp + ).toBeDefined() + pool.setWorkerChoiceStrategy(workerChoiceStrategy) + for (const workerNodeKey of pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) .workerLastVirtualTaskTimestamp.keys()) { expect( pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) - .workerLastVirtualTaskTimestamp.get(workerKey).start + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) + .workerLastVirtualTaskTimestamp.get(workerNodeKey).start ).toBe(0) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.FAIR_SHARE) - .workerLastVirtualTaskTimestamp.get(workerKey).end + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) + .workerLastVirtualTaskTimestamp.get(workerNodeKey).end ).toBe(0) } // We need to clean up the resources after our test await pool.destroy() }) - it('Verify WEIGHTED_ROUND_ROBIN strategy is taken at pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js', - { workerChoiceStrategy: WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN } - ) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - ) - expect( - pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - ).currentWorkerId - ).toBe(0) - expect( - pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - ).defaultWorkerWeight - ).toBeGreaterThan(0) - for (const workerKey of pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) - .workersTaskRunTime.keys()) { - expect( - pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) - .workersTaskRunTime.get(workerKey).weight - ).toBeGreaterThan(0) - expect( - pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) - .workersTaskRunTime.get(workerKey).runTime - ).toBe(0) - } - // We need to clean up the resources after our test - await pool.destroy() - }) - - it('Verify WEIGHTED_ROUND_ROBIN strategy can be set after pool creation', async () => { - const pool = new FixedThreadPool( - max, - './tests/worker-files/thread/testWorker.js' - ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) - expect(pool.opts.workerChoiceStrategy).toBe( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - ) - // We need to clean up the resources after our test - await pool.destroy() - }) - it('Verify WEIGHTED_ROUND_ROBIN strategy default tasks usage statistics requirements', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN let pool = new FixedThreadPool( max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(true) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(true) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) await pool.destroy() pool = new DynamicThreadPool( min, max, - './tests/worker-files/thread/testWorker.js' + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy } ) - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().runTime ).toBe(true) expect( pool.workerChoiceStrategyContext.getRequiredStatistics().avgRunTime ).toBe(true) + expect( + pool.workerChoiceStrategyContext.getRequiredStatistics().medRunTime + ).toBe(false) // We need to clean up the resources after our test await pool.destroy() }) @@ -631,9 +584,9 @@ describe('Selection strategies test suite', () => { await Promise.all(promises) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN + pool.workerChoiceStrategyContext.workerChoiceStrategy ).workersTaskRunTime.size - ).toBe(pool.workers.length) + ).toBe(pool.workerNodes.length) // We need to clean up the resources after our test await pool.destroy() }) @@ -649,8 +602,8 @@ describe('Selection strategies test suite', () => { const promises = [] const maxMultiplier = pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - ).defaultWorkerWeight * 2 + pool.workerChoiceStrategyContext.workerChoiceStrategy + ).defaultWorkerWeight * 50 for (let i = 0; i < max * maxMultiplier; i++) { promises.push(pool.execute()) } @@ -658,52 +611,53 @@ describe('Selection strategies test suite', () => { if (process.platform !== 'win32') { expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN + pool.workerChoiceStrategyContext.workerChoiceStrategy ).workersTaskRunTime.size - ).toBe(pool.workers.length) + ).toBe(pool.workerNodes.length) } // We need to clean up the resources after our test await pool.destroy() }) it('Verify WEIGHTED_ROUND_ROBIN strategy internals are resets after setting it', async () => { + const workerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN let pool = new FixedThreadPool( max, './tests/worker-files/thread/testWorker.js' ) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - )?.currentWorkerId - ).toBeUndefined() + workerChoiceStrategy + ).currentWorkerNodeId + ).toBeDefined() expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - )?.defaultWorkerWeight - ).toBeUndefined() + workerChoiceStrategy + ).defaultWorkerWeight + ).toBeDefined() expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - )?.workersTaskRunTime - ).toBeUndefined() - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) + workerChoiceStrategy + ).workersTaskRunTime + ).toBeDefined() + pool.setWorkerChoiceStrategy(workerChoiceStrategy) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - ).currentWorkerId + pool.workerChoiceStrategyContext.workerChoiceStrategy + ).currentWorkerNodeId ).toBe(0) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN + pool.workerChoiceStrategyContext.workerChoiceStrategy ).defaultWorkerWeight ).toBeGreaterThan(0) - for (const workerKey of pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) + for (const workerNodeKey of pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) .workersTaskRunTime.keys()) { expect( pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) - .workersTaskRunTime.get(workerKey).runTime + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) + .workersTaskRunTime.get(workerNodeKey).runTime ).toBe(0) } await pool.destroy() @@ -714,37 +668,37 @@ describe('Selection strategies test suite', () => { ) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - )?.currentWorkerId - ).toBeUndefined() + workerChoiceStrategy + ).currentWorkerNodeId + ).toBeDefined() expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - )?.defaultWorkerWeight - ).toBeUndefined() + workerChoiceStrategy + ).defaultWorkerWeight + ).toBeDefined() expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - )?.workersTaskRunTime - ).toBeUndefined() - pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) + workerChoiceStrategy + ).workersTaskRunTime + ).toBeDefined() + pool.setWorkerChoiceStrategy(workerChoiceStrategy) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN - ).currentWorkerId + pool.workerChoiceStrategyContext.workerChoiceStrategy + ).currentWorkerNodeId ).toBe(0) expect( pool.workerChoiceStrategyContext.workerChoiceStrategies.get( - WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN + pool.workerChoiceStrategyContext.workerChoiceStrategy ).defaultWorkerWeight ).toBeGreaterThan(0) - for (const workerKey of pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) + for (const workerNodeKey of pool.workerChoiceStrategyContext.workerChoiceStrategies + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) .workersTaskRunTime.keys()) { expect( pool.workerChoiceStrategyContext.workerChoiceStrategies - .get(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN) - .workersTaskRunTime.get(workerKey).runTime + .get(pool.workerChoiceStrategyContext.workerChoiceStrategy) + .workersTaskRunTime.get(workerNodeKey).runTime ).toBe(0) } // We need to clean up the resources after our test @@ -761,7 +715,7 @@ describe('Selection strategies test suite', () => { { workerChoiceStrategy: 'UNKNOWN_STRATEGY' } ) ).toThrowError( - new Error("Worker choice strategy 'UNKNOWN_STRATEGY' not found") + new Error("Invalid worker choice strategy 'UNKNOWN_STRATEGY'") ) }) })