test: test for undefined worker node key chosen
[poolifier.git] / tests / pools / selection-strategies / worker-choice-strategy-context.test.js
CommitLineData
40ad1d27
JB
1const { expect } = require('expect')
2const sinon = require('sinon')
3const {
4 FixedThreadPool,
5 DynamicThreadPool,
6 WorkerChoiceStrategies
cdace0e5 7} = require('../../../lib')
23ff945a
JB
8const {
9 WorkerChoiceStrategyContext
10} = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context')
40ad1d27
JB
11const {
12 RoundRobinWorkerChoiceStrategy
13} = require('../../../lib/pools/selection-strategies/round-robin-worker-choice-strategy')
14const {
737c6d97
JB
15 LessUsedWorkerChoiceStrategy
16} = require('../../../lib/pools/selection-strategies/less-used-worker-choice-strategy')
168c526f
JB
17const {
18 LessBusyWorkerChoiceStrategy
19} = require('../../../lib/pools/selection-strategies/less-busy-worker-choice-strategy')
40ad1d27 20const {
23ff945a
JB
21 FairShareWorkerChoiceStrategy
22} = require('../../../lib/pools/selection-strategies/fair-share-worker-choice-strategy')
c15273f2
JB
23const {
24 WeightedRoundRobinWorkerChoiceStrategy
fa6f1296 25} = require('../../../lib/pools/selection-strategies/weighted-round-robin-worker-choice-strategy')
40ad1d27
JB
26
27describe('Worker choice strategy context test suite', () => {
c15273f2
JB
28 const min = 1
29 const max = 3
40ad1d27 30 let fixedPool, dynamicPool
c15273f2
JB
31
32 before(() => {
33 fixedPool = new FixedThreadPool(
34 max,
35 './tests/worker-files/thread/testWorker.js'
36 )
37 dynamicPool = new DynamicThreadPool(
38 min,
39 max,
40 './tests/worker-files/thread/testWorker.js'
41 )
40ad1d27
JB
42 })
43
44 afterEach(() => {
45 sinon.restore()
46 })
47
fd7ebd49
JB
48 after(async () => {
49 await fixedPool.destroy()
50 await dynamicPool.destroy()
c15273f2
JB
51 })
52
2285a040
JB
53 it('Verify that constructor() initializes the context with all the available worker choice strategies', () => {
54 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
55 fixedPool
56 )
57 expect(workerChoiceStrategyContext.workerChoiceStrategies.size).toBe(
58 Object.keys(WorkerChoiceStrategies).length
59 )
60 })
61
40ad1d27
JB
62 it('Verify that execute() return the worker chosen by the strategy with fixed pool', () => {
63 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
64 fixedPool
65 )
66 const WorkerChoiceStrategyStub = sinon.createStubInstance(
67 RoundRobinWorkerChoiceStrategy,
68 {
c923ce56 69 choose: sinon.stub().returns(0)
40ad1d27
JB
70 }
71 )
d710242d 72 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
95c83464
JB
73 WorkerChoiceStrategies.ROUND_ROBIN
74 )
75 workerChoiceStrategyContext.workerChoiceStrategies.set(
d710242d 76 workerChoiceStrategyContext.workerChoiceStrategy,
95c83464
JB
77 WorkerChoiceStrategyStub
78 )
c923ce56 79 const chosenWorkerKey = workerChoiceStrategyContext.execute()
40ad1d27 80 expect(
95c83464 81 workerChoiceStrategyContext.workerChoiceStrategies.get(
d710242d 82 workerChoiceStrategyContext.workerChoiceStrategy
95c83464 83 ).choose.calledOnce
40ad1d27 84 ).toBe(true)
c923ce56 85 expect(chosenWorkerKey).toBe(0)
40ad1d27
JB
86 })
87
527e715f
JB
88 it('Verify that execute() throws error if null or undefined is returned', () => {
89 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
90 fixedPool
91 )
92 const WorkerChoiceStrategyStub = sinon.createStubInstance(
93 RoundRobinWorkerChoiceStrategy,
94 {
95 choose: sinon.stub().returns(undefined)
96 }
97 )
98 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
99 WorkerChoiceStrategies.ROUND_ROBIN
100 )
101 workerChoiceStrategyContext.workerChoiceStrategies.set(
102 workerChoiceStrategyContext.workerChoiceStrategy,
103 WorkerChoiceStrategyStub
104 )
105 expect(() => workerChoiceStrategyContext.execute()).toThrowError(
106 new Error('Worker node key chosen is null or undefined')
107 )
108 })
109
40ad1d27
JB
110 it('Verify that execute() return the worker chosen by the strategy with dynamic pool', () => {
111 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
112 dynamicPool
113 )
114 const WorkerChoiceStrategyStub = sinon.createStubInstance(
115 RoundRobinWorkerChoiceStrategy,
116 {
c923ce56 117 choose: sinon.stub().returns(0)
40ad1d27
JB
118 }
119 )
d710242d 120 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
95c83464
JB
121 WorkerChoiceStrategies.ROUND_ROBIN
122 )
123 workerChoiceStrategyContext.workerChoiceStrategies.set(
d710242d 124 workerChoiceStrategyContext.workerChoiceStrategy,
95c83464
JB
125 WorkerChoiceStrategyStub
126 )
c923ce56 127 const chosenWorkerKey = workerChoiceStrategyContext.execute()
40ad1d27 128 expect(
95c83464 129 workerChoiceStrategyContext.workerChoiceStrategies.get(
d710242d 130 workerChoiceStrategyContext.workerChoiceStrategy
95c83464 131 ).choose.calledOnce
40ad1d27 132 ).toBe(true)
c923ce56 133 expect(chosenWorkerKey).toBe(0)
40ad1d27
JB
134 })
135
136 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and fixed pool', () => {
594bfb84 137 const workerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
40ad1d27
JB
138 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
139 fixedPool
140 )
95c83464
JB
141 expect(
142 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 143 workerChoiceStrategy
95c83464
JB
144 )
145 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
d710242d 146 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 147 workerChoiceStrategy
40ad1d27 148 )
594bfb84 149 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
150 expect(
151 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 152 workerChoiceStrategy
95c83464
JB
153 )
154 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
d710242d 155 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 156 workerChoiceStrategy
b2b1d84e 157 )
40ad1d27
JB
158 })
159
23ff945a 160 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
594bfb84 161 const workerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
40ad1d27
JB
162 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
163 dynamicPool
164 )
95c83464
JB
165 expect(
166 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 167 workerChoiceStrategy
95c83464
JB
168 )
169 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
d710242d 170 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 171 workerChoiceStrategy
40ad1d27 172 )
594bfb84 173 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
174 expect(
175 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 176 workerChoiceStrategy
95c83464
JB
177 )
178 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
d710242d 179 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 180 workerChoiceStrategy
b2b1d84e 181 )
40ad1d27
JB
182 })
183
737c6d97 184 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => {
594bfb84 185 const workerChoiceStrategy = WorkerChoiceStrategies.LESS_USED
40ad1d27
JB
186 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
187 fixedPool
188 )
594bfb84 189 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
190 expect(
191 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 192 workerChoiceStrategy
95c83464
JB
193 )
194 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
d710242d 195 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 196 workerChoiceStrategy
b2b1d84e 197 )
40ad1d27
JB
198 })
199
737c6d97 200 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => {
594bfb84 201 const workerChoiceStrategy = WorkerChoiceStrategies.LESS_USED
40ad1d27
JB
202 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
203 dynamicPool
204 )
594bfb84 205 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
206 expect(
207 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 208 workerChoiceStrategy
95c83464
JB
209 )
210 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
d710242d 211 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 212 workerChoiceStrategy
b2b1d84e 213 )
168c526f
JB
214 })
215
216 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => {
594bfb84 217 const workerChoiceStrategy = WorkerChoiceStrategies.LESS_BUSY
168c526f
JB
218 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
219 fixedPool
220 )
594bfb84 221 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
222 expect(
223 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 224 workerChoiceStrategy
95c83464
JB
225 )
226 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
d710242d 227 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 228 workerChoiceStrategy
b2b1d84e 229 )
168c526f
JB
230 })
231
232 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
594bfb84 233 const workerChoiceStrategy = WorkerChoiceStrategies.LESS_BUSY
168c526f
JB
234 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
235 dynamicPool
236 )
594bfb84 237 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
238 expect(
239 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 240 workerChoiceStrategy
95c83464
JB
241 )
242 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
d710242d 243 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 244 workerChoiceStrategy
b2b1d84e 245 )
40ad1d27 246 })
23ff945a
JB
247
248 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => {
594bfb84 249 const workerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
23ff945a
JB
250 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
251 fixedPool
252 )
594bfb84 253 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
254 expect(
255 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 256 workerChoiceStrategy
95c83464
JB
257 )
258 ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
d710242d 259 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 260 workerChoiceStrategy
b2b1d84e 261 )
23ff945a
JB
262 })
263
264 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => {
594bfb84 265 const workerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
23ff945a
JB
266 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
267 dynamicPool
268 )
594bfb84 269 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
270 expect(
271 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 272 workerChoiceStrategy
95c83464
JB
273 )
274 ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
d710242d 275 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 276 workerChoiceStrategy
b2b1d84e 277 )
23ff945a
JB
278 })
279
c15273f2 280 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => {
594bfb84 281 const workerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
c15273f2
JB
282 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
283 fixedPool
284 )
594bfb84 285 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
286 expect(
287 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 288 workerChoiceStrategy
95c83464
JB
289 )
290 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
d710242d 291 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 292 workerChoiceStrategy
b2b1d84e 293 )
c15273f2 294 })
23ff945a 295
c15273f2 296 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
594bfb84 297 const workerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
c15273f2
JB
298 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
299 dynamicPool
300 )
594bfb84 301 workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
95c83464
JB
302 expect(
303 workerChoiceStrategyContext.workerChoiceStrategies.get(
594bfb84 304 workerChoiceStrategy
95c83464
JB
305 )
306 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
d710242d 307 expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
594bfb84 308 workerChoiceStrategy
b2b1d84e 309 )
c15273f2 310 })
2fc5cae3 311
73491b69 312 it('Verify that worker choice strategy options enable median run time pool statistics', () => {
2fc5cae3
JB
313 const wwrWorkerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
314 let workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
315 fixedPool,
316 wwrWorkerChoiceStrategy,
317 {
318 medRunTime: true
319 }
320 )
321 expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
322 false
323 )
324 expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
325 true
326 )
327 workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
328 dynamicPool,
329 wwrWorkerChoiceStrategy,
330 {
331 medRunTime: true
332 }
333 )
334 expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
335 false
336 )
337 expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
338 true
339 )
340 const fsWorkerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
341 workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
342 fixedPool,
343 fsWorkerChoiceStrategy,
344 {
345 medRunTime: true
346 }
347 )
348 expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
349 false
350 )
351 expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
352 true
353 )
354 workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
355 dynamicPool,
356 fsWorkerChoiceStrategy,
357 {
358 medRunTime: true
359 }
360 )
361 expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
362 false
363 )
364 expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
365 true
366 )
367 })
40ad1d27 368})