test: enhance worker selection strategies UTs
[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
7} = require('../../../lib/index')
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
40ad1d27
JB
53 it('Verify that execute() return the worker chosen by the strategy with fixed pool', () => {
54 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
55 fixedPool
56 )
57 const WorkerChoiceStrategyStub = sinon.createStubInstance(
58 RoundRobinWorkerChoiceStrategy,
59 {
c923ce56 60 choose: sinon.stub().returns(0)
40ad1d27
JB
61 }
62 )
95c83464
JB
63 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
64 WorkerChoiceStrategies.ROUND_ROBIN
65 )
66 workerChoiceStrategyContext.workerChoiceStrategies.set(
67 workerChoiceStrategyContext.workerChoiceStrategyType,
68 WorkerChoiceStrategyStub
69 )
c923ce56 70 const chosenWorkerKey = workerChoiceStrategyContext.execute()
40ad1d27 71 expect(
95c83464
JB
72 workerChoiceStrategyContext.workerChoiceStrategies.get(
73 workerChoiceStrategyContext.workerChoiceStrategyType
74 ).choose.calledOnce
40ad1d27 75 ).toBe(true)
c923ce56 76 expect(chosenWorkerKey).toBe(0)
40ad1d27
JB
77 })
78
79 it('Verify that execute() return the worker chosen by the strategy with dynamic pool', () => {
80 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
81 dynamicPool
82 )
83 const WorkerChoiceStrategyStub = sinon.createStubInstance(
84 RoundRobinWorkerChoiceStrategy,
85 {
c923ce56 86 choose: sinon.stub().returns(0)
40ad1d27
JB
87 }
88 )
95c83464
JB
89 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
90 WorkerChoiceStrategies.ROUND_ROBIN
91 )
92 workerChoiceStrategyContext.workerChoiceStrategies.set(
93 workerChoiceStrategyContext.workerChoiceStrategyType,
94 WorkerChoiceStrategyStub
95 )
c923ce56 96 const chosenWorkerKey = workerChoiceStrategyContext.execute()
40ad1d27 97 expect(
95c83464
JB
98 workerChoiceStrategyContext.workerChoiceStrategies.get(
99 workerChoiceStrategyContext.workerChoiceStrategyType
100 ).choose.calledOnce
40ad1d27 101 ).toBe(true)
c923ce56 102 expect(chosenWorkerKey).toBe(0)
40ad1d27
JB
103 })
104
105 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and fixed pool', () => {
106 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
107 fixedPool
108 )
283855e1
JB
109 expect(
110 workerChoiceStrategyContext.workerChoiceStrategies.get(
111 WorkerChoiceStrategies.ROUND_ROBIN
112 ).isDynamicPool
113 ).toBe(false)
95c83464
JB
114 expect(
115 workerChoiceStrategyContext.workerChoiceStrategies.get(
116 WorkerChoiceStrategies.ROUND_ROBIN
117 )
118 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
119 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
120 WorkerChoiceStrategies.ROUND_ROBIN
121 )
40ad1d27
JB
122 workerChoiceStrategyContext.setWorkerChoiceStrategy(
123 WorkerChoiceStrategies.ROUND_ROBIN
124 )
95c83464
JB
125 expect(
126 workerChoiceStrategyContext.workerChoiceStrategies.get(
127 WorkerChoiceStrategies.ROUND_ROBIN
128 )
129 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
130 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
131 WorkerChoiceStrategies.ROUND_ROBIN
132 )
40ad1d27
JB
133 })
134
23ff945a 135 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
40ad1d27
JB
136 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
137 dynamicPool
138 )
283855e1
JB
139 expect(
140 workerChoiceStrategyContext.workerChoiceStrategies.get(
141 WorkerChoiceStrategies.ROUND_ROBIN
142 ).isDynamicPool
143 ).toBe(true)
95c83464
JB
144 expect(
145 workerChoiceStrategyContext.workerChoiceStrategies.get(
146 WorkerChoiceStrategies.ROUND_ROBIN
147 )
148 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
149 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
150 WorkerChoiceStrategies.ROUND_ROBIN
151 )
40ad1d27
JB
152 workerChoiceStrategyContext.setWorkerChoiceStrategy(
153 WorkerChoiceStrategies.ROUND_ROBIN
154 )
95c83464
JB
155 expect(
156 workerChoiceStrategyContext.workerChoiceStrategies.get(
157 WorkerChoiceStrategies.ROUND_ROBIN
158 )
159 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
160 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
161 WorkerChoiceStrategies.ROUND_ROBIN
162 )
40ad1d27
JB
163 })
164
737c6d97 165 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => {
40ad1d27
JB
166 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
167 fixedPool
168 )
283855e1
JB
169 expect(
170 workerChoiceStrategyContext.workerChoiceStrategies.get(
171 WorkerChoiceStrategies.LESS_USED
172 ).isDynamicPool
173 ).toBe(false)
40ad1d27 174 workerChoiceStrategyContext.setWorkerChoiceStrategy(
737c6d97 175 WorkerChoiceStrategies.LESS_USED
40ad1d27 176 )
95c83464
JB
177 expect(
178 workerChoiceStrategyContext.workerChoiceStrategies.get(
179 WorkerChoiceStrategies.LESS_USED
180 )
181 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
b2b1d84e
JB
182 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
183 WorkerChoiceStrategies.LESS_USED
184 )
40ad1d27
JB
185 })
186
737c6d97 187 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => {
40ad1d27
JB
188 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
189 dynamicPool
190 )
283855e1
JB
191 expect(
192 workerChoiceStrategyContext.workerChoiceStrategies.get(
193 WorkerChoiceStrategies.LESS_USED
194 ).isDynamicPool
195 ).toBe(true)
40ad1d27 196 workerChoiceStrategyContext.setWorkerChoiceStrategy(
737c6d97 197 WorkerChoiceStrategies.LESS_USED
40ad1d27 198 )
95c83464
JB
199 expect(
200 workerChoiceStrategyContext.workerChoiceStrategies.get(
201 WorkerChoiceStrategies.LESS_USED
202 )
203 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
b2b1d84e
JB
204 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
205 WorkerChoiceStrategies.LESS_USED
206 )
168c526f
JB
207 })
208
209 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => {
210 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
211 fixedPool
212 )
283855e1
JB
213 expect(
214 workerChoiceStrategyContext.workerChoiceStrategies.get(
215 WorkerChoiceStrategies.LESS_BUSY
216 ).isDynamicPool
217 ).toBe(false)
168c526f
JB
218 workerChoiceStrategyContext.setWorkerChoiceStrategy(
219 WorkerChoiceStrategies.LESS_BUSY
220 )
95c83464
JB
221 expect(
222 workerChoiceStrategyContext.workerChoiceStrategies.get(
223 WorkerChoiceStrategies.LESS_BUSY
224 )
225 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
b2b1d84e
JB
226 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
227 WorkerChoiceStrategies.LESS_BUSY
228 )
168c526f
JB
229 })
230
231 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
232 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
233 dynamicPool
234 )
283855e1
JB
235 expect(
236 workerChoiceStrategyContext.workerChoiceStrategies.get(
237 WorkerChoiceStrategies.LESS_BUSY
238 ).isDynamicPool
239 ).toBe(true)
168c526f
JB
240 workerChoiceStrategyContext.setWorkerChoiceStrategy(
241 WorkerChoiceStrategies.LESS_BUSY
242 )
95c83464
JB
243 expect(
244 workerChoiceStrategyContext.workerChoiceStrategies.get(
245 WorkerChoiceStrategies.LESS_BUSY
246 )
247 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
b2b1d84e
JB
248 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
249 WorkerChoiceStrategies.LESS_BUSY
250 )
40ad1d27 251 })
23ff945a
JB
252
253 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => {
254 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
255 fixedPool
256 )
283855e1
JB
257 expect(
258 workerChoiceStrategyContext.workerChoiceStrategies.get(
259 WorkerChoiceStrategies.FAIR_SHARE
260 ).isDynamicPool
261 ).toBe(false)
23ff945a
JB
262 workerChoiceStrategyContext.setWorkerChoiceStrategy(
263 WorkerChoiceStrategies.FAIR_SHARE
264 )
95c83464
JB
265 expect(
266 workerChoiceStrategyContext.workerChoiceStrategies.get(
267 WorkerChoiceStrategies.FAIR_SHARE
268 )
269 ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
b2b1d84e
JB
270 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
271 WorkerChoiceStrategies.FAIR_SHARE
272 )
23ff945a
JB
273 })
274
275 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => {
276 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
277 dynamicPool
278 )
283855e1
JB
279 expect(
280 workerChoiceStrategyContext.workerChoiceStrategies.get(
281 WorkerChoiceStrategies.FAIR_SHARE
282 ).isDynamicPool
283 ).toBe(true)
23ff945a
JB
284 workerChoiceStrategyContext.setWorkerChoiceStrategy(
285 WorkerChoiceStrategies.FAIR_SHARE
286 )
95c83464
JB
287 expect(
288 workerChoiceStrategyContext.workerChoiceStrategies.get(
289 WorkerChoiceStrategies.FAIR_SHARE
290 )
291 ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
b2b1d84e
JB
292 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
293 WorkerChoiceStrategies.FAIR_SHARE
294 )
23ff945a
JB
295 })
296
c15273f2
JB
297 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => {
298 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
299 fixedPool
300 )
283855e1
JB
301 expect(
302 workerChoiceStrategyContext.workerChoiceStrategies.get(
303 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
304 ).isDynamicPool
305 ).toBe(false)
c15273f2
JB
306 workerChoiceStrategyContext.setWorkerChoiceStrategy(
307 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
308 )
95c83464
JB
309 expect(
310 workerChoiceStrategyContext.workerChoiceStrategies.get(
311 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
312 )
313 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
314 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
315 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
316 )
c15273f2 317 })
23ff945a 318
c15273f2
JB
319 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
320 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
321 dynamicPool
322 )
283855e1
JB
323 expect(
324 workerChoiceStrategyContext.workerChoiceStrategies.get(
325 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
326 ).isDynamicPool
327 ).toBe(true)
c15273f2
JB
328 workerChoiceStrategyContext.setWorkerChoiceStrategy(
329 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
330 )
95c83464
JB
331 expect(
332 workerChoiceStrategyContext.workerChoiceStrategies.get(
333 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
334 )
335 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
336 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
337 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
338 )
c15273f2 339 })
40ad1d27 340})