Commit | Line | Data |
---|---|---|
40ad1d27 JB |
1 | const { expect } = require('expect') |
2 | const sinon = require('sinon') | |
3 | const { | |
4 | FixedThreadPool, | |
5 | DynamicThreadPool, | |
6 | WorkerChoiceStrategies | |
cdace0e5 | 7 | } = require('../../../lib') |
23ff945a JB |
8 | const { |
9 | WorkerChoiceStrategyContext | |
10 | } = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context') | |
40ad1d27 JB |
11 | const { |
12 | RoundRobinWorkerChoiceStrategy | |
13 | } = require('../../../lib/pools/selection-strategies/round-robin-worker-choice-strategy') | |
14 | const { | |
737c6d97 JB |
15 | LessUsedWorkerChoiceStrategy |
16 | } = require('../../../lib/pools/selection-strategies/less-used-worker-choice-strategy') | |
168c526f JB |
17 | const { |
18 | LessBusyWorkerChoiceStrategy | |
19 | } = require('../../../lib/pools/selection-strategies/less-busy-worker-choice-strategy') | |
40ad1d27 | 20 | const { |
23ff945a JB |
21 | FairShareWorkerChoiceStrategy |
22 | } = require('../../../lib/pools/selection-strategies/fair-share-worker-choice-strategy') | |
c15273f2 JB |
23 | const { |
24 | WeightedRoundRobinWorkerChoiceStrategy | |
fa6f1296 | 25 | } = require('../../../lib/pools/selection-strategies/weighted-round-robin-worker-choice-strategy') |
40ad1d27 JB |
26 | |
27 | describe('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 | }) |