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 LessUsedWorkerChoiceStrategy
16 } = require('../../../lib/pools/selection-strategies/less-used-worker-choice-strategy')
18 LessBusyWorkerChoiceStrategy
19 } = require('../../../lib/pools/selection-strategies/less-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 describe('Worker choice strategy context test suite', () => {
30 let fixedPool
, dynamicPool
33 fixedPool
= new FixedThreadPool(
35 './tests/worker-files/thread/testWorker.js'
37 dynamicPool
= new DynamicThreadPool(
40 './tests/worker-files/thread/testWorker.js'
49 await fixedPool
.destroy()
50 await dynamicPool
.destroy()
53 it('Verify that constructor() initializes the context with all the available worker choice strategies', () => {
54 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
57 expect(workerChoiceStrategyContext
.workerChoiceStrategies
.size
).toBe(
58 Object
.keys(WorkerChoiceStrategies
).length
62 it('Verify that execute() return the worker chosen by the strategy with fixed pool', () => {
63 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
66 const WorkerChoiceStrategyStub
= sinon
.createStubInstance(
67 RoundRobinWorkerChoiceStrategy
,
69 choose
: sinon
.stub().returns(0)
72 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
73 WorkerChoiceStrategies
.ROUND_ROBIN
75 workerChoiceStrategyContext
.workerChoiceStrategies
.set(
76 workerChoiceStrategyContext
.workerChoiceStrategy
,
77 WorkerChoiceStrategyStub
79 const chosenWorkerKey
= workerChoiceStrategyContext
.execute()
81 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
82 workerChoiceStrategyContext
.workerChoiceStrategy
85 expect(chosenWorkerKey
).toBe(0)
88 it('Verify that execute() return the worker chosen by the strategy with dynamic pool', () => {
89 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
92 const WorkerChoiceStrategyStub
= sinon
.createStubInstance(
93 RoundRobinWorkerChoiceStrategy
,
95 choose
: sinon
.stub().returns(0)
98 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
99 WorkerChoiceStrategies
.ROUND_ROBIN
101 workerChoiceStrategyContext
.workerChoiceStrategies
.set(
102 workerChoiceStrategyContext
.workerChoiceStrategy
,
103 WorkerChoiceStrategyStub
105 const chosenWorkerKey
= workerChoiceStrategyContext
.execute()
107 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
108 workerChoiceStrategyContext
.workerChoiceStrategy
111 expect(chosenWorkerKey
).toBe(0)
114 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and fixed pool', () => {
115 const workerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
116 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
120 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
125 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
128 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
129 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
132 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
134 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
137 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
138 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
143 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
144 const workerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
145 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
149 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
154 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
157 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
158 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
161 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
163 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
166 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
167 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
172 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => {
173 const workerChoiceStrategy
= WorkerChoiceStrategies
.LESS_USED
174 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
178 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
182 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
184 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
187 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy
)
188 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
193 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => {
194 const workerChoiceStrategy
= WorkerChoiceStrategies
.LESS_USED
195 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
199 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
203 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
205 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
208 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy
)
209 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
214 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => {
215 const workerChoiceStrategy
= WorkerChoiceStrategies
.LESS_BUSY
216 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
220 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
224 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
226 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
229 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy
)
230 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
235 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
236 const workerChoiceStrategy
= WorkerChoiceStrategies
.LESS_BUSY
237 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
241 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
245 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
247 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
250 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy
)
251 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
256 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => {
257 const workerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
258 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
262 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
266 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
268 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
271 ).toBeInstanceOf(FairShareWorkerChoiceStrategy
)
272 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
277 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => {
278 const workerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
279 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
283 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
287 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
289 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
292 ).toBeInstanceOf(FairShareWorkerChoiceStrategy
)
293 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
298 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => {
299 const workerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
300 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
304 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
308 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
310 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
313 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy
)
314 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
319 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
320 const workerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
321 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
325 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
329 workerChoiceStrategyContext
.setWorkerChoiceStrategy(workerChoiceStrategy
)
331 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
334 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy
)
335 expect(workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
340 it('Verify that worker choice strategy options enable median run time pool statistics', () => {
341 const wwrWorkerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
342 let workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
344 wwrWorkerChoiceStrategy
,
349 expect(workerChoiceStrategyContext
.getRequiredStatistics().avgRunTime
).toBe(
352 expect(workerChoiceStrategyContext
.getRequiredStatistics().medRunTime
).toBe(
355 workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
357 wwrWorkerChoiceStrategy
,
362 expect(workerChoiceStrategyContext
.getRequiredStatistics().avgRunTime
).toBe(
365 expect(workerChoiceStrategyContext
.getRequiredStatistics().medRunTime
).toBe(
368 const fsWorkerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
369 workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
371 fsWorkerChoiceStrategy
,
376 expect(workerChoiceStrategyContext
.getRequiredStatistics().avgRunTime
).toBe(
379 expect(workerChoiceStrategyContext
.getRequiredStatistics().medRunTime
).toBe(
382 workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
384 fsWorkerChoiceStrategy
,
389 expect(workerChoiceStrategyContext
.getRequiredStatistics().avgRunTime
).toBe(
392 expect(workerChoiceStrategyContext
.getRequiredStatistics().medRunTime
).toBe(