From a1347286c3f5267a5b080793a5c16f96c7f69cde Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Fri, 9 Jun 2023 13:12:49 +0200 Subject: [PATCH] test: add least elu strategy test with dynamic pool MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- CHANGELOG.md | 4 ++ .../selection-strategies.test.js | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c487a497..ac82cb24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add `LEST_ELU` worker choice strategy. + ### Changed - Refactor pool worker node usage internals. diff --git a/tests/pools/selection-strategies/selection-strategies.test.js b/tests/pools/selection-strategies/selection-strategies.test.js index 8e226860..9e69c330 100644 --- a/tests/pools/selection-strategies/selection-strategies.test.js +++ b/tests/pools/selection-strategies/selection-strategies.test.js @@ -699,6 +699,64 @@ describe('Selection strategies test suite', () => { await pool.destroy() }) + it('Verify LEAST_ELU strategy can be run in a dynamic pool', async () => { + const pool = new DynamicThreadPool( + min, + max, + './tests/worker-files/thread/testWorker.js', + { workerChoiceStrategy: WorkerChoiceStrategies.LEAST_ELU } + ) + // TODO: Create a better test to cover `LeastEluWorkerChoiceStrategy#choose` + const maxMultiplier = 2 + for (let i = 0; i < max * maxMultiplier; i++) { + await pool.execute() + if (i !== max * maxMultiplier - 1) await TestUtils.sleep(500) + } + for (const workerNode of pool.workerNodes) { + const expectedWorkerUsage = { + tasks: { + executed: expect.any(Number), + executing: 0, + queued: 0, + failed: 0 + }, + runTime: { + aggregate: 0, + average: 0, + median: 0, + history: expect.any(CircularArray) + }, + waitTime: { + aggregate: 0, + average: 0, + median: 0, + history: expect.any(CircularArray) + } + } + if (workerNode.workerUsage.elu === undefined) { + expect(workerNode.workerUsage).toStrictEqual({ + ...expectedWorkerUsage, + elu: undefined + }) + } else { + expect(workerNode.workerUsage).toStrictEqual({ + ...expectedWorkerUsage, + elu: { + active: expect.any(Number), + idle: 0, + utilization: 1 + } + }) + } + expect(workerNode.workerUsage.tasks.executed).toBeGreaterThanOrEqual(0) + expect(workerNode.workerUsage.tasks.executed).toBeLessThanOrEqual( + max * maxMultiplier + ) + } + // 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( -- 2.34.1