1 const { expect
} = require('expect')
2 const sinon
= require('sinon')
7 } = require('../../../lib/index')
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
.workerChoiceStrategyType
).toBe(
73 WorkerChoiceStrategies
.ROUND_ROBIN
75 workerChoiceStrategyContext
.workerChoiceStrategies
.set(
76 workerChoiceStrategyContext
.workerChoiceStrategyType
,
77 WorkerChoiceStrategyStub
79 const chosenWorkerKey
= workerChoiceStrategyContext
.execute()
81 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
82 workerChoiceStrategyContext
.workerChoiceStrategyType
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
.workerChoiceStrategyType
).toBe(
99 WorkerChoiceStrategies
.ROUND_ROBIN
101 workerChoiceStrategyContext
.workerChoiceStrategies
.set(
102 workerChoiceStrategyContext
.workerChoiceStrategyType
,
103 WorkerChoiceStrategyStub
105 const chosenWorkerKey
= workerChoiceStrategyContext
.execute()
107 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
108 workerChoiceStrategyContext
.workerChoiceStrategyType
111 expect(chosenWorkerKey
).toBe(0)
114 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and fixed pool', () => {
115 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
119 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
120 WorkerChoiceStrategies
.ROUND_ROBIN
124 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
125 WorkerChoiceStrategies
.ROUND_ROBIN
127 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
128 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
129 WorkerChoiceStrategies
.ROUND_ROBIN
131 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
132 WorkerChoiceStrategies
.ROUND_ROBIN
135 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
136 WorkerChoiceStrategies
.ROUND_ROBIN
138 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
139 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
140 WorkerChoiceStrategies
.ROUND_ROBIN
144 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
145 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
149 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
150 WorkerChoiceStrategies
.ROUND_ROBIN
154 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
155 WorkerChoiceStrategies
.ROUND_ROBIN
157 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
158 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
159 WorkerChoiceStrategies
.ROUND_ROBIN
161 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
162 WorkerChoiceStrategies
.ROUND_ROBIN
165 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
166 WorkerChoiceStrategies
.ROUND_ROBIN
168 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy
)
169 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
170 WorkerChoiceStrategies
.ROUND_ROBIN
174 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => {
175 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
179 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
180 WorkerChoiceStrategies
.LESS_USED
183 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
184 WorkerChoiceStrategies
.LESS_USED
187 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
188 WorkerChoiceStrategies
.LESS_USED
190 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy
)
191 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
192 WorkerChoiceStrategies
.LESS_USED
196 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => {
197 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
201 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
202 WorkerChoiceStrategies
.LESS_USED
205 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
206 WorkerChoiceStrategies
.LESS_USED
209 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
210 WorkerChoiceStrategies
.LESS_USED
212 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy
)
213 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
214 WorkerChoiceStrategies
.LESS_USED
218 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => {
219 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
223 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
224 WorkerChoiceStrategies
.LESS_BUSY
227 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
228 WorkerChoiceStrategies
.LESS_BUSY
231 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
232 WorkerChoiceStrategies
.LESS_BUSY
234 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy
)
235 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
236 WorkerChoiceStrategies
.LESS_BUSY
240 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
241 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
245 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
246 WorkerChoiceStrategies
.LESS_BUSY
249 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
250 WorkerChoiceStrategies
.LESS_BUSY
253 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
254 WorkerChoiceStrategies
.LESS_BUSY
256 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy
)
257 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
258 WorkerChoiceStrategies
.LESS_BUSY
262 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => {
263 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
267 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
268 WorkerChoiceStrategies
.FAIR_SHARE
271 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
272 WorkerChoiceStrategies
.FAIR_SHARE
275 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
276 WorkerChoiceStrategies
.FAIR_SHARE
278 ).toBeInstanceOf(FairShareWorkerChoiceStrategy
)
279 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
280 WorkerChoiceStrategies
.FAIR_SHARE
284 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => {
285 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
289 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
290 WorkerChoiceStrategies
.FAIR_SHARE
293 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
294 WorkerChoiceStrategies
.FAIR_SHARE
297 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
298 WorkerChoiceStrategies
.FAIR_SHARE
300 ).toBeInstanceOf(FairShareWorkerChoiceStrategy
)
301 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
302 WorkerChoiceStrategies
.FAIR_SHARE
306 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => {
307 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
311 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
312 WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
315 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
316 WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
319 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
320 WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
322 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy
)
323 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
324 WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
328 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
329 const workerChoiceStrategyContext
= new WorkerChoiceStrategyContext(
333 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
334 WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
337 workerChoiceStrategyContext
.setWorkerChoiceStrategy(
338 WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
341 workerChoiceStrategyContext
.workerChoiceStrategies
.get(
342 WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
344 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy
)
345 expect(workerChoiceStrategyContext
.workerChoiceStrategyType
).toBe(
346 WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN