refactor: check for null and undefined
[poolifier.git] / tests / pools / selection-strategies / worker-choice-strategy-context.test.js
1 const { expect } = require('expect')
2 const sinon = require('sinon')
3 const {
4 FixedThreadPool,
5 DynamicThreadPool,
6 WorkerChoiceStrategies
7 } = require('../../../lib/index')
8 const {
9 WorkerChoiceStrategyContext
10 } = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context')
11 const {
12 RoundRobinWorkerChoiceStrategy
13 } = require('../../../lib/pools/selection-strategies/round-robin-worker-choice-strategy')
14 const {
15 LessUsedWorkerChoiceStrategy
16 } = require('../../../lib/pools/selection-strategies/less-used-worker-choice-strategy')
17 const {
18 LessBusyWorkerChoiceStrategy
19 } = require('../../../lib/pools/selection-strategies/less-busy-worker-choice-strategy')
20 const {
21 FairShareWorkerChoiceStrategy
22 } = require('../../../lib/pools/selection-strategies/fair-share-worker-choice-strategy')
23 const {
24 WeightedRoundRobinWorkerChoiceStrategy
25 } = require('../../../lib/pools/selection-strategies/weighted-round-robin-worker-choice-strategy')
26
27 describe('Worker choice strategy context test suite', () => {
28 const min = 1
29 const max = 3
30 let fixedPool, dynamicPool
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 )
42 })
43
44 afterEach(() => {
45 sinon.restore()
46 })
47
48 after(async () => {
49 await fixedPool.destroy()
50 await dynamicPool.destroy()
51 })
52
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 {
60 choose: sinon.stub().returns(0)
61 }
62 )
63 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
64 WorkerChoiceStrategies.ROUND_ROBIN
65 )
66 workerChoiceStrategyContext.workerChoiceStrategies.set(
67 workerChoiceStrategyContext.workerChoiceStrategyType,
68 WorkerChoiceStrategyStub
69 )
70 const chosenWorkerKey = workerChoiceStrategyContext.execute()
71 expect(
72 workerChoiceStrategyContext.workerChoiceStrategies.get(
73 workerChoiceStrategyContext.workerChoiceStrategyType
74 ).choose.calledOnce
75 ).toBe(true)
76 expect(chosenWorkerKey).toBe(0)
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 {
86 choose: sinon.stub().returns(0)
87 }
88 )
89 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
90 WorkerChoiceStrategies.ROUND_ROBIN
91 )
92 workerChoiceStrategyContext.workerChoiceStrategies.set(
93 workerChoiceStrategyContext.workerChoiceStrategyType,
94 WorkerChoiceStrategyStub
95 )
96 const chosenWorkerKey = workerChoiceStrategyContext.execute()
97 expect(
98 workerChoiceStrategyContext.workerChoiceStrategies.get(
99 workerChoiceStrategyContext.workerChoiceStrategyType
100 ).choose.calledOnce
101 ).toBe(true)
102 expect(chosenWorkerKey).toBe(0)
103 })
104
105 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and fixed pool', () => {
106 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
107 fixedPool
108 )
109 expect(
110 workerChoiceStrategyContext.workerChoiceStrategies.get(
111 WorkerChoiceStrategies.ROUND_ROBIN
112 ).isDynamicPool
113 ).toBe(false)
114 expect(
115 workerChoiceStrategyContext.workerChoiceStrategies.get(
116 WorkerChoiceStrategies.ROUND_ROBIN
117 )
118 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
119 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
120 WorkerChoiceStrategies.ROUND_ROBIN
121 )
122 workerChoiceStrategyContext.setWorkerChoiceStrategy(
123 WorkerChoiceStrategies.ROUND_ROBIN
124 )
125 expect(
126 workerChoiceStrategyContext.workerChoiceStrategies.get(
127 WorkerChoiceStrategies.ROUND_ROBIN
128 )
129 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
130 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
131 WorkerChoiceStrategies.ROUND_ROBIN
132 )
133 })
134
135 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
136 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
137 dynamicPool
138 )
139 expect(
140 workerChoiceStrategyContext.workerChoiceStrategies.get(
141 WorkerChoiceStrategies.ROUND_ROBIN
142 ).isDynamicPool
143 ).toBe(true)
144 expect(
145 workerChoiceStrategyContext.workerChoiceStrategies.get(
146 WorkerChoiceStrategies.ROUND_ROBIN
147 )
148 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
149 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
150 WorkerChoiceStrategies.ROUND_ROBIN
151 )
152 workerChoiceStrategyContext.setWorkerChoiceStrategy(
153 WorkerChoiceStrategies.ROUND_ROBIN
154 )
155 expect(
156 workerChoiceStrategyContext.workerChoiceStrategies.get(
157 WorkerChoiceStrategies.ROUND_ROBIN
158 )
159 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
160 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
161 WorkerChoiceStrategies.ROUND_ROBIN
162 )
163 })
164
165 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => {
166 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
167 fixedPool
168 )
169 expect(
170 workerChoiceStrategyContext.workerChoiceStrategies.get(
171 WorkerChoiceStrategies.LESS_USED
172 ).isDynamicPool
173 ).toBe(false)
174 workerChoiceStrategyContext.setWorkerChoiceStrategy(
175 WorkerChoiceStrategies.LESS_USED
176 )
177 expect(
178 workerChoiceStrategyContext.workerChoiceStrategies.get(
179 WorkerChoiceStrategies.LESS_USED
180 )
181 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
182 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
183 WorkerChoiceStrategies.LESS_USED
184 )
185 })
186
187 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => {
188 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
189 dynamicPool
190 )
191 expect(
192 workerChoiceStrategyContext.workerChoiceStrategies.get(
193 WorkerChoiceStrategies.LESS_USED
194 ).isDynamicPool
195 ).toBe(true)
196 workerChoiceStrategyContext.setWorkerChoiceStrategy(
197 WorkerChoiceStrategies.LESS_USED
198 )
199 expect(
200 workerChoiceStrategyContext.workerChoiceStrategies.get(
201 WorkerChoiceStrategies.LESS_USED
202 )
203 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
204 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
205 WorkerChoiceStrategies.LESS_USED
206 )
207 })
208
209 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => {
210 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
211 fixedPool
212 )
213 expect(
214 workerChoiceStrategyContext.workerChoiceStrategies.get(
215 WorkerChoiceStrategies.LESS_BUSY
216 ).isDynamicPool
217 ).toBe(false)
218 workerChoiceStrategyContext.setWorkerChoiceStrategy(
219 WorkerChoiceStrategies.LESS_BUSY
220 )
221 expect(
222 workerChoiceStrategyContext.workerChoiceStrategies.get(
223 WorkerChoiceStrategies.LESS_BUSY
224 )
225 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
226 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
227 WorkerChoiceStrategies.LESS_BUSY
228 )
229 })
230
231 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
232 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
233 dynamicPool
234 )
235 expect(
236 workerChoiceStrategyContext.workerChoiceStrategies.get(
237 WorkerChoiceStrategies.LESS_BUSY
238 ).isDynamicPool
239 ).toBe(true)
240 workerChoiceStrategyContext.setWorkerChoiceStrategy(
241 WorkerChoiceStrategies.LESS_BUSY
242 )
243 expect(
244 workerChoiceStrategyContext.workerChoiceStrategies.get(
245 WorkerChoiceStrategies.LESS_BUSY
246 )
247 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
248 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
249 WorkerChoiceStrategies.LESS_BUSY
250 )
251 })
252
253 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => {
254 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
255 fixedPool
256 )
257 expect(
258 workerChoiceStrategyContext.workerChoiceStrategies.get(
259 WorkerChoiceStrategies.FAIR_SHARE
260 ).isDynamicPool
261 ).toBe(false)
262 workerChoiceStrategyContext.setWorkerChoiceStrategy(
263 WorkerChoiceStrategies.FAIR_SHARE
264 )
265 expect(
266 workerChoiceStrategyContext.workerChoiceStrategies.get(
267 WorkerChoiceStrategies.FAIR_SHARE
268 )
269 ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
270 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
271 WorkerChoiceStrategies.FAIR_SHARE
272 )
273 })
274
275 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => {
276 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
277 dynamicPool
278 )
279 expect(
280 workerChoiceStrategyContext.workerChoiceStrategies.get(
281 WorkerChoiceStrategies.FAIR_SHARE
282 ).isDynamicPool
283 ).toBe(true)
284 workerChoiceStrategyContext.setWorkerChoiceStrategy(
285 WorkerChoiceStrategies.FAIR_SHARE
286 )
287 expect(
288 workerChoiceStrategyContext.workerChoiceStrategies.get(
289 WorkerChoiceStrategies.FAIR_SHARE
290 )
291 ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
292 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
293 WorkerChoiceStrategies.FAIR_SHARE
294 )
295 })
296
297 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => {
298 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
299 fixedPool
300 )
301 expect(
302 workerChoiceStrategyContext.workerChoiceStrategies.get(
303 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
304 ).isDynamicPool
305 ).toBe(false)
306 workerChoiceStrategyContext.setWorkerChoiceStrategy(
307 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
308 )
309 expect(
310 workerChoiceStrategyContext.workerChoiceStrategies.get(
311 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
312 )
313 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
314 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
315 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
316 )
317 })
318
319 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
320 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
321 dynamicPool
322 )
323 expect(
324 workerChoiceStrategyContext.workerChoiceStrategies.get(
325 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
326 ).isDynamicPool
327 ).toBe(true)
328 workerChoiceStrategyContext.setWorkerChoiceStrategy(
329 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
330 )
331 expect(
332 workerChoiceStrategyContext.workerChoiceStrategies.get(
333 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
334 )
335 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
336 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
337 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
338 )
339 })
340 })