1 const { expect
} = require('expect')
2 const sinon
= require('sinon')
7 } = require('../../../lib')
9 WorkerChoiceStrategyContext
10 } = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context')
12 RoundRobinWorkerChoiceStrategy
13 } = require('../../../lib/pools/selection-strategies/round-robin-worker-choice-strategy')
15 LeastUsedWorkerChoiceStrategy
16 } = require('../../../lib/pools/selection-strategies/least-used-worker-choice-strategy')
18 LeastBusyWorkerChoiceStrategy
19 } = require('../../../lib/pools/selection-strategies/least-busy-worker-choice-strategy')
21 FairShareWorkerChoiceStrategy
22 } = require('../../../lib/pools/selection-strategies/fair-share-worker-choice-strategy')
24 WeightedRoundRobinWorkerChoiceStrategy
25 } = require('../../../lib/pools/selection-strategies/weighted-round-robin-worker-choice-strategy')
27 InterleavedWeightedRoundRobinWorkerChoiceStrategy
28 } = require('../../../lib/pools/selection-strategies/interleaved-weighted-round-robin-worker-choice-strategy')
30 describe('Worker choice strategy context test suite', () => {
33 let fixedPool
, dynamicPool
36 fixedPool
= new FixedThreadPool(
38 './tests/worker-files/thread/testWorker.js'
40 dynamicPool
= new DynamicThreadPool(
43 './tests/worker-files/thread/testWorker.js'
52 await fixedPool
.destroy()
53 await dynamicPool
.destroy()
56 it('Verify that constructor() initializes the context with all the available worker choice strategies', () => {
57 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
60 expect(workerChoiceStrategyContext
.workerChoiceStrategies
.size
).toBe(
61 Object
.keys(WorkerChoiceStrategies
).length
65 it('Verify that execute() return the worker chosen by the strategy with fixed pool', () => {
66 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
69 const WorkerChoiceStrategyStub
= sinon
.createStubInstance(
70 RoundRobinWorkerChoiceStrategy
,
72 choose
: sinon
.stub().returns(0)
75 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
76 WorkerChoiceStrategies
.ROUND_ROBIN
78 workerChoiceStrategyContext
.workerChoiceStrategies
.set(
79 workerChoiceStrategyContext
.workerChoiceStrategy
,
80 WorkerChoiceStrategyStub
82 const chosenWorkerKey
= workerChoiceStrategyContext
.execute()
84 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
85 workerChoiceStrategyContext
.workerChoiceStrategy
88 expect(chosenWorkerKey
).toBe(0)
91 it('Verify that execute() throws error if null or undefined is returned', () => {
92 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
95 const WorkerChoiceStrategyUndefinedStub
= sinon
.createStubInstance(
96 RoundRobinWorkerChoiceStrategy
,
98 choose
: sinon
.stub().returns(undefined)
101 const WorkerChoiceStrategyNullStub
= sinon
.createStubInstance(
102 RoundRobinWorkerChoiceStrategy
,
104 choose
: sinon
.stub().returns(null)
107 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
108 WorkerChoiceStrategies
.ROUND_ROBIN
110 workerChoiceStrategyContext
.workerChoiceStrategies
.set(
111 workerChoiceStrategyContext
.workerChoiceStrategy
,
112 WorkerChoiceStrategyUndefinedStub
114 expect(() => workerChoiceStrategyContext
.execute()).toThrowError(
115 new Error('Worker node key chosen is null or undefined')
117 workerChoiceStrategyContext
.workerChoiceStrategies
.set(
118 workerChoiceStrategyContext
.workerChoiceStrategy
,
119 WorkerChoiceStrategyNullStub
121 expect(() => workerChoiceStrategyContext
.execute()).toThrowError(
122 new Error('Worker node key chosen is null or undefined')
126 it('Verify that execute() return the worker chosen by the strategy with dynamic pool', () => {
127 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
130 const WorkerChoiceStrategyStub
= sinon
.createStubInstance(
131 RoundRobinWorkerChoiceStrategy
,
133 choose
: sinon
.stub().returns(0)
136 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
137 WorkerChoiceStrategies
.ROUND_ROBIN
139 workerChoiceStrategyContext
.workerChoiceStrategies
.set(
140 workerChoiceStrategyContext
.workerChoiceStrategy
,
141 WorkerChoiceStrategyStub
143 const chosenWorkerKey
= workerChoiceStrategyContext
.execute()
145 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
146 workerChoiceStrategyContext
.workerChoiceStrategy
149 expect(chosenWorkerKey
).toBe(0)
152 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and fixed pool', () => {
153 const workerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
154 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
158 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
161 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
162 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
165 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
167 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
170 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
171 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
176 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
177 const workerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
178 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
182 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
185 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
186 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
189 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
191 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
194 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
195 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
200 it('Verify that setWorkerChoiceStrategy() works with LEAST_USED and fixed pool', () => {
201 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_USED
202 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
205 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
207 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
210 ).toBeInstanceOf(LeastUsedWorkerChoiceStrategy
)
211 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
216 it('Verify that setWorkerChoiceStrategy() works with LEAST_USED and dynamic pool', () => {
217 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_USED
218 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
221 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
223 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
226 ).toBeInstanceOf(LeastUsedWorkerChoiceStrategy
)
227 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
232 it('Verify that setWorkerChoiceStrategy() works with LEAST_BUSY and fixed pool', () => {
233 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_BUSY
234 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
237 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
239 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
242 ).toBeInstanceOf(LeastBusyWorkerChoiceStrategy
)
243 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
248 it('Verify that setWorkerChoiceStrategy() works with LEAST_BUSY and dynamic pool', () => {
249 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_BUSY
250 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
253 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
255 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
258 ).toBeInstanceOf(LeastBusyWorkerChoiceStrategy
)
259 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
264 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => {
265 const workerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
266 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
269 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
271 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
274 ).toBeInstanceOf(FairShareWorkerChoiceStrategy
)
275 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
280 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => {
281 const workerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
282 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
285 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
287 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
290 ).toBeInstanceOf(FairShareWorkerChoiceStrategy
)
291 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
296 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => {
297 const workerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
298 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
301 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
303 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
306 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy
)
307 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
312 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
313 const workerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
314 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
317 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
319 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
322 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy
)
323 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
328 it('Verify that setWorkerChoiceStrategy() works with INTERLEAVED_WEIGHTED_ROUND_ROBIN and fixed pool', () => {
329 const workerChoiceStrategy
=
330 WorkerChoiceStrategies
.INTERLEAVED_WEIGHTED_ROUND_ROBIN
331 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
334 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
336 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
339 ).toBeInstanceOf(InterleavedWeightedRoundRobinWorkerChoiceStrategy
)
340 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
345 it('Verify that setWorkerChoiceStrategy() works with INTERLEAVED_WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
346 const workerChoiceStrategy
=
347 WorkerChoiceStrategies
.INTERLEAVED_WEIGHTED_ROUND_ROBIN
348 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
351 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
353 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
356 ).toBeInstanceOf(InterleavedWeightedRoundRobinWorkerChoiceStrategy
)
357 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
362 it('Verify that worker choice strategy options enable median runtime pool statistics', () => {
363 const wwrWorkerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
364 let workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
366 wwrWorkerChoiceStrategy
,
371 expect(workerChoiceStrategyContext
.getRequiredStatistics().avgRunTime
).toBe(
374 expect(workerChoiceStrategyContext
.getRequiredStatistics().medRunTime
).toBe(
377 workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
379 wwrWorkerChoiceStrategy
,
384 expect(workerChoiceStrategyContext
.getRequiredStatistics().avgRunTime
).toBe(
387 expect(workerChoiceStrategyContext
.getRequiredStatistics().medRunTime
).toBe(
390 const fsWorkerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
391 workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
393 fsWorkerChoiceStrategy
,
398 expect(workerChoiceStrategyContext
.getRequiredStatistics().avgRunTime
).toBe(
401 expect(workerChoiceStrategyContext
.getRequiredStatistics().medRunTime
).toBe(
404 workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
406 fsWorkerChoiceStrategy
,
411 expect(workerChoiceStrategyContext
.getRequiredStatistics().avgRunTime
).toBe(
414 expect(workerChoiceStrategyContext
.getRequiredStatistics().medRunTime
).toBe(