X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=tests%2Fpools%2Fselection-strategies%2Fworker-choice-strategy-context.test.mjs;h=f076f4ddda866dc79735530a8ec4003202dee772;hb=af7f2788b6fcc39343d544551cf17c8f0dc5b757;hp=e95911db8d6cfb18da375bc2f18a44321e1e6685;hpb=229e9e73566ed1960ba5be0534fb3aa2eeb115eb;p=poolifier.git diff --git a/tests/pools/selection-strategies/worker-choice-strategy-context.test.mjs b/tests/pools/selection-strategies/worker-choice-strategy-context.test.mjs index e95911db..f076f4dd 100644 --- a/tests/pools/selection-strategies/worker-choice-strategy-context.test.mjs +++ b/tests/pools/selection-strategies/worker-choice-strategy-context.test.mjs @@ -49,13 +49,14 @@ describe('Worker choice strategy context test suite', () => { ) }) - it('Verify that execute() return the worker chosen by the strategy with fixed pool', () => { + it('Verify that execute() return the worker node key chosen by the strategy with fixed pool', () => { const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( fixedPool ) - const WorkerChoiceStrategyStub = createStubInstance( + const workerChoiceStrategyStub = createStubInstance( RoundRobinWorkerChoiceStrategy, { + hasPoolWorkerNodesReady: stub().returns(true), choose: stub().returns(0) } ) @@ -64,7 +65,7 @@ describe('Worker choice strategy context test suite', () => { ) workerChoiceStrategyContext.workerChoiceStrategies.set( workerChoiceStrategyContext.workerChoiceStrategy, - WorkerChoiceStrategyStub + workerChoiceStrategyStub ) const chosenWorkerKey = workerChoiceStrategyContext.execute() expect( @@ -79,44 +80,117 @@ describe('Worker choice strategy context test suite', () => { const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( fixedPool ) - const WorkerChoiceStrategyUndefinedStub = createStubInstance( + expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe( + WorkerChoiceStrategies.ROUND_ROBIN + ) + const workerChoiceStrategyUndefinedStub = createStubInstance( RoundRobinWorkerChoiceStrategy, { + hasPoolWorkerNodesReady: stub().returns(true), choose: stub().returns(undefined) } ) - const WorkerChoiceStrategyNullStub = createStubInstance( + workerChoiceStrategyContext.workerChoiceStrategies.set( + workerChoiceStrategyContext.workerChoiceStrategy, + workerChoiceStrategyUndefinedStub + ) + expect(() => workerChoiceStrategyContext.execute()).toThrow( + new Error( + `Worker node key chosen is null or undefined after ${fixedPool.info.maxSize} retries` + ) + ) + const workerChoiceStrategyNullStub = createStubInstance( RoundRobinWorkerChoiceStrategy, { + hasPoolWorkerNodesReady: stub().returns(true), choose: stub().returns(null) } ) + workerChoiceStrategyContext.workerChoiceStrategies.set( + workerChoiceStrategyContext.workerChoiceStrategy, + workerChoiceStrategyNullStub + ) + expect(() => workerChoiceStrategyContext.execute()).toThrow( + new Error( + `Worker node key chosen is null or undefined after ${fixedPool.info.maxSize} retries` + ) + ) + }) + + it('Verify that execute() retry until a worker node is ready and chosen', () => { + const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( + fixedPool + ) + const workerChoiceStrategyStub = createStubInstance( + RoundRobinWorkerChoiceStrategy, + { + hasPoolWorkerNodesReady: stub() + .onCall(0) + .returns(false) + .onCall(1) + .returns(false) + .onCall(2) + .returns(false) + .onCall(3) + .returns(false) + .onCall(4) + .returns(false) + .returns(true), + choose: stub().returns(1) + } + ) expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe( WorkerChoiceStrategies.ROUND_ROBIN ) workerChoiceStrategyContext.workerChoiceStrategies.set( workerChoiceStrategyContext.workerChoiceStrategy, - WorkerChoiceStrategyUndefinedStub + workerChoiceStrategyStub + ) + const chosenWorkerKey = workerChoiceStrategyContext.execute() + expect( + workerChoiceStrategyContext.workerChoiceStrategies.get( + workerChoiceStrategyContext.workerChoiceStrategy + ).hasPoolWorkerNodesReady.callCount + ).toBe(6) + expect( + workerChoiceStrategyContext.workerChoiceStrategies.get( + workerChoiceStrategyContext.workerChoiceStrategy + ).choose.callCount + ).toBe(1) + expect(chosenWorkerKey).toBe(1) + }) + + it('Verify that execute() throws error if worker choice strategy recursion reach the maximum depth', () => { + const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( + fixedPool + ) + const workerChoiceStrategyStub = createStubInstance( + RoundRobinWorkerChoiceStrategy, + { + hasPoolWorkerNodesReady: stub().returns(false), + choose: stub().returns(0) + } ) - expect(() => workerChoiceStrategyContext.execute()).toThrowError( - new Error('Worker node key chosen is null or undefined after 6 retries') + expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe( + WorkerChoiceStrategies.ROUND_ROBIN ) workerChoiceStrategyContext.workerChoiceStrategies.set( workerChoiceStrategyContext.workerChoiceStrategy, - WorkerChoiceStrategyNullStub + workerChoiceStrategyStub ) - expect(() => workerChoiceStrategyContext.execute()).toThrowError( - new Error('Worker node key chosen is null or undefined after 6 retries') + expect(() => workerChoiceStrategyContext.execute()).toThrow( + new RangeError('Maximum call stack size exceeded') ) }) - it('Verify that execute() return the worker chosen by the strategy with dynamic pool', () => { + it('Verify that execute() return the worker node key chosen by the strategy with dynamic pool', () => { const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( dynamicPool ) - const WorkerChoiceStrategyStub = createStubInstance( + const workerChoiceStrategyStub = createStubInstance( RoundRobinWorkerChoiceStrategy, { + hasPoolWorkerNodesReady: stub().returns(true), choose: stub().returns(0) } ) @@ -125,7 +199,7 @@ describe('Worker choice strategy context test suite', () => { ) workerChoiceStrategyContext.workerChoiceStrategies.set( workerChoiceStrategyContext.workerChoiceStrategy, - WorkerChoiceStrategyStub + workerChoiceStrategyStub ) const chosenWorkerKey = workerChoiceStrategyContext.execute() expect(